You are on page 1of 372

Imgen de portada:

Naturaleza Muerta (leo sobre lienzo)


Pablo Picasso
10 de abril de 1947

Francisco Solsona y Elisa Viso

MANUAL DE SUPERVIVENCIA EN
LINUX
Francisco Solsona
Elisa Viso

Temas de computacion

MANUAL DE SUPERVIVENCIA EN LINUX

uando no estamos a la caza de buena comida cerca de la


Universidad, explorando nuevos sistemas de cmputo,
programando, o dando clases, nos encontrars discutiendo nuevos proyectos e ideas para difundir y ensear computacin. As
nacieron, hace ya ms de un lustro, las ideas plasmadas en el libro
que tienes en tus manos. Por un lado intenta ser un vehculo para
introducirte al mundo del software libre, a Linux y a la programacin y por el otro, un manual de supervivencia y referencia de
aplicaciones tiles para consolidarte como programador.
La vida del computlogo es muy divertida y llena de
emociones al trabajar con aplicaciones de software, sistemas de
cmputo y en general, con nuevas tecnologas. Algunas veces, sin
embargo, moverte en el mundo de posibilidades que ofrece la
computacin es abrumador, sobre todo en el terreno del software
libre. Este libro te ofrece una visin moderna y desenfadada de
Linux, poniendo a tu disposicin una ruta clara en el laberinto de
sus aplicaciones. Fue realizado por programadores entusiastas y
est dirigido a otros programadores entusiastas en busca de algo
ms de lo que los sistemas operativos y herramientas convencionales suelen ofrecer.

Imgen de portada:

Naturaleza Muerta (leo sobre lienzo)


Pablo Picasso
10 de abril de 1947

Francisco Solsona y Elisa Viso

MANUAL DE SUPERVIVENCIA EN
LINUX
Francisco Solsona
Elisa Viso

Temas de computacion

MANUAL DE SUPERVIVENCIA EN LINUX

uando no estamos a la caza de buena comida cerca de la


Universidad, explorando nuevos sistemas de cmputo,
programando, o dando clases, nos encontrars discutiendo nuevos proyectos e ideas para difundir y ensear computacin. As
nacieron, hace ya ms de un lustro, las ideas plasmadas en el libro
que tienes en tus manos. Por un lado intenta ser un vehculo para
introducirte al mundo del software libre, a Linux y a la programacin y por el otro, un manual de supervivencia y referencia de
aplicaciones tiles para consolidarte como programador.
La vida del computlogo es muy divertida y llena de
emociones al trabajar con aplicaciones de software, sistemas de
cmputo y en general, con nuevas tecnologas. Algunas veces, sin
embargo, moverte en el mundo de posibilidades que ofrece la
computacin es abrumador, sobre todo en el terreno del software
libre. Este libro te ofrece una visin moderna y desenfadada de
Linux, poniendo a tu disposicin una ruta clara en el laberinto de
sus aplicaciones. Fue realizado por programadores entusiastas y
est dirigido a otros programadores entusiastas en busca de algo
ms de lo que los sistemas operativos y herramientas convencionales suelen ofrecer.

FRANCISCO SOLSONA

ELISA VISO
(COORDINADORES)

MANUAL

DE

SUPERVIVENCIA
EN

LINUX

MAURICIO ALDAZOSA JOS GALAVIZ IVN HERNNDEZ CANEK PELEZ


KARLA RAMREZ FERNANDA SNCHEZ PUIG FRANCISCO SOLSONA
MANUEL SUGAWARA ARTURO VZQUEZ ELISA VISO

FACULTAD

DE

CIENCIAS, UNAM
2007

Esta obra aparece gracias al apoyo


del proyecto PAPIME PE-100205

Manual de supervivencia en Linux


1 edicin, 2007
Diseo de portada: Laura Uribe

Universidad Nacional Autnoma de Mxico,


Facultad de Ciencias
Circuito exterior. Ciudad Universitaria.
Mxico 04510
cse@fciencias.unam.mx
ISBN: 978-970-32-5040-0
Impreso y hecho en Mxico

ndice general
Prefacio
1. Introduccin a Unix
1.1. Historia . . . . . . . . . . . . . .
1.1.1. Sistemas UNIX libres . .
1.1.2. El proyecto GNU . . . . .
1.2. Sistemas de tiempo compartido . .
1.2.1. Los sistemas multiusuario
1.3. Inicio de sesin . . . . . . . . . .
1.4. Emacs . . . . . . . . . . . . . . .
1.4.1. Introduccin a Emacs . . .
1.4.2. Emacs y t . . . . . . . .

XII

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

1
1
2
3
4
4
5
6
6
7

2. Ambientes grcos en Linux


2.1. Ambientes de escritorio . . . . . . .
2.2. KDE . . . . . . . . . . . . . . . . .
2.2.1. Conguracin de KDE . . .
2.2.2. KDE en 1, 2, 3 . . . . . . .
2.2.3. Quemado de discos con K3b
2.2.4. Amarok . . . . . . . . . . .
2.3. Emacs . . . . . . . . . . . . . . . .
2.4. Comenzando con Emacs . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

9
9
10
10
14
14
18
20
20

3. Sistema de Archivos
3.1. El sistema de archivos . . . . . . . . . . . . . .
3.1.1. Rutas absolutas y relativas . . . . . . .
3.2. Movindose en el rbol del sistema de archivos
3.2.1. Permisos de archivos . . . . . . . . . .
3.2.2. Archivos estndar y redireccionamiento
3.3. Otros comandos de Unix . . . . . . . . . . . .
3.3.1. Sintaxis estndar de comandos . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

23
23
26
27
30
34
37
37

ii
3.4. Agrupando nombres de archivos . . . . . . . . . . . .
3.5. Konqueror: administrador de archivos y algo ms . . .
3.5.1. Iniciando Konqueror . . . . . . . . . . . . . .
3.5.2. Konqueror como administrador de archivos . .
3.5.3. Konqueror como un navegador web . . . . . .
3.5.4. Konqueror como una aplicacin integrada . . .
3.6. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6.1. Ejecutando Emacs desde la lnea de comandos
3.6.2. Conceptos esenciales . . . . . . . . . . . . . .
3.6.3. Dired . . . . . . . . . . . . . . . . . . . . . .
3.6.4. Ejecucin de comandos de Unix desde Emacs .
4. Edicin
4.1. La guerra de los editores de texto . . . . .
4.1.1. Vieja guardia contra nueva guardia
4.2. Kate: un editor para programadores . . .
4.2.1. Introduccin . . . . . . . . . . .
4.2.2. Empezando a utilizar Kate . . . .
4.2.3. Editando archivos . . . . . . . . .
4.3. Emacs . . . . . . . . . . . . . . . . . . .
4.3.1. Comandos . . . . . . . . . . . .
4.3.2. Movimiento . . . . . . . . . . . .
4.3.3. Matando y borrando . . . . . . .
4.3.4. Reencarnacin de texto . . . . . .
4.3.5. Regiones . . . . . . . . . . . . .
4.3.6. Rectngulos . . . . . . . . . . . .
4.3.7. Registros . . . . . . . . . . . . .
4.3.8. Archivos . . . . . . . . . . . . .
4.3.9. Buscar . . . . . . . . . . . . . .
4.3.10. Reemplazar . . . . . . . . . . . .
4.3.11. Guardar . . . . . . . . . . . . . .
4.3.12. Ventanas . . . . . . . . . . . . .
4.3.13. Marcos (frames) . . . . . . . . .
4.3.14. Ayuda en lnea . . . . . . . . . .
4.3.15. Lista de buffers . . . . . . . . . .
4.3.16. Anzuelos (Hooks), setq y otros . .
4.3.17. Ortografa . . . . . . . . . . . . .
4.3.18. Extendiendo Emacs . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

44
45
46
46
48
49
50
50
52
53
54

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

55
55
56
56
56
57
59
64
65
66
67
68
68
68
69
70
70
70
71
71
71
72
72
72
73
74

iii
5. Internet
5.1. Redes de computadoras . . . . . . . . . . . . . . .
5.1.1. Relacin cliente-servidor . . . . . . . . . .
5.1.2. TCP/IP . . . . . . . . . . . . . . . . . . .
5.2. Web . . . . . . . . . . . . . . . . . . . . . . . . .
5.3. Redes y direcciones . . . . . . . . . . . . . . . . .
5.3.1. Domicilios estndar en Internet . . . . . .
5.3.2. Nomenclatura antigua e internacional . . .
5.4. WWW . . . . . . . . . . . . . . . . . . . . . . . .
5.4.1. URL: especicacin de objetos en Internet
5.4.2. Navegadores . . . . . . . . . . . . . . . .
5.4.3. Google . . . . . . . . . . . . . . . . . . .
5.4.4. Wikipedia . . . . . . . . . . . . . . . . . .
5.5. Los programas de correo de Unix . . . . . . . . . .
5.6. Netiquete . . . . . . . . . . . . . . . . . . . . . .
5.6.1. Algunos puntos del netiquete . . . . . . . . .
5.7. KMail: lector de correo electrnico . . . . . . . . .
5.7.1. Introduccin . . . . . . . . . . . . . . . .
5.7.2. Utilizando KMail . . . . . . . . . . . . . .
5.8. FTP . . . . . . . . . . . . . . . . . . . . . . . . .
5.8.1. Qu es un FTP annimo? . . . . . . . . .
5.8.2. Comandos para FTP . . . . . . . . . . . .
5.9. SSH: Secure Shell . . . . . . . . . . . . . . . . . .
5.9.1. Accediendo a sistemas remotos . . . . . .
5.9.2. Copiando archivos entre sistemas . . . . .
5.10. PGP: Pretty Good Privacy . . . . . . . . . . . . .
5.10.1. Funcionamiento de PGP . . . . . . . . . .
5.11. RSS: sistema de noticias . . . . . . . . . . . . . .
5.11.1. Introduccin . . . . . . . . . . . . . . . .
5.11.2. Akregator . . . . . . . . . . . . . . . . . .
5.12. Mensajera instantnea . . . . . . . . . . . . . . .
5.12.1. Introduccin . . . . . . . . . . . . . . . .
5.12.2. Kopete . . . . . . . . . . . . . . . . . . .
5.12.3. Creando cuentas . . . . . . . . . . . . . .
5.12.4. Funciones bsicas . . . . . . . . . . . . . .
5.12.5. Extensiones . . . . . . . . . . . . . . . . .
5.13. Rdesktop: Remote Desktop Protocol Client . . . .
5.13.1. Utilizando Rdesktop . . . . . . . . . . . .
5.14. Kontact, una suite de productividad en KDE . . . .
5.14.1. Resumen . . . . . . . . . . . . . . . . . .
5.14.2. Correo, KMail . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

77
77
78
79
80
81
81
81
82
83
83
85
85
86
87
87
89
89
90
93
93
93
95
96
96
97
98
99
99
99
101
101
101
103
104
105
106
106
106
108
108

iv
5.14.3.
5.14.4.
5.15. Emacs
5.15.1.
5.15.2.
5.15.3.
5.15.4.
5.15.5.
5.15.6.

Contactos, KAddressBook . . . . . . . .
Calendario y pendientes con KOrganizer
. . . . . . . . . . . . . . . . . . . . . . .
VM . . . . . . . . . . . . . . . . . . . .
BBDB . . . . . . . . . . . . . . . . . . .
w3m . . . . . . . . . . . . . . . . . . .
ERC . . . . . . . . . . . . . . . . . . . .
TRAMP . . . . . . . . . . . . . . . . . .
Diccionario . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

108
112
119
121
128
131
136
139
140

6. LATEX
6.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . .
6.2. Componentes de un texto . . . . . . . . . . . . . . . .
6.3. Ambientes para formato . . . . . . . . . . . . . . . .
6.3.1. Posibles errores . . . . . . . . . . . . . . . . .
6.4. Formato general de un documento . . . . . . . . . . .
6.4.1. Cartas . . . . . . . . . . . . . . . . . . . . . .
6.5. Tipos y tamaos de letras . . . . . . . . . . . . . . . .
6.6. Listas de enunciados o prrafos . . . . . . . . . . . . .
6.6.1. Numeraciones . . . . . . . . . . . . . . . . .
6.6.2. Listas marcadas . . . . . . . . . . . . . . . . .
6.6.3. Descripciones . . . . . . . . . . . . . . . . . .
6.6.4. Listas ms compactas . . . . . . . . . . . . . .
6.7. Tablas . . . . . . . . . . . . . . . . . . . . . . . . . .
6.7.1. Multicolumnas . . . . . . . . . . . . . . . . .
6.7.2. Separacin de renglones y columnas . . . . . .
6.7.3. Lneas incompletas verticales y horizontales
6.7.4. Espacio entre los renglones . . . . . . . . . . .
6.8. Matemticas en LATEX . . . . . . . . . . . . . . . . . .
6.8.1. Frmulas matemticas . . . . . . . . . . . . .
6.9. Emacs y LATEX . . . . . . . . . . . . . . . . . . . . . .
6.9.1. Anotaciones en los smbolos . . . . . . . . . .
6.9.2. Arreglos de frmulas . . . . . . . . . . . . . .
6.10. Imgenes y guras . . . . . . . . . . . . . . . . . . .
6.10.1. Tablas, guras, etc. . . . . . . . . . . . . . . .
6.10.2. Cortando guras . . . . . . . . . . . . . . . .
6.10.3. Colores . . . . . . . . . . . . . . . . . . . . .
6.10.4. Dibujando objetos geomtricos . . . . . . . . .
6.10.5. Lneas . . . . . . . . . . . . . . . . . . . . . .
6.10.6. Acomodando objetos . . . . . . . . . . . . . .
6.11. Referencias e ndices . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

143
143
144
145
147
149
152
153
156
157
160
161
163
164
166
168
172
173
174
176
178
192
193
197
197
204
205
207
207
226
231

v
6.11.1.
6.11.2.
6.12. Emacs
6.12.1.
6.12.2.
6.12.3.

Referencias bibliogrcas
ndices . . . . . . . . . .
. . . . . . . . . . . . . . .
AUCTEX . . . . . . . . .
RefTEX . . . . . . . . . .
Preview . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

231
237
237
238
241
242

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

245
246
249
249
250
253
255

8. Herramientas para desarrollo


8.1. Control de versiones . . . . . . .
8.1.1. subversion . . . . . . . .
8.1.2. Introduccin a subversion
8.2. Emacs . . . . . . . . . . . . . . .
8.2.1. JDEE . . . . . . . . . . .
8.2.2. psvn . . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

256
256
256
257
260
260
268

9. Extendiendo tu ambiente
9.1. Programacin en shell . . . . . . . . . . . . . .
9.1.1. Variables . . . . . . . . . . . . . . . .
9.1.2. Preparacin . . . . . . . . . . . . . . .
9.1.3. Vigilando el espacio en disco . . . . . .
9.1.4. Listado de directorios . . . . . . . . . .
9.1.5. Recorridos recursivos . . . . . . . . . .
9.1.6. Comparando archivos . . . . . . . . .
9.1.7. Otra vez el problema de borrar la basura
9.1.8. Para saber ms . . . . . . . . . . . . .
9.2. Emacs . . . . . . . . . . . . . . . . . . . . . .
9.2.1. La madre de todos los lenguajes . . . .
9.2.2. LISP en 15 minutos . . . . . . . . . . .
9.2.3. Resumen . . . . . . . . . . . . . . . .
9.3. Evaluaciones . . . . . . . . . . . . . . . . . .
9.3.1. Nombres de buffers . . . . . . . . . . .
9.4. Deniciones de funciones . . . . . . . . . . . .
9.4.1. defun . . . . . . . . . . . . . . . . . .
9.4.2. let . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

271
271
272
272
273
275
278
283
285
289
289
289
290
298
299
299
301
301
305

7. Lenguajes de marcado
7.1. XML . . . . . .
7.2. HTML . . . . . .
7.2.1. XHTML
7.3. CSS . . . . . . .
7.3.1. Javascript
7.4. Emacs . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

vi

9.5.

9.6.

9.7.

9.8.

9.4.3. La forma especial if . . . . . . . . . . . . . . .


9.4.4. save-excursion . . . . . . . . . . . . . . . . . .
9.4.5. Resumen . . . . . . . . . . . . . . . . . . . . .
Funciones relacionadas con buffers . . . . . . . . . . . .
9.5.1. Denicin (simplicada) de beginning-of-buffer
9.5.2. Resumen . . . . . . . . . . . . . . . . . . . . .
Funciones fundamentales . . . . . . . . . . . . . . . . .
9.6.1. car y cdr . . . . . . . . . . . . . . . . . . . . .
9.6.2. Cortando y guardando texto . . . . . . . . . . .
9.6.3. Inicializacin de variables: defvar . . . . . . . .
9.6.4. copy-region-as-kill . . . . . . . . . . . . . . . .
9.6.5. Resumen . . . . . . . . . . . . . . . . . . . . .
Lluvia de funciones . . . . . . . . . . . . . . . . . . . .
9.7.1. Quin o qu es ASCII? . . . . . . . . . . . . .
9.7.2. Cmo numerar una regin de lneas? . . . . . .
9.7.3. Borrado efectivo de espacios . . . . . . . . . . .
9.7.4. Un ejercicio totalmente intil, o eso parece . . .
9.7.5. Resumen . . . . . . . . . . . . . . . . . . . . .
Para saber ms . . . . . . . . . . . . . . . . . . . . . .

A. Distribuciones de Linux
A.1. Ubuntu . . . . . . . . . .
A.1.1. Filosofa . . . . .
A.1.2. Manejo de software
A.2. Debian . . . . . . . . . . .
A.2.1. Filosofa . . . . .
A.2.2. Manejo de software
A.3. Fedora . . . . . . . . . . .
A.3.1. Filosofa . . . . .
A.3.2. Manejo de software

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

306
307
308
311
311
314
314
315
318
321
322
325
326
326
327
328
330
332
333

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

337
337
337
338
340
340
340
340
340
341

B. Compilando e instalando a pie


343
B.1. Aplicaciones no disponibles . . . . . . . . . . . . . . . . . . . . . . . . . 343
C. Emacs: archivos de conguracin
C.1. /.emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C.2. /.vm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C.3. /.emacs-w3m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

347
347
349
350

ndice de guras
1.1. Acceso al sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Inicio de una sesin en un sistema UNIX. . . . . . . . . . . . . . . . . . .
1.3. Equivocacin al teclear la contrasea. . . . . . . . . . . . . . . . . . . . .
2.1. KControl . . . . . . . . . . .
2.2. Administracin de usuarios . .
2.3. Administracin de contraseas
2.4. Disposicin del teclado . . . .
2.5. KDE . . . . . . . . . . . . . .
2.6. K3b . . . . . . . . . . . . . .
2.7. Quemado de un disco de datos
2.8. Quemado de un disco de audio
2.9. Amarok . . . . . . . . . . . .
2.10. Emacs en el men de KDE . .
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

5
6
6

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

11
12
12
14
15
16
16
18
19
20

Sistema de archivos en un sistema Unix . . . .


Resultado de entubar ls -al con less . . . . . .
Konqueror como un administrador de archivos .
Konqueror con un emulador de terminal . . . .
Konqueror como un navegador de Internet . . .
Konqueror deplegando una imagen . . . . . . .
Konqueror deplegando un documento postscrip.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

25
29
47
48
49
49
50

4.1. Kate en el men de KDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 57


4.2. Ventana de inicio de Kate . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.1.
5.2.
5.3.
5.4.
5.5.
5.6.

Ventana principal de KMail .


Vista principal de Akregator
Kopete en el men de KDE .
Vista principal de kopete . .
Ventana inicial de Kontact .
KAddressBook . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

89
100
103
104
107
109

viii
5.7. Creando una nueva agenda . . . . . .
5.8. Creando una nuevo contacto . . . . .
5.9. Pestaa de detalles . . . . . . . . . .
5.10. KAddressBook con algunos contactos
5.11. KOrganizer . . . . . . . . . . . . . .
5.12. Creando una nuevo evento . . . . . .
5.13. Ajustando la repeticin de un evento .
5.14. Agregando participantes en un evento
5.15. Ajustando la hora de la reunin . . . .
5.16. Vista Qu es lo siguiente? . . . . . .
5.17. Vista Lista . . . . . . . . . . . . . . .
5.18. Vista Da . . . . . . . . . . . . . . .
5.19. Vista Semana laboral . . . . . . . . .
5.20. Vista Semana . . . . . . . . . . . . .
5.21. Vista Tres das siguientes . . . . . . .
5.22. Vista Mes . . . . . . . . . . . . . . .
5.23. El diario dentro de Kontact . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

110
110
111
111
112
113
114
115
116
116
117
117
118
118
119
120
120

6.1. Grco introducido con includegraphics


6.2. Escalando objetos con graphics. . . . . . . . .
6.3. Rotaciones y reejos con graphics . . . . .
6.4. Tomando pedazos de guras . . . . . . . . . .
6.5. Ejemplo de opciones para dibujar . . . . . . . .
6.6. Gracacin de funciones arbitrarias . . . . . .
6.7. Impresin de la retcula . . . . . . . . . . . . .
6.8. Colocacin de los ejes . . . . . . . . . . . . .
6.9. Segunda forma de pintar la retcula . . . . . . .
6.10. Divertimento con slo trazo de lneas . . . . . .
6.11. Dibujo de una grca en LATEX . . . . . . . . .
6.12. Actividad 6.52 . . . . . . . . . . . . . . . . . .
6.13. Ejemplo de LATEX usando BIBTEX
6.14. Salida de LATEX al ejecutar BIBTEX . . . . . . .
6.15. Ejemplo de una base de datos BIBTEX . . . . .
6.16. Ejemplo usando los estilos BIBTEX . . . . . . .
6.17. Preview en accin . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

201
202
203
204
213
221
222
222
223
224
229
231
233
234
235
236
243

7.1. Pgina sin hoja de estilo . . . . . . . . . . . . . . . . . . . . . . . . . . . 251


7.2. Pgina con hoja de estilo . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

ndice de tablas
1.

Convenciones tipogrcas . . . . . . . . . . . . . . . . . . . . . . . . . .

XII

3.1. Comandos de Unix importantes . . . . . . . . . . . . . . . . . . . . . . . . 39


3.2. Emacs: opciones de inicio . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3. Emacs: comandos del modo dired . . . . . . . . . . . . . . . . . . . . . . 53
4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.
4.8.
4.9.

Kate: enlaces de tecla para acceso rpido . .


Kate: opciones para buscar y reemplazar . .
Kate: sangrados disponibles . . . . . . . .
Emacs: comandos de movimiento . . . . .
Emacs: movimiento a lugares especiales . .
Emacs: comandos para matar y borrar . . .
Emacs: comandos para manejar rectngulos
Emacs: comandos para manejar registros . .
Emacs: comandos para revisar ortografa . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

61
63
64
66
67
67
69
69
74

5.1. Dominios de jerarqua superior . . . . . . . . . .


5.2. Servicios comunes de Google . . . . . . . . . . .
5.3. Otros servicios de la Wikipedia . . . . . . . . . .
5.4. Algunos comandos disponibles en el sistema . .
5.5. Emacs: comandos de seleccin de VM . . . . . .
5.6. Emacs: comandos para componer correo en VM .
5.7. Emacs: comandos de Mail . . . . . . . . . . . .
5.8. Emacs: comandos para contestar correo en VM .
5.9. Emacs: comandos para adelantar mensajes de VM
5.10. Emacs: tipos vlidos para campos BBDB . . . .
5.11. Emacs: comandos de BBDB . . . . . . . . . . .
5.12. Emacs: iniciando w3m . . . . . . . . . . . . . .
5.13. Emacs: siguiendo ligas con w3m . . . . . . . . .
5.14. Emacs: navegando con w3m . . . . . . . . . . .
5.15. Emacs: puntos de inters en la pgina ala w3m .
5.16. Emacs: movimiento entre pginas con w3m . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

82
85
86
94
124
125
126
126
127
129
130
131
132
133
133
134

x
5.17. Emacs: manejo de imgenes en w3m
5.18. Emacs: ligas favoritas en w3m . . .
5.19. Emacs: comandos de ERC . . . . .
5.20. Emacs: mdulos para extender ERC
5.21. Emacs: comandos de dictionary . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

135
136
137
138
141

6.1. LATEX: ambientes . . . . . . . . . . . . . . . . .


6.2. LATEX: comandos para modicar espacios . . . .
6.3. Tamaos disponibles para letras . . . . . . . . .
6.4. LATEX: comandos para cambios de tipo de letra . .
6.5. Modicadores para la denicin de columnas . .
6.6. Acentos . . . . . . . . . . . . . . . . . . . . . .
6.7. Smbolos no ingleses . . . . . . . . . . . . . . .
6.8. Smbolos de puntuacin y especiales . . . . . . .
6.9. Smbolos griegos . . . . . . . . . . . . . . . . .
6.10. Smbolos con echas . . . . . . . . . . . . . . .
6.11. Operadores y smbolos relacionales . . . . . . .
6.12. Smbolos varios . . . . . . . . . . . . . . . . . .
6.13. Nombres de funciones comunes . . . . . . . . .
6.14. Smbolos agrandables . . . . . . . . . . . . . . .
6.15. Delimitadores . . . . . . . . . . . . . . . . . . .
6.16. Tipos de letras en modo matemtico . . . . . . .
6.17. Acentos en modo matemtico . . . . . . . . . . .
6.18. Comandos de espacio en modo matemtico . . .
6.19. Posiciones posibles para los otantes . . . . . . .
6.20. Conversin de grados Farenheit a Centgrados . .
6.21. Conversin de Farenheit a Centgrados . . . . . .
6.22. Representaciones numricas . . . . . . . . . . .
6.23. Comparacin de tamaos . . . . . . . . . . . . .
6.24. Paquetes de pgf para colores y dibujos . . . . . .
6.25. Colores bsicos con los que se cuenta . . . . . .
6.26. Modicadores para el trazo de lneas y guras . .
6.27. Opciones de grosor y estilos de lneas . . . . . .
6.28. Ejemplos de guras en TikZ . . . . . . . . . . .
6.29. Lneas dobles . . . . . . . . . . . . . . . . . . .
6.30. Tipos de puntas de echas en TikZ . . . . . . . .
6.31. Figuras geomtricas que se pueden lograr en TikZ
6.32. Gracacin de funciones comunes en TikZ . . .
6.33. Smbolos para marcar curvas que se gracan . . .
6.34. Emacs: comandos de AUCTEX . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
. .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

145
150
154
155
165
175
175
175
179
180
180
182
182
184
186
187
192
196
198
199
200
200
204
205
206
212
213
214
214
215
216
218
219
239

8.1. subversion: comandos ms importantes . . . . . . . . . . . . . . . . . . . 259

xi
8.2.
8.3.
8.4.
8.5.
8.6.

JDEE: abreviaturas de estructuras de control . . .


JDEE: formas para completar campos y mtodos
JDEE: enunciados import . . . . . . . . . . . . .
JDEE: generadores de cdigo, wizards . . . . . .
Emacs: comandos de psvn . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

263
264
264
265
269

9.1. Programacin en shell: variables automticas . . . . . . . . . . . . . . . . 275

Prefacio
Este libro presenta las aplicaciones y el enfoque que un estudiante de computacin o un
futuro programador debe dominar para sacar el mayor provecho de su enseanza profesional en programacin y, en general, en las ciencias de la computacin. Hemos vertido aqu
la experiencia de media docena de aos impartiendo cursos propeduticos de supervivencia
para estudiantes de la licenciatura en ciencias de la computacin de la Facultad de Ciencias
de la Universidad Nacional Autnoma de Mxico.

Convenciones tipogrcas
Tabla 1

Convenciones tipogrcas

Entidad
Enfatizado
itlicas

comando

enunciados

Descripcin
Utilizamos este tipo de letra (font) para enfatizar o resaltar
palabras o frases.
Las utilizamos para modismos, palabras o frases en ingls y
palabras utilizadas en el medio y cuya traduccin o aceptacin en el idioma no es clara.
Los comandos y opciones se muestran as. Cuando encuentres lneas tales como: % comando, stas representan comandos que puedes teclear y ejecutar en una terminal. Por
convencin utilizaremos % para signicar que debe ejecutarse como un usuario no-priviligiado y $ cuando debe ejecutarse como sper-usuario o root.
Utilizaremos este tipo de letra para escribir cdigo que debe
ir en un archivo.
Este smbolo es el logo del ambiente Gnome y sirve para sealar qu aplicaciones para este ambiente son equivalentes
a la revisada en la seccin donde aparece.
Contina en la siguiente pgina

xiv
Tabla 1

Convenciones tipogrcas

Entidad

Contina de la pgina anterior

Descripcin
Este smbolo es el logo del ambiente KDE y sirve para sealar aplicaciones alternativas o similares a la revisada en la
seccin donde aparece.
Este smbolo es el logo del editor Emacs y sirve para sealar
paquetes alternativos o similares al revisado en la seccin
donde aparece.

A quin est dirigido


Este texto est dirigido a estudiantes y profesionales de la computacin o futuros programadores que estn interesados en incursionar en el mundo del software libre, conocer el
sistema operativo Linux y que requieran dominar rpidamente herramientas orientadas al
desarrollo y productividad en este ambiente.
Es un libro prctico, por lo que es importante resaltar que todo lo que se ve en los
distintos captulos puede repetirse en un sistema de cmputo con sistema operativo Linux. Asimismo, los ejercicios en algunas de las secciones son de utilidad para rearmar el
conocimiento y se recomienda realizarlos en el orden presentado.

Distribucin y ambientes
Algunas de
estas notas
muestran
comandos

A lo largo del libro encontrars muchos ejemplos que funcionarn bien en cualquier
distribucin de Linux. Sin embargo, y a pesar de nuestros mejores esfuerzos, hemos incluido aplicaciones que no son parte esencial de las distribuciones de Linux ms utilizadas.
Cada vez que esto sucede te mostramos, en una nota al margen, el comando que debes
ejecutar como sper-usuario para instalar dicha aplicacin.
Para lograr esto, por supuesto, nos hemos visto en la necesidad de utilizar una distribucin y optamos por Ubuntu y como administrador de paquetes utilizamos apt. Por ejemplo,
vers en notas al margen algo parecido a esto:
% smart install kate
lo que constituye (como vers en el Captulo 1) una lnea de comandos que, al ser ejecutada,
se conecta a la red, localiza la aplicacin kate, la descarga a tu computadora y la instala.
En el apndice A se presenta una relacin de algunas de las distribuciones ms importantes en el mercado al momento de la edicin de este libro. En dicho anexo encontrars,

xv
entre otros datos interesantes de cada distribucin, la manera preferida de administrar aplicaciones.
En el apndice B se presentan las opciones que se tienen para instalar paquetes o funciones de tu distribucin favorita. Podrs ver ah cmo compilar para instalar algunos de
los servicios que se presentan en este libro.
Finalmente, en el apndice C colocamos los archivos principales para tu archivo .emacs
que fuimos construyendo a lo largo de este material, as como los archivos necesarios para
correo e internet.

Introduccin a Unix

1.1. Historia
La primera versin de UNIX, llamada Unics, fue escrita en 1969 por Ken Thompson.
Corra en una computadora PDP-7 de Digital. Ms adelante, los laboratorios Bell, el MIT
y General Electric se involucraron en la creacin del sistema Multics, grande en tamao,
y el primer sistema de tiempo compartido que inclua muchas ideas innovadoras acerca
de sistemas operativos. Thompson y algunos de sus colegas admiraban las capacidades de
Multics; sin embargo, pensaban que era demasiado complicado. Su idea era demostrar que
era posible construir un sistema operativo que proporcionara un ambiente de desarrollo
cmodo de una forma ms simple. Y afortunadamente, tuvieron un xito admirable en el
desarrollo de esta idea; a pesar de esto, UNIX es irnicamente mucho ms complicado de
lo que Multics nunca lleg a ser.
En 1970 Thompson, junto con Dennis Ritchie, port UNIX a la PDP-11/20. Ritchie
dise y escribi el primer compilador de C para proveer un lenguaje que pudiera ser usado
para escribir una versin porttil del sistema. En 1973, Ritchie y Thompson reescribieron
el kernel de UNIX, el corazn del sistema operativo, en C.
Inicialmente se otorgaron licencias gratuitas para utilizar UNIX a universidades con
propsitos meramente educativos (en 1974). Esta versin fue la quinta edicin (las ediciones hacen referencia a las ediciones del manual de referencia de UNIX). La sexta edicin
fue liberada en 1975; sin embargo, fue hasta la sptima edicin, liberada por los laboratorios Bell en 1979, donde se logr la meta deseada: portabilidad; esta edicin fue la que
sirvi como punto de partida para la generacin de este nuevo y maravilloso mundo: el
mundo UNIX. sta es considerada la edicin clsica de UNIX. Las dos vertientes ms

Introduccin a Unix

fuertes creadas a partir de esta edicin de UNIX son: System V (no confundirlo con la
quinta edicin) y el sistema BSD (Berkeley Software Distribution).
A pesar de que ambos sistemas surgieron de la misma inuencia y comparten muchas
caractersticas, los dos sistemas se desarrollaron con personalidades muy distintas. System
V es ms conservador y slido; mientras que BSD es ms innovador y experimental. System
V era un sistema comercial, mientras que BSD no.
La historia es mucho ms detallada y an hay mucho que contar acerca del desarrollo
de cada una de estas vertientes, de las cuales surgieron todava muchas vertientes ms de
UNIX.
En el caso de la licenciatura en Ciencias de la Computacin en la Facultad de Ciencias,
como en muchas otras universidades de prestigio, el servicio al que acceden los estudiantes
y la mayora de los profesores es utilizando una implementacin de UNIX, Linux, con
computadoras conectadas en una red, por lo que todo lo que sucede entre los estudiantes y
la computadora ser en el contexto de esta red.

1.1.1.

Sistemas UNIX libres


Los sistemas compatibles UNIX libres1 para la arquitectura i386, notablemente Linux y
FreeBSD, han hecho de UNIX un sistema al alcance de cualquiera. Estos sistemas proveen
excelente rendimiento y vienen con un conjunto de caractersticas y herramientas estndar
de UNIX. Son tan robustos que incluso muchas empresas han basado su desarrollo en
alguno de estos sistemas.
Dado que estos sistemas no contienen software propietario pueden ser usados, copiados y distribuidos por cualquiera (incluso gratis). Las copias de estos sistemas se pueden
conseguir en CD-ROM o bien por medio de Internet.
Linux. Linux es una versin de UNIX libre, originada por Linus Torvalds en la Universidad de Helsinki en Finlandia. Fue inspirado por Minix escrito por Andrew Tanenbaum y sigue ms o menos las convenciones de System V. Su desarrollo ha sido
llevado a cabo por programadores (hackers, wizards) de todo el mundo, coordinados
por Linus a travs de Internet. Una gran cantidad de cdigo incluida en el "sistema
operativo Linux"2 es GNU y la versin de X es XFree86.
Hay varias distribuciones de Linux y algunas de las ms importantes son:
Ubuntu: http://www.ubuntu.com/ (y Kubuntu, la distribucin que utilizamos en
este trabajo: http://www.kubuntu.org/)
Fedora: http://fedora.redhat.com/
1
En este contexto libre, es una traduccin literal de free que no signica gratis, (como en cervezas gratis),
sino signica libre (como en libertad de expresin).
2
Un sistema operativo es un conjunto de programas que controla y administra los recursos de la computadora, como son el disco, la memoria, los dispositivos de entrada y salida.

1.2 Sistemas de tiempo compartido

Debian: http://www.debian.org/
openSUSE: http://www.opensuse.org/
FreeSpire: http://freespire.org/
Linux se distribuye bajo la licencia GPL (General Public Licence), que es conocida
como CopyLeft y que representa gran parte de la idiosincrasia del mundo UNIX libre.
FreeBSD. FreeBSD es derivado del sistema BSD (de la versin 4.4 para ser exactos); fue
creado, igual que Linux, para la arquitectura i386. Su idea fundamental de desarrollo es tener un ambiente estable de desarrollo para esa arquitectura. Est soportado
por un grupo internacional de voluntarios. La gran mayora de los programas que
conforman los sistemas FreeBSD, a diferencia de Linux, estn gobernados por licencias estilo Berkeley, las cuales permiten redistribuciones siempre y cuando el cdigo
incluya una nota reconociendo el derecho de autor de Regents of the University of
California and the FreeBSD project. Algunas otras partes de FreeBSD son GNU y
estn cubiertas por la GPL.
La pregunta ms comn entre usuarios de UNIX en el mundo es: cul es mejor: Linux
o FreeBSD? La respuesta no es clara. Ambos tienen cosas buenas y tal vez la mejor forma
de saberlo es probar ambos.

1.1.2.

El proyecto GNU
El proyecto GNU buscaba desarrollar un sistema compatible con UNIX, totalmente
libre3 . Es operado por la FSF (Free Software Foundation), organizacin fundada por Richard Stallman, quien ha escrito gran parte del cdigo de GNU. GNU es una anagrama
de "GNUs not UNIX". Algunas herramientas invaluables para el trabajo diario de un estudiante de Ciencias de la Computacin (al menos en esta Universidad) que han sido desarrolladas dentro del proyecto GNU son: un editor de texto (Emacs), el compilador de C
(gcc), un depurador (gdb), y versiones de prcticamente todas las herramientas estndar de
UNIX.
Todo el software distribuido por GNU se libera bajo la licencia GPL. De acuerdo con
los trminos de esta licencia, cualquiera puede modicar el software y redistribuir su propia versin. La restriccin principal es que te obliga a redistribuirlo incluyendo el cdigo
fuente, an en el caso de que t hayas hecho las modicaciones.
UNIX es un sistema operativo multi-usuario y multi-tarea, es decir, permite a muchos
usuarios conectarse al sistema y cada uno de estos usuarios puede ejecutar varios programas
a la vez.
3
A varios aos de haber sido creada, lo han logrado. Su nombre es Hurd y promete muchas cosas interesantes en el mundo de los sistemas operativos. Sin embargo, Linux, (que sigue mucha de la losofa de GNU,
pero no es el proyecto GNU), le lleva mucha ventaja. Sin duda alguna sta es una poca interesante para estar
metido en el software libre: nos esperan cosas buenas.

Introduccin a Unix

1.2. Sistemas de tiempo compartido


UNIX es un sistema de tiempo compartido. Esto signica que las computadoras que
trabajan con UNIX pueden aceptar ms de un usuario al mismo tiempo. La computadora
principal (la parte del hardware que ejecuta realmente la mayora del trabajo) recibe el
nombre de computadora antrin. Una de las tareas del sistema operativo es asegurar que
los recursos de la computadora antrin se compartan entre todos los usuarios.
Para trabajar con UNIX normalmente usars una terminal. Una terminal UNIX bsica
consta de una pantalla, un teclado y algunas cosas ms. No obstante, como se ver ms
adelante algunas terminales son ms complejas que otras.
Cada vez que oprimes una tecla, la terminal enva una seal a la computadora antrin.
Como respuesta, esta ltima enva su propia seal de regreso a la terminal, indicndole que
despliegue el carcter correspondiente en la pantalla. UNIX fue congurado de tal forma
que cuando la computadora antrin efecta el eco, puedes ver que lo que teclea se recibe
bien y que la conexin entre la computadora antrin y la terminal est intacta.

1.2.1.

Los sistemas multiusuario


Muchas computadoras antrin estn conectadas directamente a las terminales. No obstante, hay muchos centros de cmputo que ofrecen una variedad de computadoras antrin.
En tales casos, la terminal podra estar conectada a una computadora especial, denominada
servidor.
Casi todas las computadoras antrin cuentan con un teclado y una pantalla, que son
parte de la computadora. Para UNIX, teclado y pantalla son slo otra terminal. Sin embargo,
dichas partes reciben el nombre especial de consola.
Un sistema UNIX clsico puede usar una computadora antrin que se encuentre en la
ocina del administrador del sistema. Dicha computadora podra estar conectada a una sala
llena de terminales o computadoras al otro extremo del corredor o en otro piso e incluso en
otro edicio.
Bsicamente, todos los sistemas UNIX aceptan varios usuarios a la vez. No obstante,
algunas computadoras UNIX slo pueden ser usadas por una persona simultneamenente
y son mejor conocidas como estaciones de trabajo4 .
4
Esto no signica que la estacin de trabajo no tenga capacidades multiusuario o multitarea; la estacin
de trabajo es una mquina con capacidades limitadas tanto en espacio en disco como en velocidad de procesamiento, razn por la cual es conveniente que slo una persona la utilice.

1.3 Inicio de sesin

1.3. Inicio de sesin


Dentro de los sistemas UNIX, todos los usuarios del sistema, sea ste uniusuario o
multiusuario, se identican con un nombre de usuario, tambin conocido como su login o
logname, que ser provisto por el administrador del sistema. La clave de usuario generalmente est relacionada con el nombre y apellido del usuario. Dos usos comunes es la de
dar al usuario la primera letra de su nombre junto con su apellido, o las tres iniciales de su
nombre y dos apellidos. Por ejemplo, supongamos que el nombre completo de un usuario
es Juan Prez y su nombre de usuario podra ser juan o jp. En este libro, utilizaremos juan
como tu nombre de usuario.
Para usar un sistema UNIX, en primer lugar debes iniciar una sesin con un nombre
de usuario; el sistema pedir este nombre por medio del programa login; debers teclear la
clave que te fue asignada, respetando minsculas y maysculas5 . Al terminar con los carcteres que componen tu clave, debers oprimir la tecla Enter , para que el sistema reciba
la clave y la procese. Supongamos que la clave de acceso es juanPerez123. La pantalla de
la computadora se ve como en la gura 1.1, esperando a que le des la contrasea correcta.

Figura 1.1 Acceso al sistema.


Red Hat L i n u x r e l e a s e 6 . 2 ( Zoot )
K e r n e l 2.2.14 5.0 on an i 6 8 6
l o g i n : juan
Password :

En este punto del proceso de iniciar una sesin, debers teclear la contrasea de acceso
que tienes registrada en el sistema. Nota que, por seguridad, la contrasea no se muestra
en la pantalla, por lo cual se deber teclear con cuidado, tambin respetando maysculas y
minsculas. Si la clave de acceso corresponde con la registrada en el sistema, podrs iniciar
una sesin.
Si Juan ingresa correctamente su contrasea, la pantalla de la computadora lucir como
en la gura 1.2, donde estNum es el nombre de la computadora en la que se est iniciando
la sesin. La forma precisa de cmo aparece la combinacin del nombre del usuario y el
nombre de la mquina puede variar, pero usualmente aparecen en donde el sistema espera

UNIX es sensible al uso de maysculas y minsculas.

Introduccin a Unix

que le des instrucciones una vez iniciada la sesin.


Figura 1.2 Inicio de una sesin en un sistema UNIX.
Fedora Core r e l e a s e 2 ( Tettnang )
K e r n e l 2.6.5 1.385 on an i 6 8 6
l o g i n : juan
Password :
L a s t l o g i n : Tue Nov 28 11 : 2 0 : 5 4 from bar . f c i e n c i a s . unam . mx
[ juan@estNum j d] %

Es comn equivocarse al teclear la contrasea. Si esto sucede, el sistema responder


con un mensaje de contrasea invlida y proceder a pedirte nuevamente el inicio de sesin,
desde la clave de usuario:
Figura 1.3 Equivocacin al teclear la contrasea.
I n c o r r e c t password . Try again
login :

Puedes corregir la contrasea mientras no hayas oprimido la tecla Enter , si oprimes simultneamente las teclas Control u 6 , lo que borra todos los carcteres tecleados hasta
ese momento y puedes volver a empezar a teclearla. Esto es conveniente por dos razones: la
primera de ellas, para ahorrarte el tener que volver a teclear la clave de usuario y la segunda
porque el sistema te dar un nmero mximo de oportunidades (generalmente entre tres y
cinco) para entrar en sesin, por lo que es deseable evitar introducir mal la contrasea.

1.4. Emacs
1.4.1.

Introduccin a Emacs
Emacs es un editor de pantalla avanzado, autodocumentado, congurable, extensible
y de tiempo real.
Decimos que Emacs es un editor de pantalla porque normalmente el texto que queremos editar es visible en la pantalla y se actualiza automticamente mientras tecleas los
comandos; es por esto ltimo que decimos que es de tiempo real. El nombre Emacs fue
escogido como abreviatura de Editor MACros.
6

Usaremos en adelante la notacin C-u , que deber leerse como control u, para denotar la combinacin
de la tecla Control oprimida al mismo tiempo que u .

1.4 Emacs

C-h es

Control
junto con h

1.4.2.

Decimos que es avanzado porque tiene muchas ms funciones de las que comnmente
encontramos en editores de pantalla, como son control de subprocesos, facilidades para la
edicin de archivos fuente de varios lenguajes de programacin, as como una gran cantidad
de utileras para hacer nuestra vida ms fcil.
El que sea auto-documentado signica que en cualquier momento puedes teclear una
secuencia especial, que es C-h, y saber cules son tus opciones; tambin puedes encontrar
qu hace cualquier comando o encontrar documentacin especca de un tema.
El que sea congurable signica que puedes cambiar las deniciones de los comandos
de Emacs, es decir, controlar su comportamiento para que se adapte a tus necesidades o tus
preferencias.
Extensible signica que puedes ir ms all de la simple conguracin y escribir comandos completamente nuevos, usando un lenguaje de programacin llamado Emacs-Lisp, del
cual tambin aprenders algo en estas notas en la Seccin 9.2.

Emacs y t
Si hay algo que debes aprender y atesorar de este libro, es Emacs. Una situacin que le
ocurre a todas las aplicaciones de software en Linux y en prcticamente cualquier sistema
operativo es que pasan de moda, pierden vigencia rpidamente. Es probable incluso que
para el momento que leas algunos captulos de este trabajo, las aplicaciones aqu revisadas
hayan sido reemplazadas por otras o que existan versiones nuevas y, con alta probabilidad
por desgracia, sern distintas.
Emacs tiene una historia de muchos aos, ms de tres dcadas en circulacin, y algo
importante es que no ha cambiado signicativamente y, estamos seguros, ser el caso en
este momento que t te inicias en Emacs. Esto es importante porque la inversin intelectual
que realizas al aprender y dominar este editor te redituar por muchos aos.
Por este motivo, a lo largo de todo el libro, encontrars una seccin titulada as: Emacs.
En cada una de estas secciones te mostraremos qu hace tan interesante a este editor y
descubriremos juntos muchas de las tareas que pueden atenderse a travs de Emacs, por
ejemplo: editar diversos archivos, programar en distintos lenguajes, acceder a tu correo
electrnico, entre otras acciones y todo esto al mismo tiempo.
Si bien es cierto que puedes ejecutar distintas aplicaciones (explicadas en este mismo libro) para realizar muchas tareas de manera simultnea, cuando utilizas Emacs para
realizar algunas o todas esas tareas, obtienes ciertas ventajas: memoria compartida, un excelente sistema de respaldo para copiar, pegar o reordenar datos, entre otras ventajas. Tu
productividad se incrementar notablemente, te lo garantizamos.

Ambientes grcos
en Linux

2.1. Ambientes de escritorio


Un escritorio ofrece una interfaz grca de usuario1 para interactuar con la computadora. La otra opcin para interactuar con la computadora es mediante una interfaz de lnea
de comandos2 . Para la mayora de las personas el escritorio ms comn es Windows de
Microsoft, para otras cuantas MAC OS. En Linux se tienen muchos escritorios que puedes
utilizar en tu computadora. La base de todos estos escritorios es el sistema de ventanas
X, que es un sistema que provee los elementos bsicos para que se dibujen las ventanas y
se interacte con ellas. La interaccin ms comn entre el servidor de X y el usuario es
cuando el cliente est corriendo en la misma computadora que el servidor. Esto es lo que
ocurre cuando inicias tu computadora de forma normal. Existen otras posibilidades como
exportar todo tu escritorio desde otra computadora o exportar algunas ventanas.
Tomando como base a X, existen varios escritorios para Linux. Como en la mayora de
las aplicaciones en UNIX, existen ms de una para realizar la misma tarea. Algunos de los
ms comunes son:
KDE
GNOME
1
2

GUI, del ingls Graphic User Interface


CLI, del ingls, Command Line Interface

10

Ambientes grcos en Linux

Enlightenment
Xfce

2.2. KDE
KDE es un escritorio libre para estaciones de trabajo UNIX. La motivacin de los desarrolladores es tener un escritorio para UNIX con el que sea fcil trabajar, y que tenga una
aplicacin equivalente a las disponibles en los sistemas operativos propietarios. KDE hace
uso de QT, una caja de herramientas (toolkit) grco de la compaia Trolltech. Cuando
se tom esta decisin en 1996, por el autor Matthias Ettrich3 , hubo varias crticas por esa
decisin. El problema es que en esas fechas QT no tena una licencia de software libre y
a la gente del proyecto GNU le preocupaba que se usara algo as para crear un escritorio
que quera ser libre. Dada esta situacin se inici otro proyecto, GNOME, que no hara uso
de QT y sera totalmente libre. En Noviembre de 1998 Trolltech cre una nueva licencia Q
Public License bajo la cual distribua a QT. Finalmente en Septiembre del 2000, Trolltech
liber la versin de QT para UNIX bajo la GPL, adems de la QPL, por lo que ahora KDE
es totalmente libre.

2.2.1.

Conguracin de KDE
El comportamiento de KDE lo puedes congurar mediante el uso del centro de control
de KDE, el cual puedes ejecutar mediante el comando kcontrol. Para ejecutar una aplicacin sin tener que hacer uso de la consola puedes utilizar el atajo por omisin Alt+F2. En
la gura 2.1 se muestra la ventana inicial del centro de control, dividida en 2 secciones. En
la seccin 1 se muestran las categoras mediante las cuales se puede congurar a KDE. En
la seccin 2 se presenta la informacin pertinente al mdulo que se est congurando. Al
iniciar, KControl nos presenta en esta seccin cierta informacin elemental:
1.
2.
3.
4.
3

Versin de KDE
Nombre del sistema
Nombre del usuario
Versin del ncleo del sistema

El correo que inici todo lo puedes ver en


http://groups.google.com/group/de.comp.os.linux.misc/msg/cb4b2d67ffc3ffce

13

2.2 KDE

Escritorios mltiples
Accesos rpidos
En la categora Regional y Accesibilidad, se encuentra el mdulo Accesos rpidos de
teclado. Mediante ellos es posible asociar una accin a una combinacin de teclas. Es de
esa forma que al presionar las teclas Alt+Tab cambias de una ventana a otra. Existen varias
combinaciones predeterminadas como Alt+F4 para cerrar una ventana. Desde aqu puedes
crear combinaciones de teclas para ejecutar tus acciones ms comunes sin tener que separar
las manos del teclado.

Internacionalizacin
Hay ocasiones en las que puedes desear tener ms de una idioma congurado en tu
sistema. De esa forma puedes hacer que KDE despliegue todos sus mensajes en el idioma
de tu preferencia. Para poder hacer eso es necesario que instales el paquete de internacionalizacin de KDE que corresponde al idioma que quieres utilizar. El nombre de estos
paquetes es de la forma kde-i18n-XX en donde XX es el cdigo de dos letras para el idioma que quieres instalar. Para espaol el nombre del archivo es kde-i18n-es mientras que
para italiano es kde-i18n-i t. Para instalar dicho paquete es necesario que ejecutes apt-get
install kde-i18n-es. Una vez hecho eso puedes regresar al centro de control y dentro de
la categora Regional y Accesibilidad, en el mdulo Pas/Regin e idioma podrs agregar el
idioma que acabas de instalar.

Disposicin del teclado


Adems de cambiar el idioma con el que se presenta KDE, tambin puedes cambiar
la disposicin del teclado. De esa forma es posible que tu teclado se comporte como si
fuera un teclado en un idioma distinto. Para hacer eso es necesario que vayas a la categora Regional y Accesibilidad y ah vayas al mdulo Disposicin del teclado, tal como se
muestra en la gura 2.4. Debers seleccionar la opcin Activar diseos de teclado y luego
seleccionar los idiomas que deseas en tu teclado. En la pestaa Opciones de cambio puedes
seleccionar cmo quieres que KDE te muestre la bandera que corresponde al teclado que
ests utilizando. Adems puedes seleccionar si cada vez que cambias la disposicin del teclado afecta a todas las aplicaciones o slo a la aplicacin que est activa en el momento en
el que realizas el cambio. Para cambiar la disposicin del teclado de forma rpida puedes
usar el atajo por omisin de KDE que es CTRL+ALT+K; o si seleccionaste la opcin para
mostrar la bandera, puedes hacer click sobre ella.

15

2.2 KDE

provee al usuario de una interfaz sencilla para poder quemar CD o DVD. Hay que sealar
que K3b es slo la interfaz grca ya que el trabajo real lo llevan a cabo las aplicaciones
cdrecord, cdrdao y growisofs. En la gura 2.6 se muestra la ventana inicial de K3b.

Figura 2.5 El escritorio

Quemado de un disco de datos


Al seleccionar la opcin Nuevo proyecto de CD de Datos, K3b te presenta con una interfaz para navegar el sistema de archivos y seleccionar cules archivos son los que deseas
incluir en tu CD. Para agregar un archivos nuevo a la compilacin slo es necesario encontrarlos en el navegador que est en la parte superior y seleccionarlo, como se muestra en la
gura 2.7. Otra opcin es arrastrarlos desde Konqueror o desde el escritorio hacia la parte
baja de K3b.

17

2.2 KDE

portantes son Grabando y Descripcin del volumen. En la primera es necesario seleccionar


cul dispositivo se va a usar para quemar el disco y a qu velocidad, qu modo de grabacin
y qu opciones queremos emplear. En los modos de grabacin puedes seleccionar uno de
los siguientes:
DAO
Disc at once, copia todo el disco en una sola pasada.
TAO
Track at once, genera pausas entre cada una de las pistas del disco.
En bruto No procesa los datos (til para copiar imgenes).

Entre las opciones que puedes seleccionar estn:


Simular No lleva a cabo la copia, slo la simula, para ver si no hay problemas.
Al vuelo Copia los datos directamente, sin generar una imagen intermedia.
Slo crear imagen En lugar de quemar el disco crea una imagen, para ser quemada posteriormente.
Eliminar imagen Si se cre la imagen para quemarla, se puede eliminar una vez completado el proceso.
Vericar los datos grabados Una vez terminado el proceso de quemado, se comparan los
datos para ver que hayan sido copiados exitosamente.

En la pestaa Descripcin del volumen puedes ingresar los datos con los que quieres
que se identique al disco. Puedes ingresar la etiqueta del disco, el nombre de la persona
que prepar los datos, el nombre de la persona que los edit, en qu sistema operativo se
realiz la copia y con qu aplicacin.

Quemado de un disco de msica


Al seleccionar la opcin Nuevo proyecto de CD de audio, K3b te presenta una interfaz
similar a la utilizada para quemar datos; la diferencia es cmo presenta la informacin que
quieres quemar en el disco. Ahora presenta cada uno de los tracks que quieres grabar y la
duracin de cada uno de ellos, como se muestra en la gura 2.8. Para poder utilizar archivos
mp3 dentro de k3b es necesario instalar una biblioteca adicional. Debes instalar el paquete
libk3b2-mp3, y lo haces con el comando sudo apt-get install libk3b2-mp3. El resto de
las opciones para grabar son similares a las presentadas cuando quemas un disco de datos.

2.4 Comenzando con Emacs

21

muchas implementaciones de editores parecidos a Emacs.


La versin ms importante y reconocida de Emacs es la del proyecto GNU5 , la cual,
junto con XEmacs6 otra versin muy popular y completa de Emacs son las opciones
ms comunes hoy en da; si tu sistema operativo es algn Unix de distribucin libre (Linux,
FreeBSD, Hurd, etc.) muy probablemente ya tienes instalado uno o ambos editores.
El lugar usual para Emacs en el men de KDE es en la seccin de desarrollo, rearmando que Emacs es una buena opcin para desarrolladores y diseadores de sistemas.

Para mayor informacin sobre Emacs y el proyecto GNU, visita http://www.gnu.org.


XEmacs es otra versin de Emacs. Su nfasis est en el soporte de interfaces grcas de usuario. Algunos
de los autores del presente trabajo usamos XEmacs y otros Emacs; sin embargo, prcticamente todo lo que
veremos aqu puede ser usado, sin cambio alguno, en ambas versiones. Si quieres ms informacin sobre
XEmacs visita el sitio, http://www.xemacs.org.
6

Sistema de
Archivos

3.1. El sistema de archivos


El sistema de archivos de Unix es la forma en la que los usuarios y el sistema operativo
organizan su informacin. ste consiste de un conjunto de archivos, cada uno de los cuales
tiene un nombre llamado nombre de archivo. Hay tres clases de archivos:
Archivos regulares, que contienen informacin.
Directorios1 , que contienen un conjunto de archivos. Los conjuntos de archivos se
identican por el nombre del directorio que los agrupa.
Archivos especiales de varias clases:
Archivos especiales de dispositivo, que proveen acceso a dispositivos tales como terminales o impresoras.
Archivos especiales FIFO (First In First Out, cola), algunas veces llamados
named pipes, que proveen un canal para comunicacin entre procesos independientes y que tienen un nombre asociado.
Como la mayora de los sistemas operativos modernos, Unix organiza su sistema de
archivos como una jerarqua de directorios. La jerarqua de directorios es un rbol (tree),
pero dibujado como un rbol de cabeza o de lado. Un directorio especial, root, es la
1

Los directorios tambin se conocen como carpetas.

24

Sistema de Archivos

raz de la jerarqua. Ms adelante veremos comandos para navegar y modicar el rbol de


directorios.
Un directorio puede contener subdirectorios, archivos regulares y archivos especiales.
Unix trata a los subdirectorios como tipos particulares de archivos. Si uno despliega los
contenidos de un directorio, los subdirectorios se listan junto con los dems archivos.
Unix ve a un archivo, no importando su tipo, como una sucesin de bytes, almacenados
en dispositivos externos como un disco duro, un diskette, un CD, un DVD o una unidad de
almacenamiento USB. Los programas que usan al archivo identican cualquier estructura
interna que el archivo pueda tener.
Un nombre de archivo puede tener hasta 255 carcteres en la mayora de los sistemas;
antes se limitaba el tamao de un nombre a 14 carcteres.
El nombre de un archivo puede contener cualquier carcter excepto / o el carcter
nulo; sin embargo, algunos otros como & y (espacio en blanco) pueden causar problemas por sus signicados especiales para su interpretacin en la lnea de comandos. Si tu
sistema permite carcteres fuera del conjunto ASCII, tales como letras acentuadas (como
nuestra letra ), tambin se puedes usarlas para nombrar archivos. Los nombres de archivos
son sensibles a las maysculas y minsculas, esto es, archivo y Archivo identican a dos
archivos distintos. Por convencin, los archivos cuyo nombre comienza con un punto (.),
llamados dot les, por lo general se usan como archivos de conguracin para programas.
Algunos programas esperan que sus archivos de entrada y salida estn compuestos de un
identicador seguido de un punto y luego una extensin. En general es una convencin muy
til para el usuario utilizar extensiones en los nombres de sus archivos para identicarlos
fcilmente. Por ejemplo:
txt
Se reere a archivos de texto
jpg Se reere a imgenes en formato JPEG
java Programas de Java
cc
Programas de C++
tex Documentos para LATEX
c
Programas de C
En el caso de los sistemas Unix, el nmero de carcteres en la extensin no est limitado, ms que en cuanto a que el nombre total del archivo no puede tener ms de 255
carcteres.
En Unix, como ya mencionamos y al igual que en otros sistemas operativos, los archivos
se almacenan en una estructura jerrquica de rbol, cuyo primer nivel es el directorio raz, el
cual se denota por el carcter /. Dicho directorio almacena todos los archivos del sistema,
que a su vez pueden ser directorios.
En los sistemas Unix, cada usuario tiene un directorio personal, en el cual almacena
sus archivos. Dicho directorio se conoce como el hogar (home). Una vez que entres en
sesin, cada programa que se ejecuta se encuentra situado en un directorio de trabajo. El
shell inicia, por omisin, en el directorio hogar del usuario. Un ejemplo simplicado de un

25

3.1 El sistema de archivos

directorio en un sistema Unix se muestra en la gura 3.1. En esta gura encerraremos en


valos a los directorios y en rectngulos a los archivos. Mostramos puntos suspensivos
cuando suponemos que en ese lugar aparecen un nmero considerable de archivos y/o
directorios, pero por falta de espacio no los mostramos.

Figura 3.1 Sistema de archivos en un sistema Unix


arch
ash
bin
rm
zsh-3.0.7
MAKEDEV
dev
zqft3

.emacs

algoritmos
elisa
capit1

/
varios
home

tareas

Tarea1

fulano

vaz

sbin

win98

26

3.1.1.

Sistema de Archivos

Rutas absolutas y relativas


Las rutas son expresiones que se usan para identicar un archivo o un conjunto de archivos. Se construyen bajando por el rbol del sistema de archivos, como el que se muestra
en la gura 3.1.
Para referirse al directorio raz se utiliza el carcter /; a partir del directorio raz se
puede descender en la jerarqua de directorios, siguiendo ramas del rbol, hasta llegar al
archivo o directorio deseado, separando cada directorio con el carcter /. Por ejemplo,
para referirse al archivo llamado ash que se encuentra en el directorio bin, podemos usar
la ruta /bin/ash.
Cuando se hace referencia a un archivo o directorio a partir del directorio raz utilizando
una ruta, se dice que es una ruta absoluta. No es necesario referirse a un archivo o directorio
a partir de la raz, sino que tambin se puede hacer a partir del directorio de trabajo, es decir,
en el directorio en el que el usuario se encuentra parado. Cuando una referencia a un archivo
o directorio se hace a partir del directorio de trabajo, se dice que es una ruta relativa.
La forma de presentar una ruta relativa es similar a la usada por las rutas absolutas, con
la diferencia de que al principio no se pone el smbolo /. As, el descenso en la jerarqua
por las ramas del rbol no se lleva a cabo a partir de la raz sino a partir del directorio de
trabajo. Por ejemplo, supn que tu clave de usuario es fulanito y tu directorio hogar es
/home/fulanito. Al iniciar una sesin te encontrars en este directorio. Supongamos que te
quieres referir al archivo Tarea1 que est en el directorio tareas de tu propio directorio.
Dicho archivo se representa usando la ruta absoluta
/home/fulanito/tareas/Tarea1
y usando una ruta relativa
tareas/Tarea1.
El directorio actual se denota por . y su padre se llama ... Haciendo uso de dicha
notacin puedes usar trayectorias que vayan hacia arriba o hacia abajo en la jerarqua de
directorios. Siguiendo con el ejemplo anterior, si el directorio de trabajo es /home/fulanito/tareas, entonces la ruta relativa del archivo Ejemplo.java en el directorio algoritmos
del usuario fulanito es
../algoritmos/Ejemplo.java
El signicado de esta ruta es: Estando en el directorio tareas vamos al padre del mismo
que es fulano utilizando ... De ah bajamos por la rama algoritmos. Siguiendo esa ruta
es que encontramos al archivo Ejemplo.java. A esta ruta relativa es equivalente la ruta
absoluta
/home/fulano/algoritmos/Ejemplo.java
Nota que si el usuario se encontrara en otro lugar del rbol, la ruta relativa para alcanzar
a Ejemplo.java sera otra. Es, precisamente, relativa al punto en el rbol en el que se
encuentre el usuario.

3.2 Movindose en el rbol del sistema de archivos

27

Dado que el concepto de directorio base o home es tan importante, hay una notacin
especial para l, reconocida por cualquier intrprete de comandos de Unix excepto Bourne:
el carcter al inicio de una trayectoria se reere al directorio home del usuario actual,
mientras que vaz hace referencia al directorio home del usuario vaz. Tambin utilizaremos esa notacin extensamente. Por ejemplo, para el usuario elisa, /alguno.txt se
reere al archivo /home/elisa/alguno.txt.
Una notacin menos conveniente para referirte al directorio home es $HOME, que nos
regresa el valor de la variable de ambiente HOME que cualquier intrprete de comandos,
incluyendo Bourne, soporta. Por lo tanto, $HOME/alguno.c se reere al archivo alguno.c
en tu directorio home.
El sistema de archivos de Unix se puede dividir en distintos discos o particiones de
un mismo disco o incluso en distintos medios de almacenamiento. El sistema de archivos
se encarga de hacer esto transparente a los usuarios, haciendo parecer que todo vive en el
mismo lugar. Existen distintas razones para hacer esto:
Los discos y dems dispositivos que contienen los directorios y sus archivos pueden
ser insucientes para mantener la jerarqua completa, as que puede surgir la necesidad de distribuir la jerarqua en varios dispositivos.
Para conveniencia en la administracin, puede ser til partir un disco muy grande en
varias particiones.
Los dispositivos de almacenamiento pueden no estar permanentemente unidos a la
computadora. Un disco exible puede contener su propia estructura de directorios.
El sistema de archivos de red permite que si las computadoras estn conectadas entre
s tengan un sistema de archivos compartido.
Unix acomoda los sistemas de archivos externos asocindoles puntos de montaje. Un
punto de montaje es un directorio en un sistema de archivos que corresponde al directorio
raz del sistema de archivos externo. El sistema de archivos primario es el que emana del
directorio raz real y se llama /. Un sistema de archivos externo se liga al sistema primario
por medio del comando mount. Generalmente, todo esto es transparentes para los usuarios
comunes, as que no debes preocuparte demasiado al respecto, aunque es bueno saberlo.

3.2. Movindose en el rbol del sistema de archivos


Por omisin, el shell no muestra en qu directorio ests trabajando. Es conveniente
poder preguntar cul es el directorio de trabajo (o directorio actual) y esto se hace con el
comando:
pwd
(Print Working Directory), a lo que el sistema responde con la ruta absoluta del directorio
en el que te encuentras.

28

Sistema de Archivos

Para cambiarte de directorio puedes utilizar rutas relativas, si es que a donde te quieres
mover est hacia abajo en el rbol desde el directorio de trabajo; o bien, utilizar una ruta
absoluta para moverte arbitrariamente a cualquier otro directorio de trabajo. El comando
que te permite cambiar de directorio de trabajo es
cd [ruta]
(Change Directory). Es importante mencionar que no te puedes mover a un archivo, sino
nicamente a un directorio. Esto es porque al moverte, lo que se pretende es cambiar de
directorio de trabajo.
Por ejemplo, si estando en el directorio de trabajo home quieres ubicarte en el directorio varios del usuario elisa, lo puedes hacer de las dos maneras siguientes:
cd elisa/varios/
cd /home/elisa/varios/
El primer comando usa una ruta relativa, mientras que el segundo comando usa una ruta
absoluta.
Actividad 3.1 Cmbiate a los siguientes directorios. Despus de cada cambio, pregunta
por el directorio de trabajo:
(a) Directorio raz
(b) Directorio sbin
(c) Directorio hogar con tu clave
Para listar el contenido de un directorio usaa:
ls [parmetros] [ARCHIVOS]
Ambos modicadores se pueden omitir. Los [parmetros] se reeren al formato que
puedes querer para la lista de archivos, mientras que [archivos] se reere al lugar en el
rbol del sistema de archivos del que quieres la lista. Si omites los [parmetros] la lista
que se muestre ser breve, sin mayor informacin ms que el nombre del archivo o de los
archivos del directorio de trabajo. Dos de los parmetros ms comunes se reeren a pedir
una lista extendida, que contenga, entre otra informacin, el tipo de archivo, su dueo, su
tamao, el da de su ltima modicacin. Puedes querer que se listen tambin aquellos
archivos que empiezan con algo que no es una letra, como un punto. Para ello, tecleamos
el comando de la siguiente manera:
ls -al /home/fulanito/
y se mostrar en pantalla la lista de archivos y directorios que se encuentran en el directorio
/home/fulanito/, pero nicamente los que cuelgan directamente de ese nodo. Si omites
[archivos], la lista que se dar ser de los archivos y directorios inmediatamente colgando
del directorio de trabajo.
Actividad 3.2 Pide la lista breve de archivos que se encuentran en /usr/local/

29

3.2 Movindose en el rbol del sistema de archivos

Actividad 3.3 Pide la lista extensa de archivos que se encuentran en /bin/. Cul es la
informacin que aparece?
Como puedes ver de la actividad anterior, muchas veces los archivos y directorios en
un directorio son tantos, que si pides la lista extensa pudieses no alcanzar a verla completa. Para ello, haces lo que se llama entubar (en ingls, pipe), que consiste en redirigir la
salida de un comando y usarla como entrada de un segundo comando. Quieres que el segundo comando sea uno que nos ensee la informacin por pginas. Tenemos dos de estos
comandos, que se usan precedidos por el smbolo de entubamiento |:
less
more
Si utilizas el comando less para entubar:
fulanito@[estnum fulanito] % ls -al /bin | less
la respuesta se muestra por pginas, esto es, muestra el nmero de renglones que le cabe
en la pantalla, y se espera en la parte inferior de la misma a que teclees un espacio o que
oprimas la tecla AvPg , para seguir con la siguiente pgina. Si tecleas q , el listado se
suspende.
Veamos el resultado que se te muestra con el comando anterior en la gura 3.2 .
Si el comando que se utiliza es less, entonces se podr regresar sobre el listado, oprimiendo RePg ; y avanzar tecleando espacio o AvPg .
Tambin puedes entubar a que vaya a la impresora, si es que hay alguna conectada
accesible, con el comando lpr.
Actividad 3.4 Utiliza el comando less para entubar el listado del directorio /usr/bin y d
cmo responde.

Figura 3.2 Resultado de entubar ls -al con less


t o t a l 6364
drwxrxrx
drwxrxrx
rwxrxrx
rwxrxrx
rwxrxrx
rwxrxrx
lrwxrwxrwx
rwxrxrx
rwxrxrx
rwxrxrx
lrwxrwxrwx
rwxrxrx

2
22
1
1
1
1
1
1
1
1
1
1

root
root
root
root
root
root
root
root
root
root
root
root

root
root
root
root
root
root
root
root
root
root
root
root

4096
4096
2612
60592
263064
9968
4
5756
316848
446800
3
9528

Apr
Jun
Mar
Feb
Feb
Feb
Feb
Mar
Feb
Feb
Feb
Feb

19 2000 .
6 05:08 . .
7 2000 arch
3 2000 ash
3 2000 ash . s t a t i c
3 2000 aumixminimal
17 2000 awk > gawk
7 2000 basename
27 2000 bash
2 2000 bash2
17 2000 bsh > ash
7 2000 c a t
Contina en la siguiente pgina

30

Sistema de Archivos

Figura 3.2 Resultado de entubar ls -al con more


rwxrxrx
rwxrxrx
rwxrxrx
rwxrxrx
rwxrxrx
rwxrxrx
l i n e s 118

3.2.1.

1
1
1
1
1
1

root
root
root
root
root
root

root
root
root
root
root
root

Contina de la pgina anterior


12044
13436
11952
49680
33392
45712

Mar
Mar
Mar
Mar
Mar
Feb

7
7
7
6
7
9

2000
2000
2000
2000
2000
2000

chgrp
chmod
chown
c on s ol e c h a r s
cp
cpio

Permisos de archivos
Los permisos de acceso a un archivo, o simplemente permisos, especican quin puede
hacer qu a un archivo. Los permisos de un archivo son asignados por su dueo y se pueden
ver con el comando ls -l y modicarlos con el comando chmod.
Dado que los permisos de un archivo son un atributo del archivo mismo, todas las ligas
a ese archivo tienen los mismos permisos.

Permisos para operaciones bsicas


Las tres operaciones bsicas que puedes llevar a cabo en un archivo son lectura (read ),
escritura (write) y ejecucin (execute). Los permisos requeridos para realizar estas operaciones estn denotados por r, w y x respectivamente. El permiso x es necesario para
programas compilados y cualquier guin de shell que intentes usar como comando. Por
ejemplo, si el archivo qq contiene un guin de shell pero no tiene el permiso x, no puedes
ejecutar el comando qq por s mismo. Si lo intentas, obtendrs un mensaje de error como:
command not found: qq
Sin embargo, puedes ejecutar qq con el comando
sh qq
aun cuando qq no tenga permiso de ejecucin. En este ejemplo tambin necesitas que el
archivo qq tenga permisos de lectura para poder ejecutar el script ya sea directa o indirectamente.
Los permisos r, w y x pueden especicarse independientemente para el dueo del archivo, para aquellos que se encuentran en el mismo grupo que el dueo y para todos los dems.
Estas clases estn representadas simblicamente por u (user), g (group) y o (others).
Los permisos que asignas a un archivo pueden protegerlo no slo de acceso no deseado sino tambin de tus propios errores. Por ejemplo, puedes proteger un archivo contra
modicaciones no intencionales o de borrarlo accidentalmente suprimiendo su permiso w.

3.2 Movindose en el rbol del sistema de archivos

31

Permisos para directorios


Los permisos de archivos tambin se aplican a los directorios.
El permiso r para un directorio te permite ver qu hay dentro, pero es insuciente
para acceder a los archivos que se encuentran dentro.
El permiso w para un directorio se requiere para poder aadir o borrar archivos de l.
Sin embargo, w no es necesario para modicar un archivo listado en el directorio o
borrar su contenido.
El permiso x para un directorio te permite operar con los nombres en ese directorio
si los conoces, pero no te permite ver cules son si no los conoces. Normalmente
siempre que r se concede, tambin es as con el permiso x.

Otros permisos de archivos


Adems de los permisos rwx, Unix tiene otras clases de permisos usados principalmente
(pero no exclusivamente) por el administrador del sistema. Los describimos a continuacin.
El set-uid bit. El bit set-uid le permite a un programa correr con los permisos de su dueo
en lugar de con los permisos del usuario que lo llama. Puedes especicar el bit setuid con s cuando usas el comando chmod. En un listado, se indica reemplazando la
x con una s.
Normalmente, cuando llamas un programa y ese programa accede a un archivo, los
privilegios de acceso del programa son los mismos que t tienes. Como ejemplo,
supn lo siguiente:
El usuario patito es dueo del ejecutable qq.
El programa qq utiliza el archivo privado de patito llamado tarea.
El usuario mam-pato ejecuta el programa qq.
Los permisos que se aplican a tarea durante la ejecucin son aqullos de otros
(ya que mam-pato no es duea de tarea); no se utilizan los permisos del usuario
patito. Por lo tanto, si patito no le dio permisos a su archivo tarea para que otros
lo pudieran leer (todo el mundo), el programa qq no puede acceder a l. Una posible
solucin a esto es que patito le d permisos de acceder al archivo tarea a todo el
mundo, pero entonces mam-pato podra hacer cualquier cosa con el archivo (incluso, cosas que patito no tena intensin de permitir.)
El bit set-uid es una solucin a esto. Cuando un proceso ejecuta un programa, invoca
la funcin exec del sistema, especicndole a sta la ruta del programa a ser llamado.
Si los permisos del programa incluyen el bit set-uid, entonces el ID efectivo del
proceso se convierte en aqul del dueo del programa, as que el programa se ejecuta
con los privilegios del dueo del programa.

32

Sistema de Archivos

En efecto, el bit set-uid habilita a un usuario para acceder a un archivo como tarea
indirectamente con mam-pato como agente pero no directamente.
El ejemplo clsico del uso del bit set-uid es el comando passwd. El dueo del
archivo /etc/passwd es root (el superusuario) y debe ser escrito solamente por el
programa passwd. Los usuarios ordinarios deben ser capaces de poder ejecutar el
comando passwd, pero no de modicar directamente el archivo passwd. Por lo
tanto, el bit set-uid est encendido2 para el programa passwd, lo que le permite
escribir en el archivo /etc/passwd, mientras que esa habilidad permanece negada
para usuarios ordinarios.
El bit set-gid. El bit set-gid es como el set-uid excepto que se aplica a los permisos de
grupo en lugar de a los permisos de dueo. El bit set-gid se especica con una s en
la posicin de la x en los permisos del grupo.
El locking bit. Si el locking bit de un archivo est prendido, un programa que est leyendo o escribiendo el archivo puede bloquear otros intentos de leer o escribir en l al
mismo tiempo. Prender este bit previene que accesos simultneos a un archivo puedan corromper su signicado y dejarlo en un estado inconsistente. El locking bit est
representado por una l reemplazando a la x en los permisos del grupo.
El sticky bit. Cuando se aplica a un directorio, el sticky bit previene que los archivos
dentro de l sean borrados o renombrados por otra persona que no sea su dueo.
Cuando se aplica a un archivo ejecutable, es la herramienta adecuada para retener
al programa en memoria cuando dicho programa puede ser compartido por varios
usuarios. Slo el superusuario o el dueo del archivo puede activar el sticky bit. Este
bit est indicado por una t en el lugar de la x en los permisos de otros.

Construccin de permisos
Los comandos chmod, umask y nd hacen uso de la habilidad para construir conjuntos
de permisos simblicamente. Esto lo puedes lograr especicando un modo simblico que
les indique cmo modicar un conjunto existente, posiblemente vaco, de permisos.
Un modo simblico consiste de una o ms clusulas separadas por comas. Cada clusula, en turno, consiste de cero o ms letras quin seguidas por una secuencia de una o
ms acciones a aplicar a la categora designada por las letras quin. Cada accin consiste
de un operador seguido ya sea de una o ms letras de permisos, de una letra quin o de
nada en absoluto. Estas son las letras quin:
u Permiso para el usuario del archivo.
g Permiso para el grupo del archivo.
2

En este contexto, utilizaremos indistintamente prendido, encendido, arriba o puesto, para indicar que ese
bit ha sido activado por medio de alguna utilera vlida como el comando chmod.

3.2 Movindose en el rbol del sistema de archivos

33

o Permiso para otros (i.e. el resto del mundo.)


a Permiso para cualquiera (equivalente a ugo.)
Si omites las letras quin que preceden al operador, se supone a y la mscara de
creacin (de la cual hablaremos ms adelante). stos son los operadores:
+ Aade estos permisos.
- Quita estos permisos.
= Prende exactamente estos permisos, quitando cualquier otro para las letras quin indicadas.
stas son las letras de los permisos:
r Lectura
w Escritura
x Ejecucin
X Ejecucin slo si el archivo es un directorio o algn permiso x ya est puesto
s Establece el ID de usuario o grupo
t Bit pegajoso
l Bloqueo durante el acceso
Si especicas una letra quin despus de un operador, entonces se copian los permisos
asociados con la letra indicada.

Representacin octal de los permisos


Los permisos para un archivo pueden ser especicados como un nmero octal. Esta
forma es obsoleta y no recomendada, pero mucha documentacin antigua de Unix utiliza
la forma octal muy seguido; tambin algunos sistemas (no nuestro caso, en la Licenciatura
en Ciencias de la Computacin) no soportan an la forma simblica en todos los contextos.
El nmero octal se obtiene sumando lgicamente los nmeros de la siguiente lista:
4000 Establece el ID del usuario en ejecucin.
20d0 Establce el ID del grupo en ejecucin si d es 7,5,3 o 1 (permiso de ejecucin otrogado); habilitar el bloque de otra forma.
1000 Habilita el bit pegajoso.
0400 Establece el permiso de lectura para el dueo.
0200 Establece el permiso de escritura para el dueo.
0100 Establece el permiso de ejecucin para el dueo.
0040,0020,0010 Establece permisos de lectura, escritura o ejecucin para el grupo.
0004,0002,0001 Establece permisos de lectura, escritura o ejecucin para el resto de los
usuarios.

34

Sistema de Archivos

Permisos para archivos recin creados


Cuando un programa crea un archivo, especica un conjunto de permisos para ese archivo. Conjuntos tpicos son u=rw g=rw o=rw (rw-rw-rw-, o 666 en octal) para archivos
de datos y u=rwx g=rwx o=rwx (rwxrwxrwx, o 777 en octal) para archivos ejecutables.
Los permisos iniciales son pocos debido a la mscara de creacin de archivos, tambin
conocida como la umask (user mask).T puedes cambiarla con el comando umask. En
otras palabras, los bits en la mscara de creacin de archivos representan permisos que
sern negados a los archivos recin creados.
Los permisos de un archivo recin creado se calculan restando lgicamente los bits en la
mscara de creacin de archivos de los permisos especicados por el programa que lo crea.
Por lo tanto, si tu mscara vale algo como rwxrwxr-x (octal 002), que excluye el permiso
de escritura de otros, aqullos fuera de tu grupo no podrn escribir o borrar archivos que t
crees a menos que les cambies los permisos ms tarde (con chmod, por ejemplo).
Un valor tpico para umask es rwxr-xr-x (octal 022), que niega los permisos de escritura a todos menos a ti. Con este valor de mscara, un archivo creado con permisos
especicados como u=rw g=rw o=rw es en realidad creado con permisos u=rw g=r o=r.
La reduccin de permisos por el valor de umask se aplica tanto a la creacin de nuevos
directorios como de nuevos archivos.

3.2.2.

Archivos estndar y redireccionamiento


Muchos comandos de Unix leen su entrada de la entrada estndar a menos que especiques archivos de entrada; y escriben su salida a la salida estndar. Por omisin, tanto la
entrada como la salida estn asociados a tu terminal (generalmente la salida es el monitor y
la entrada es el teclado). Otro archivo estndar es el error estndar, que se usa para mensajes de error y otra informacin acerca del funcionamiento de un comando. La informacin
enviada al error estndar tambin llega a la terminal.
Esta convencin funciona bien porque puedes redireccionar tanto la salida como la
entrada estndar. Cuando redireccionas la entrada estndar para ser tomada del archivo archivo, el programa que lee la entrada estndar leer del archivo archivo en lugar de hacerlo
desde la terminal. Algo similar sucede cuando redireccionas la salida estndar. Cuando se
redirecciona la entrada se usa el operador < precediendo a una trayectoria, mientras que
para el redireccionamiento de la salida se usa el operador >.
Por ejemplo, el comando cat copia la entrada estndar a la salida estndar, por lo tanto
el comando
cat < felix > gato
copia el archivo felix al archivo gato3 . Si utilizas el operador >> antes de una trayectoria,
entonces la salida es agregada al nal del archivo en lugar de escrita directamente. En el

3.2 Movindose en el rbol del sistema de archivos

35

ejemplo anterior, el contenido de gato es sobrescrito con el contenido de felix; pero si haces
en su lugar
cat < felix >> gato
el contenido de felix es agregado al nal del contenido de gato. Discutiremos ms formas
de redireccionamiento en breve.
El error estndar tambin se puede redireccionar pero la sintaxis para hacerlo es dependiente del tipo de shell que se utilice.
Para el shell Bourne (sh) y la mayora de los que pertenecen a su familia, como zsh,
bash, korn, etc., la construccin 2> archivo especica que cualquier cosa que sea
enviada al error estndar ser redireccionada al archivo archivo.
Para el shell C, se utiliza la construccin > & archivo, que manda tanto la salida
estndar como el error estndar al archivo archivo. Este shell (y de su familia slo
tcsh) no permite enviar la salida estndar y el error estndar a distintos archivos. De
hecho, el uso del shell C est en decadencia, pero an tiene algunos seguidores.
Una propiedad importante y valiosa del redireccionamiento es que un programa cuya
entrada o salida es redireccionada no tiene por qu saberlo. En otras palabras, un programa
escrito bajo la suposicin de que lee de la entrada estndar y escribe a la salida estndar tambin lee y escribe a archivos, siempre y cuando estos ltimos sean pasados como
redireccionamientos. La misma propiedad se aplica a guiones de shell.
Un uso comn de cat es la creacin de archivos nuevos, que generalmente contienen
unas pocas lneas que se pueden teclear directamente de la pantalla. Por ejemplo,
f u l a n i t o @ [ estnum f u l a n i t o ] % c a t > f e l i x
Esta es una prueba de c a t
para v e r exactamente como f u n c i o n a
^D

crea al archivo felix en el directorio de trabajo, y el contenido del archivo se tom de


la entrada estndar, que se dio por terminada al teclear C-d (representado por ^D en el
listado), que corresponde a un n de archivo.
Otra manera de crear archivos es mediante el comando
touch mimosa
En realidad este comando lo que hace es actualizar la fecha de ltima modicacin del
archivo mimosa. Sin embargo, si el archivo no existe lo crea.
Nota: A lo largo de estas notas diremos que un programa produce un resultado cuando
manda algo a la salida estndar. En la terminologa tradicional de Unix se dice que imprime
el resultado. Esta terminologa viene de los das en los que la mayora de las estaciones de
trabajo estaban conectadas a un teletipo en lugar de un monitor, pero no debe confundirse
con la accin de enviar un archivo a la impresora.
3

Nota que como no das ms que el nombre del archivo, la trayectoria se reere al directorio de trabajo.

36

Sistema de Archivos

Actividad 3.5 Crea el archivo felix, con el contenido que t quieras, y luego ejecuta los
ejemplos que dimos para este comando, en el orden dado.

Actividad 3.6 Ve con ls -al gato los parmetros y la fecha de ltima modicacin del
archivo gato. Ejecuta touch sobre el archivo gato. Obtn nuevamente un listado extendido
y describe la diferencia entre ambos listados.

Entubamientos y ltros
Puedes usar la salida de un comando como la entrada de otro comando, conectando
ambos comandos con un tubo (pipe). La construccin resultante es un pipeline o entubamiento. Al igual que con las formas de redireccionamiento discutidas anteriormente, los
programas conectados no tienen por qu saber de dichas conexiones.
Sintcticamente, creas un entubamiento escribiendo dos comandos con un pipe (el smbolo |) entre ellos. Por ejemplo, la lnea de comandos
grep pest phones | sort
llama al programa grep, que extrae del archivo phones todas las lneas que contengan
la cadena pest y produce esas lneas como su salida estndar. Esta salida se entuba a la
entrada del programa sort, que ve dicha salida como su entrada. La salida de la lnea de
comandos completa es una lista ordenada de todas las lneas en phones que contienen
pest.
En una lnea que contenga tanto redireccionamientos como entubamientos, los redireccionamientos tienen mayor precedencia: primero los redireccionamientos se asocian con
comandos y despus los comandos con sus redireccionamientos se pasan por los entubamientos.
La creacin de un entubamiento implica la creacin de un par de procesos, uno para
el comando que produce la informacin entubada y otro para el proceso que consume esta
informacin. Estos procesos los crea el shell que interpreta la lnea de comandos.
Un ltro es un programa que lee datos de la entrada estndar, los transforma de alguna manera y luego escribe esta informacin transformada a la salida estndar. Uno puede
construir un entubamiento como una sucesin de ltros; estas sucesiones proveen una forma muy poderosa y exible de usar comandos simples para que al combinarlos alcanzar
grandes metas, posiblemente muy complejas. Generalmente este tipo de entubamientos se
citan como ejemplos de la losofa Unix.
Hay otras herramientas en los Unix estndar para simular estos entubamientos: archivos especiales FIFO, sockets y streams. Pero son mucho ms especcos y sosticados y
denitivamente fuera del alcance del presente trabajo.

3.3 Otros comandos de Unix

37

3.3. Otros comandos de Unix


Un comando es una instruccin que le dice a Unix que haga algo. La forma usual de
pasar un comando a Unix es a travs del shell, como respuesta a un prompt que ste nos
proporciona.
El trmino comando se utiliza tambin para referirse a instrucciones que esperan los
editores de texto como vi o emacs y otro tipo de programas.

3.3.1.

Sintaxis estndar de comandos


POSIX4 dene una sintaxis estndar para comandos, pero no todos los comandos la
siguen. Muchos comandos denidos por POSIX tienen una forma moderna y una sintaxis
obsoleta, por compatibilidad con sistemas viejos. La razn de esto es que muchos programas importantes y muy viejos que an estn en uso, siguen sintaxis vieja de algunos
comandos. Siempre que hablemos de la sintaxis de un comando, trataremos de apegarnos
a la sintaxis moderna de POSIX, pero mencionaremos de vez en cuando la sintaxis vieja
para algunos de ellos.
Aun en sistemas modernos hay una gran cantidad de comandos que no se apegan al
estndar. Por ejemplo, el estndar especica que las opciones de los comandos (no as, los
operandos) pueden aparecer en cualquier orden, pero algunos comandos pueden requerir
que las opciones aparezcan en un orden particular y muchas veces esto no est mencionado explcitamente en la pgina del manual del comando. En estos y otros casos hacer
experimentos siempre es una buena idea.
Un comando consiste de una sucesin de palabras separadas por espacios en blanco
(estos espacios en blanco pueden ser espacios sencillos, tabuladores e incluso en algunos
shell, solamente nuevas lneas escapadas5 ). La primera palabra es el nombre del comando y las palabras subsecuentes son sus argumentos u opciones. El nombre del comando
se reere a un programa o guin de shell a ser ejecutado. Los operandos consisten de las
opciones del programa, si hay alguna, seguidas de sus operandos, si hay alguno. Las opciones controlan o modican lo que el comando hace. Los operandos especican nombres de
trayectorias o con lo que va a trabajar el comando.
Especicacin de opciones. Las opciones se especican con una sucesin de palabras.
Cada palabra es un grupo de opciones o una opcin argumento. Las opciones generalmente se denotan por letras. Se pueden escribir en cualquier orden y se pueden
4
Portable Operating System Interfaz es un estndar denido por la IEEE Institute of Electrical and
Electronics Engineers y ANSI American National Standards Institute . POSIX tiene como nalidad
denir un sistema operativo que se comporte como Unix, sea o no Unix. Han existido varias versiones de
POSIX, siendo la ms importante POSIX.2, parte 2.
5
Una nueva lnea escapada es una que est precedida por una diagonal invertida (\).

38

Sistema de Archivos

combinar varias opciones en un solo grupo (siempre y cuando no reciban ningn argumento). Cada grupo de opciones est precedido por un guin (-). Por ejemplo, los
comandos
ls -al
ls -l -a
son equivalentes e indican que el comando ls (list archives) sea llamado con las
opciones a (all les) y l (long listing).
La ltima (o nica opcin) de un grupo de opciones puede ir seguida por una palabra
que especique uno o ms argumentos opcionales para ella. Por ejemplo, el comando
sed -f qqscript qqarchivo
causa que el editor sed edite el archivo qqarchivo usando el guin de shell qqscript;
en este caso, qqscript es un argumento para la opcin -f y qqarchivo es un argumento
para el comando sed mismo.
Cuando se reciben varios argumentos para una misma opcin, generalmente se separan por comas, pero se pueden separar por blancos siempre y cuando se encierre
la lista de argumentos entre comillas (dobles o sencillas), o si se pone una diagonal inversa frente a cada espacio en blanco (escapando los espacios en blanco). En
cualquier caso, los argumentos deben formar una sola palabra. Los dos ejemplos que
siguen muestran ambas convenciones:
prog o zed1,zed2 y "eres o no eres"

o alternativamente,
prog o zed1,zed2 y eres\ o\ no\ eres

Otras convenciones para argumentos. Hay otras dos convenciones muy comunes para
especicar argumentos:
- - Indica el nal de las opciones. Esto es muy til cuando quieres pasar argumentos
que empiezan con - a un comando. Por ejemplo,
rm - - -qq
es una forma de indicar que -qq es un archivo y no una opcin, por lo que el
comando borrar el archivo -qq. Si slo se escribe rm -qq, obtendramos un
error sobre una opcin q que no reconoce.
- Un solo guin representa a la entrada estndar en un contexto en que el programa
espera una trayectoria. Por ejemplo, el comando
diff - qq
encuentra las diferencias entre la entrada estndar y el comando qq

39

3.3 Otros comandos de Unix

Citas (quotations)
Todos los shells estndar asignan signicados especiales a ciertos carcteres, llamados
meta-carcteres. Para usar estos carcteres como carcteres ordinarios en la lnea de comandos, debes citarlos (marcarlos de manera especial para que el shell no los interprete).
Cada shell tiene su propio conjunto de meta-carcteres y sus propias convenciones de cita,
pero algunas reglas generales siempre se cumplen:
Una diagonal inversa (\) siempre sirve como carcter de escape para uno o ms
carcteres que le sucedan, lo cual le da a esos carcteres un signicado especial. Si
un carcter es un meta-carcter, el signicado especial es generalmente el carcter
mismo. Por ejemplo, \\ usualmente signica una sola \ y \$ el signo de pesos. En
estos casos, la diagonal inversa le quita su signicado a los carcteres, generalmente
llamados carcteres escapados. La diagonal inversa misma es el carcter de escape.
Cuando un texto se encierra entre comillas (" "), la mayora de los meta-carcteres
que estn en dicho texto son tratados como carcteres normales, excepto por $, que
generalmente indica sustituciones a realizar.
Otra forma de citar muy similar a la anterior, pero ms fuerte es usar comillas sencillas ya que ni siquiera el carcter $ es interpretado.
Los espacios y tabuladores, si se encuentran dentro de algn texto citado, siempre son
tratados como carcteres normales.
A continuacin damos una breve lista de algunos comandos de Unix que consideramos
muy importantes.
Tabla 3.1

Comandos de Unix importantes

Comando

Descripcin

cat

El comando cat copia y concatena archivos. Tiene algunos usos comunes


que no implican concatenacin y que lo hacen uno de los comandos ms
tiles de Unix (en prcticas posteriores lo usaremos exhaustivamente).
La forma general de cat es:
cat [-estuv] [archivo. . . ]

ln

El comando ln crea una liga a uno o ms archivos existentes. Las nuevas ligas proveen nombres adicionales para esos archivos. La forma del
comando ln es:
ln [-f s] archivo ruta
ln [-f s] archivo. . . dir
Contina en la siguiente pgina

40
Tabla 3.1

Sistema de Archivos
Comandos de Unix importantes

Contina de la pgina anterior

Comando

Descripcin

mv

El comando mv mueve uno o ms archivos de un directorio, el directorio


fuente (source), a otro directorio, el directorio destino (target). Si tanto
el fuente como el destino estn en el mismo sistema de archivos, mv
simplemente cambia sus ligas y no mueve ningn dato de lugar. La forma
del comando mv es:
mv [-i f] archivo ruta
mv [-i f] archivo. . . dir
El comando cp copia uno o ms archivos. A diferencia de ln y mv, cp s
copia los datos y no slo cambia las ligas de los archivos involucrados.
cp no es la nica forma de copiar archivos en Unix, ya que cat provee un
mtodo alternativo. Ms adelante les diremos cmo. pax con las opciones -rw es otra forma (pero no lo veremos aqu); cpio con la opcin -p
es otra (tampoco lo veremos) y tar tambin provee otra opcin (ste s lo
veremos, pero con un propsito distinto al de copiar archivos). La forma
de cp es:
cp [-p] iarchivo oarchivo
cp [-prR] iname. . . odir
El comando rm borra ligas a archivos, ya sean archivos ordinarios o directorios. Un archivo es eliminado cuando todas sus ligas han sido borradas, as que borrar la nica liga a un archivo (el caso ms comn) borra
el archivo mismo. La forma del comando rm es:

cp

rm

rm [-rR] archivo. . .
rmdir

El comando rmdir borra ligas a directorios. La forma de la lnea de comandos es:


rmdir [-ps] dir. . .
donde dir. . . es una lista de directorios.

more

El comando more te permite examinar uno o ms archivos en tu terminal una pgina a la vez. Tambin lo puedes usar para examinar la entrada estndar y por lo tanto examinar la salida de un programa haciendo
un entubamiento hacia more (espero que despus de este prrafo te des
cuenta de la cantidad de terminologa que ya debes ms o menos manejar; si no has ledo el material que se encuentra antes de esta seccin,
ests en problemas). La forma de la lnea de comandos para more es:
Contina en la siguiente pgina

41

3.3 Otros comandos de Unix


Tabla 3.1

Comandos de Unix importantes

Comando

Contina de la pgina anterior

Descripcin
more [-ceisu] [-n number] [-t tag] [-p cmd] [archivo. . . ]
Nota que todos los parmetros son opcionales.

less

Hace lo mismo que more, pero extiende algunas de las capacidades


interactivas de more.

most

Hace lo mismo que more, pero con una interfaz parecida a emacs. Tambin extiende las capacidades de more utilizando comandos y enlaces de
teclas a la Emacs.

lpr (lp)

Este comando ocasiona que un conjunto de archivos sea enviado a la cola


de impresin. Recibe varias opciones, pero la forma usual de usarlo es:
lpr archivo. . .

lpstat

Despliega el estado de las solicitudes de impresin.

lpc

Hace lo mismo que lpstat.

lpq

Muestra la cola de impresin.

lprm

Borra un archivo de la cola de impresin (debes ser dueo del archivo o


el superusuario para poder eliminar un archivo de la cola de impresin).

nd

El programa nd busca en partes especicadas del sistema de archivos


de Unix, archivos que casen con un cierto criterio. La forma del comando
es:
nd ruta. . . [criterio]
Aqu ruta. . . es una lista de trayectorias de archivos y directorios (usualmente slo directorios). En el caso ms simple, el criterio de bsqueda es
una sucesin de patrones bsicos, cada uno indicado con un guin. Cada
patrn primario prueba si un archivo candidato cumple cierta propiedad;
algunas de estas pruebas primarias siempre se satisfacen (son tautologas,
:-)) y se ejecutan slo por sus efectos secundarios. En general, un criterio es una combinacin lgica arbitraria de patrones que se construye a
partir de los patrones primarios.
La prueba primaria -print es muy til. Siempre es verdadera y, como
efecto secundario, ocasiona que la ruta absoluta de los archivos encontrados (casados, apareados) sea enviada a la salida estndar.
Contina en la siguiente pgina

42
Tabla 3.1

Sistema de Archivos
Comandos de Unix importantes

Contina de la pgina anterior

Comando

Descripcin

which

El comando which te permite localizar un programa ejecutable; esto es,


determina su trayectoria absoluta. La forma de la lnea de comandos para
which es:
which progname. . .

le

El comando le (archivo) intenta clasicar un archivo examinando sus


primeros bytes. La forma del comando es:
archivo [-cL] [-f archivo] [-m archivo] archivo. . .

cmp

El comando cmp compara dos archivos. La forma del comando cmp es:
cmp [-l | -s] archivo1 archivo2

diff

El comando diff analiza las diferencias entre dos archivos, tales como
diferentes versiones del mismo documento. La forma del comando diff
es:
diff [-bcefhr] [-C n] archivo1 archivo2

chmod

El comando chmod cambia los permisos de un archivo. Para que este


comando funcione, necesitas permiso de bsqueda en el directorio que
contenga al archivo (lee lo relativo a permisos si algo de esto no te qued
claro). La forma del comando chmod (change mode) es:
chmod [-Rf] perms archivo. . .

umask

El comando umask te permite cambiar o examinar la mscara de creacin de archivos, tambin llamada umask value. El comando umask est
incluido en el shell en lugar de ser un programa independiente (de hecho,
en shells avanzados, como bash o zsh, la mayora de los comandos de esta seccin estn incluidos en el shell). La sintaxis de la lnea de comandos
es:
umask [-S] [perm]

chown
chgrp

Los comandos chown y chgrp te permiten transferir la propiedad personal y grupal de un conjunto de archivos y directorios a alguien ms. La
forma general de estos comandos es:
chown [-R] owner[.group] archivo. . .
chgrp [-R] group archivo. . .
Contina en la siguiente pgina

43

3.4 Agrupando nombres de archivos


Tabla 3.1

Comandos de Unix importantes

Contina de la pgina anterior

Comando

Descripcin

wc

El comando wc cuenta el nmero de carcteres, palabras y lneas en un


archivo o conjunto de stos. Una palabra es considerada como una secuencia (no vaca) de carcteres delimitada por espacio en blanco. La
forma de la lnea de comandos de wc es:
wc [-clw] [archivo. . . ]

touch

El comando touch (toca) un archivo, actualizando sus tiempos de acceso


y modicacin. Si el archivo no existe, se crea a menos que se especique
lo contrario. Tocar un archivo es una forma fcil de crear un archivo
nuevo. La forma de la lnea de comandos de touch es:
touch [-acm] [-r ref-archivo | -t fecha] archivo. . .

tee

El comando tee provee una forma de capturar los contenidos de un entubamiento en un archivo, sin perturbar el ujo de informacin a travs del
entubamiento. Toma su nombre por la similitud con una conexin T
como las de las tuberas de agua en tu casa. La forma del comando es:

tee

tee [-ai] [archivo. . . ]


tee copia la entrada estndar a la salida estndar y tambin a los archivos
archivo. . . . Por ejemplo, si tecleas:
cat hola.txt | tee adios.txt | more
vers el contenido del archivo hola.txt por pginas (que es lo que hace
more) y encontrars en tu directorio actual un archivo llamado adios.txt
que ser una copia exacta de hola.txt.

3.4. Agrupando nombres de archivos


Usualmente, es necesario hacer referencia a un conjunto de archivos o directorios. Para
este propsito se utilizan construcciones con comodines. Un comodn es una construccin
que se puede remplazar por un conjunto o secuencia de carcteres.
El comodn ? se usa para representar un carcter cualquiera. Por ejemplo, todos los
archivos en el directorio /bin/ que empiezan con cualquier carcter al que le sigue nada ms
sh se pueden referir por medio de la expresin /bin/?sh.

44

Sistema de Archivos

Actividad 3.7 Ejecuta ls dndole como parmetro la expresin /bin/?sh. Cul es el resultado?.
El carcter es otro comodn que se reemplaza por cualquier secuencia de carcteres,
incluso la secuencia vaca, que es aquella que no tiene ningn carcter.
Actividad 3.8 Ejecuta otra vez el comando ls, pero ahora con el parmetro /bin/*sh. Cul
es el resultado? Cules son las diferencias en el listado de archivos con la construccin
/bin/?sh?
La tercera y ltima forma de expresiones con comodines son las que usan la expresin
[. . . ]. Los carcteres dentro de los corchetes proporcionan una lista para que se trate de
casar con alguno (y slo uno) de ellos.
Actividad 3.9 Ejecuta otra vez el comando ls, pero ahora ejectalo con el parmetro
/bin/[abc]sh. Cul es el resultado? Cules son las diferencias en el listado de cuando se utiliz con la construccin /bin/?sh?
Actividad 3.10 Escribe la ruta absoluta para referirte a todos los archivos que inician
con m y terminan con .ps en el directorio /usr/share/texmf/doc/metapost/base/.
Actividad 3.11 Escribe las rutas relativas para referirte a los mismos archivos anteriores,
desde los directorios /, /usr/share/, /facultad/calculo/ayudantia/ y /usr/local/bin.
Actividad 3.12 Crea un directorio llamado miPractica que contenga dos subdirectorios
llamados usuarios y archivo y que estn en tu directorio base.
Actividad 3.13 Crea un archivo llamado raizArchivos.dat en el subdirectorio archivos del
directorio miPractica que contenga un listado de los archivos y directorios en el directorio
raz. Utiliza ls redireccionando la salida.
Actividad 3.14 A todos los directorios que haz creado asgnales permisos de lectura y
escritura para ti y slo de lectura a los dems.
Actividad 3.15 A todos los archivos que haz creado asgnales todos los permisos para ti
y ningn permiso para los dems.
Actividad 3.16 Crea una copia del directorio miPractica y todo su contenido, llmale
ejercicios.
Actividad 3.17 Elimina el directorio miPractica y todo su contenido.

3.5 Konqueror: administrador de archivos y algo ms

45

3.5. Konqueror: administrador de archivos y algo ms


Konqueror se podra denir como un administrador de archivos, pero es una denicin
bastante pobre, ya que es capaz de realizar muchas ms cosas. Se trata de una de las aplicaciones estrella de KDE. Con esta aplicacin se ha intentado y conseguido tener una nica
aplicacin que recoja todas las necesidades de un usuario.
Konqueror es:
Un manejador de archivos: proporciona funciones de administracin de archivos,
que van desde las operaciones simples de cortar, copiar y pegar hasta bsqueda de
archivos a travs de una red local y remota. Permite previsualizar el contenido de los
archivos y directorios, examinar sus propiedades e iniciar aplicaciones de una forma
simple.
Un navegador web que cumple las especicaciones de HTML como son:
Soporte para JavaScript.
CSS (hojas de estilo).
Escrituras bidireccionales (rabe y hebreo).
Soporte para ejecucin de applets de Java.
Extensiones de Netscape para visualizar Flash, RealAudio y RealVideo.
Comunicaciones seguras mediante SSL.
Llenado automtico de URL y formularios.
Un cliente FTP totalmente equipado.
Una aplicacin de visualizacin universal, capaz de mostrar imgenes y documentos
sin necesidad de iniciar otras aplicaciones. Esto lo hace integrando componentes de
otras aplicaciones: de KView para visualizacin de imgenes; de KDVI para visualizar DVIs; de KGhostView para documentos PostScript; y aplicaciones de Kofce.
Un emulador de terminal, que funciona de la misma manera que una terminal normal.

3.1 Administrador de archivos

El navegadores de directorios e Internet dentro de gnome es Nautilus.

3.5.1.

Iniciando Konqueror
Hay varias formas de iniciar la aplicacin de konqueror:
Para iniciar konqueror como un administrador de archivos se puede seleccionar el
icono con una casita en el panel o en el escritorio.

46

Sistema de Archivos

Para iniciar konqueror como un navegador se puede seleccionar el icono en forma de


globo terrqueo en el panel.
Desde el men, seleccionando Internet->Navegador web Konqueror para iniciarlo
como navegador o Inicio para iniciarlo en modo de administrador de archivos.
Simplemente tecleando konqueror para iniciarlo como administrador de archivos.

3.5.2.

Konqueror como administrador de archivos

Konqueror se ve como un administrador de archivos comn:


Lista los archivos y directorios contenidos dentro de una carpeta dada y proporciona
informacin sobre ellos. La ruta de la carpeta actual se muestra en la barra de
direccin.
Adems muestra los archivos y directorios utilizando:

Vista de iconos.
Vista multicolumna.
Vista de rbol.
Vista de lista informativa.
Vista de lista detallada.
Vista de texto.
Vista de tamao de archivo.
lbum de fotos.

La gura 3.3 muestra la funcionalidad estndar de konqueror como un administrador


de archivos.

51

3.6 Emacs

compleja para su lnea de comandos; las siguientes son algunas de las opciones ms importantes:
Tabla 3.2

Emacs: opciones de inicio

Opcin

Descripcin

-batch

Edicin en lote. Con esta opcin el editor mandar mensajes


a la salida estndar. Debes usar las opciones -l, -f y eval para
especicar archivos a ejecutar y funciones a llamar. Durante el
curso de este trabajo, no habr necesidad de usar esto y puede
ser considerada una opcin avanzada.

-nw

Utiliza la terminal actual (TTY), sin llamar el cdigo de tu manejador de ventanas.

-debug-init

Si ocurre algn error mientras Emacs est arrancando, iniciar


el depurador. Esta opcin es til cuando agregas cosas a tu archivo de conguracin de Emacs y no estn funcionando bien.

-q

No carga ningn archivo de inicio.

-user <user>

Carga el archivo de inicio del usuario especicado en lugar del


tuyo.

-u <user>

Lo mismo que -user.

-help

Imprime el mensaje de uso de Emacs y sale.

-version

Imprime informacin sobre la versin de Emacs y sale.

-V

Lo mismo que -version.

-funcall <function>

Ejecuta la funcin de Lisp nombrada sin pasarle ningn argumento.

-f <function>

Lo mismo que -funcall <function>.

-eval <form>

Evala la forma de Lisp pasada como parmetro a eval. Ten


la precaucin de escapar adecuadamente la expresin para que
el intrprete de comandos no la ejecute antes de que llegue a
Emacs.

-load <archivo>

Carga el archivo nombrado de cdigo en Lisp en Emacs.

-l <archivo>

Igual que -load <archivo>.

Por ejemplo la siguiente lnea ejecutar Emacs dentro de la terminal:


% emacs -nw
El comando save-buffers-kill-emacs ( C - x C - c ) termina la ejecucin de Emacs.

52

Sistema de Archivos

3.6.2.

Conceptos esenciales
Dado que Emacs es ms, mucho ms, que un editor de texto, para integrar tantas operaciones distintas en un nico paquete y mostrarlas en una sola ventana, se crearon varios
conceptos para referirse a estas distintas partes de Emacs.
Adems, y sta es la caracterstica que distingue a Emacs como un sistema para incrementar la productividad del programador, todo comando que puede ejecutarse puede y
usualmente est asociado a una combinacin de teclas. Puedes utilizar cualquier tecla como parte de estas combinaciones de teclas y a menudo involucran las teclas control ( ctrl
en algunos teclados) y meta ( meta ya no existe en teclados modernos y usualmente se
sustituye por alt ).

Buffers
Emacs, y en general cualquier editor, no modica directamente el archivo, sino que
toman una copia del mismo y la coloca en un buffer, el cual contiene toda la informacin
del estado actual de la edicin. El estado actual del archivo no cambia sino hasta que le
indicas a Emacs que deseas guardar los cambios en el disco.
Al igual que los archivos, los buffers tambin tienen un nombre, el cual generalmente
se corresponde con el del archivo que se est editando. Sin embargo, en otros casos el
nombre de un buffer no corresponde con el de ningn archivo, sino simplemente con algn
propsito especco; es decir, no todos los buffers estn ligados a un archivo sino que sirven
para interactuar con Emacs. En este sentido es importante que entiendas la diferencia entre
un buffer y un archivo.

Modos mayores y menores


La versatilidad de Emacs se debe, en buena medida, a que tiene diferentes modos de
operacin, de acuerdo con el tipo de texto que se est editando o proceso que se est ejecutando. Esto quiere decir que Emacs se adapta a las necesidades de edicin de cada tipo de
texto. Por ejemplo, para escribir una carta est el modo de texto; para editar un programa
Emacs cuenta con modos para una gran cantidad de lenguajes de programacin. Esto le
permite a Emacs ser el tipo de editor que t deseas.
Estos modos de operacin se conocen simplemente como modos, y vienen en dos sabores: existen los modos mayores, que son los que proveen caractersticas que cambian
radicalmente la manera en que se edita el texto; por ello un buffer siempre est asociado
exactamente con un modo mayor.
Por otro lado existen los modos menores que aaden comportamientos especcos a un
modo mayor. Por ejemplo, si deseas que se produzca un cambio de lnea cuando rebases
una cierta cantidad de carcteres en una lnea, puedes usar un modo menor llamado Auto-

53

3.6 Emacs

ll-mode. A diferencia de los modos mayores, un mismo buffer puede utilizar cualquier
cantidad de modos menores.
La lnea que aparece en la parte inferior de todo buffer se conoce como la lnea de
modo. Esto es porque parte de la informacin que nos proporciona es precisamente el modo
o modos en el que se est editando el buffer (que aparecen entre parntesis). Lo primero
que aparece entre estos parntesis es el modo mayor, seguido de todos los modos menores
que el buffer en cuestin tenga activados.
Aparecen otros datos en la lnea de modo, como el nombre del buffer, pero no son
relevantes por el momento.
En el siguiente captulo, en la seccin 4.3, explicaremos el resto de los conceptos importantes de Emacs y los comandos (y su combinacin de teclas asociadas) de edicin.
En lo que resta de este captulo te mostraremos cmo Emacs puede ejecutar comandos de
Linux e incluso un intrprete de comandos completo.

3.6.3.
C-x C-f
(nd-le)
permite abrir
archivos

Dired
Es un modo utilitario para manejo de directorios. Este modo se activa cuando el archivo
que se intenta abrir es un directorio. Por ejemplo, si ejecutas C-x C-f y luego completas
o tecleas el nombre de un directorio, digamos /pruebas, Emacs abrir dicho directorio
en el modo dired.
En este modo puedess observar los archivos en un directorio, cambiar sus permisos y
propietarios, copiar, borrar o mover archivos y directorios. Algunos de los comandos que
puedes usar en este modo son:

Tabla 3.3 Emacs: comandos del modo dired

Combinacin

Descripcin

Abre el archivo nicamente en modo de lectura.

Abre el archivo, pero en otra ventana.

C-o

Abre el archivo en otra ventana pero te deja en la que actualmente ests.

Marca los archivo o directorios (para copiar o mover, por ejemplo).

Copia los archivos marcados.

Mueve los archivos marcados.

Marca archivos para eliminacin.

Elimina archivos marcados.


Contina en la siguiente pgina

54

Sistema de Archivos

Tabla 3.3

3.6.4.

Emacs: comandos del modo dired

Contina de la pgina anterior

Combinacin

Descripcin

Crea un directorio.

Enter

Abre el archivo o directorio en el que ests parado.

Ejecucin de comandos de Unix desde Emacs


Emacs ofrece varios mecanismos para ejecutar comandos del sistema y procesar los
resultados. El ms sencillo de estos mecanismos lo ofrece el comando shell-command o
M-!.
Cuando se ejecuta este comando, Emacs solicita se escriba el comando en el minibuffer6 , que se encuentra en la parte ms baja de la ventana de Emacs, justo debajo de la lnea
de modo.
Por ejemplo, puedes ejecutar un comando para copiar el archivo /etc/passwd al directorio /tmp, siguiendo esta secuencia:
i. Primero ejecutas el comando M-!, tecleando esta combinacin.
ii. A continuacin, en el minibuffer, que dice Shell command:, escribes el comando de
Unix: cp /etc/passwd /tmp
Emacs mostrar a continuacin en la misma lnea, pero que ahora se llama rea de eco,
(Shell command succeeded with no output), indicando que todo sali bien y la ejecucin
fue exitosa.
Otro mecanismo muy utilizado es ejecutar un intrprete de comandos completo dentro
de un buffer de Emacs, lo que se logra con el comando shell y puedes ejecutarlo con la
secuencia: M-x shell. Emacs te llevar inmediatamente a un nuevo buffer que simula una
terminal de Linux. Como es obvio, en este intrprete de comandos (porque es un intrprete
de comandos dentro de Emacs) puedes ejecutar todos los comandos de Unix.
Actividad 3.18 Dentro de Emacs ejecuta un shell, con M-x shell y repite todas las actividades de este captulo.

6
Emacs tambin utiliza esta rea para informar al usuario y en este caso se conoce como rea de eco y no
como minibuffer. Por ejemplo, cuando escribes un comando como C-x C-f, si haces una pausa prolongada
despus de escribir C-x, Emacs presenta esa parte en el rea de eco como ayuda. Si escribes la secuencia del
comando completa muy rpidamente, Emacs no muestra nada en el rea de eco para no distraerte.

Edicin

4.1. La guerra de los editores de texto


En la cultura geek1 hay un gran debate entre la comunidad de programadores sobre cul
editor de texto de propsito general es el mejor. Aunque es una guerra que siempre tiene
nuevos contendientes, los grandes campeones hasta la fecha, sobre todo en el mundo Unix,
son los seguidores de Emacs y los de Vi.
La comunidad de hackers2 trata con reverencia a sus piezas de software favoritas, muchas veces rayando en el fanatismo, y los editores de texto son probablemente las piezas
de software ms difundidas y apreciadas. Es cierto, hay otras guerras y muy violentas, como las de los sistemas operativos o los lenguajes de programacin, pero la de los editores
Emacs y Vi es digna de leyendas e historias de encuentros salvajes y cruentos entre sus
seguidores.
Nosotros, los autores de este compendio, nos contamos y a mucha honra entre los seguidores de Emacs. Vi es malo, de hecho, para los iniciados en el arte de la edicin (lo cul
sers t tambin al nal de este captulo); es claro que Vi es el editor del inerno y nos
1

Geek es el sobrenombre que reciben aquellas personas fascinadas, probablemente en forma obsesiva, con
algunos temas especcos u obscuros de algn rea del conocimiento o de la imaginacin. En aos recientes,
geek se utiliza generalmente para los obsesionados con tecnologa o computacin. Es probable que si ests
interesado en los temas del presente libro, t mismo(a) caliques como geek, bienvenido(a) al club!
2
hacker es aquella persona que crea o modica software o hardware de computadora, incluyendo tareas de
programacin, administracin de sistemas y seguridad. Hack, por otro lado, tiene una connotacin negativa y
es algo as como un chicano x, una compostura poco elegante para un programa o sistema.

56

Edicin

referiremos a l por su nombre completo: vi vi vi (666, en romano), el editor de la bestia.


Hablaremos de Emacs ms adelante, en la seccin 4.3. Linux, y de manera ms general el
software libre, te ofrece una nica cosa y hay que valorarla: la facultad de elegir.

4.1.1.

Vieja guardia contra nueva guardia


Hoy da contamos en Linux con ms editores de los que podramos dominar o explicar
en una vida, menos an en este captulo. Sin embargo, en KDE existe una nueva camada
de editores que han llamado nuestra atencin porque hacen lo que un buen editor debe
hacer, pero adems se integran al resto del ambiente, lo cual, a la larga, ofrece otra gama
de posibilidades.
En este captulo revisamos los editores Kate en la siguiente seccin y Emacs en la
seccin 4.3. En captulos subsecuentes revisaremos otros editores especializados, como
Kile en el captulo 6. Es importante que tomes en cuenta, sin embargo, que durante tu vida
acadmica y profesional te encontrars en situaciones donde no contars con un ambiente
grco para trabajar, como KDE, y es aqu donde Emacs muestra su superioridad, ya que
tambin puede ejecutarse en una terminal o consola de texto.

4.2. Kate: un editor para programadores


4.2.1.
$ smart
install kate

Introduccin
Kate es el editor de texto preferido por programadores en KDE. Algunas caractersticas
de Kate que revisaremos en este libro incluyen resaltado congurable de sintaxis para una
gran variedad de lenguajes, desde C o C++ hasta XML o guiones de shell; la habilidad para
crear y mantener proyectos; una interfaz para varios documentos (MDI por sus siglas en
ingls) y un emulador de terminal integrado.

4.1 Editores de texto

El editor nativo en Gnome es gedit, un editor de texto eciente y sencillo. Este editor,
sin embargo, no es directamente comparable con Kate, que revisamos en esta seccin, y
tampoco con Emacs, que veremos ms adelante.
Kate es ideal para programadores. Sin embargo, una de sus fortalezas ms importantes
no est relacionada con su manejo de archivos fuente de diversos lenguajes de programacin, sino con la facilidad para abrir varios documentos simultneamente. Ms an, para

58

Edicin

En el captulo 5 se describen varios protocolos de red; KDE ofrece soporte transparente3


para varios de ellos.

Sesiones
Kate soporta sesiones, que son una forma de mantener distintas listas de archivos y
conguraciones. Puedes tener tantas sesiones como desees y stas pueden ser annimas o
tener un nombre.
Por omisin, cuando inicias Kate se inicia en la sesin predeterminada, pero cuando lo
inicias con una sesin, el nombre de sta aparece en el ttulo de la ventana. Puedes iniciar
Kate desde la lnea de comandos e indicarle que abra una sesin:
% kate -s nombre lista-de-archivos
Si la sesin llamada nombre no existe, Kate la crear. En caso de existir una sesin
abierta con ese nombre, los archivos especicados se anexarn a esa sesin.
Tambin se pueden crear y manejar sesiones desde un ejemplar de Kate en ejecucin a
travs del men, eligiendo Sesiones.

La lista de documentos
La lista de archivos muestra todos los documentos actualmente abiertos en Kate. Los
archivos que han sido modicados muestran un icono de disco magntico a la izquierda
para indicar su estado.
Si hay dos o mas archivos abiertos con el mismo nombre (que viven en distintos directorios), Kate antepone < 2 > al nombre del segundo, < 3 > al nombre del tercero y as
sucesivamente. La ventana de informacin te mostrar la ruta completa del archivo para
que selecciones el adecuado.
Para mostrar en la ventana activa el archivo deseado, basta con que hagas click sobre el
nombre en la lista.
La lista de archivos puede ordenarse de distintas formas; para ello Kate ofrece un botn
a la derecha que te permite ordenar con alguno de los siguientes criterios: por orden de
apertura, por nombre (alfabtico) y por URL.
Esta lista aparece por omisin, aunque puede moverse, al lado izquierdo de la ventana
de edicin.

El selector de archivos
El selector de archivos es un visor de carpetas, que te permite navegar tu espacio de
archivos y abrir el archivo adecuado. Su funcionamiento es idntico al de otras aplicaciones
KDE, particularmente Konqueror.
3

Cuando decimos que algn proceso es transparente nos referimos al hecho de que funciona como si no
estuviera ah, que no se le ve.

4.2 Kate: un editor para programadores

59

Emulador de terminal
Kate integra un emulador de terminal que es una copia de la aplicacin Konsole de
KDE. Est disponible de varias formas, a travs del men Ventana en vista de herramientas, a travs del botn en la parte inferior llamado terminal o bien pulsando la tecla F7 .
Esta terminal est aqu para facilitarte acceso a comandos de Linux y al sistema de
archivos.

Herramientas externas
En el men de Herramientas encontrars uno de herramientas externas, que te permite invocar aplicaciones externas a Kate con datos relacionados con l o los documentos
actuales, por ejemplo, su URL, directorio, texto.
Qu herramientas se incluyen es congurable por el usuario a travs del panel de conguracin de herramientas externas. Las herramientas que se incluyen por omisin estn
relacionadas con el sistema para manejo de control de versiones CVS, otra que te permite
realizar una bsqueda en el web con Google (utiliza Konqueror) con el texto seleccionado
en el documento y una ms para ejecutar cualquier programa sobre el documento.

Arrastrar y soltar
Kate soporta el protocolo de KDE para arrastrar (drag) y soltar (drop), por lo que puedes
arrastrar un archivo desde el escritorio o una ventana de konqueror y dejarlo caer o soltarlo
encima de Kate y ste abrir el archivo.

4.2.3.

Editando archivos
En la gura 4.2 puedes apreciar la ventana inicial de Kate. Notars que hemos resaltado
algunas secciones con rojo y estn numeradas. La seccin 1 es similar en varias aplicaciones que funcionan en KDE y ofrece varios selectores: de documentos, proyectos y archivos.
Cada selector ofrece distintas posibilidades para localizar un archivo o proyecto a editar.
La seccin marcada con 2, que es la ms grande de la ventana de Kate, es donde se
despliega el contenido del archivo que editas. Dado que Kate tiene la facultad de editar ms
de un archivo a la vez, cuando existe ms de un archivo abierto, en la parte superior de esta
ventana se crean varias pestaas, una por cada archivo abierto.
Es posible dividir esta seccin en dos, ya sea de forma horizontal o vertical. En ambos
casos, las dos partes o marcos, contendrn el archivo que ests editando, pero slo uno de
ellos ser el marco activo, lo que se representa por medio de un indicador verde.

61

4.2 Kate: un editor para programadores


Tabla 4.1 Kate: enlaces de tecla para acceso rpido

Enlace

Descripcin

Mueve el cursor un carcter a la izquierda.

Mueve el cursor un carcter a la derecha.

Mueve el cursor una lnea arriba.

Mueve el cursor una lnea abajo.

Avpg

Mueve el cursor una pgina hacia arriba.

Repg

Mueve el cursor una pgina hacia abajo.

Ins

Pasa de modo insercin a modo sobreescritura y viceversa. Cuando


est en modo insercin el editor aadir cualquier carcter introducido al texto y empujar los carcteres previamente introducidos a
la derecha del cursor de texto. El modo de sobreescritura hace que
la entrada de cada carcter elimine el carcter inmediatamente a la
derecha del cursor de texto.

BackSpace

Borra el carcter a la izquierda del cursor.

Inicio

Mueve el cursor al comienzo de la lnea.

Fin

Mueve el cursor al nal de la lnea.

Supr

Borra el carcter a la derecha del cursor (o cualquier texto seleccionado).

Shift

Marca el texto un carcter a la izquierda.

Shift

Marca el texto un carcter a la derecha.

F1

Ayuda.

Shift F1

Ayuda: qu es esto?

Cf

Buscar.

F3

Repetir la bsqueda.

Cb

Insertar un marcador.

Cc

Copiar el texto marcado al portapapeles.

Cn

Nuevo documento.
Contina en la siguiente pgina

62

Edicin

Tabla 4.1

Kate: enlaces de tecla para acceso rpido

Contina de la pgina anterior

Enlace

Descripcin

Cp

Imprimir.

Cq

Salir - cerrar la copia activa del editor.

Cr

Reemplazar.

Cs

Salvar archivo.

Cv

Pegar.

Cx

Borrar el texto marcado y copiarlo al portapapeles.

Cz

Deshacer.

CShiftz

Rehacer.

Trabajando con la seleccin de texto


Hay dos formas de seleccionar secciones de texto en Kate, una de ellas con el ratn y
la otra con el teclado.
Para seleccionar con el ratn debes mantener presionado el botn izquierdo y arrastrar
el puntero hasta cubrir la regin deseada. El texto se selecciona mientras arrastras.
Para seleccionar con el teclado debes mantener presionada la tecla Shift y utilizar una
combinacin de las teclas de cursor, Inicio y Fin .
Una vez que has creado una seleccin, puedes por ejemplo copiarla con la opcin Editar
Copiar o bien C-c y posteriormente puedes copiar el texto, ahora en el portapapeles,
con C-v .
Para eliminar la seleccin actual, puedes utilizar alguna de las tres opciones: (a) elegir del
men Editar Deseleccionar, (b) C-a o bien (c) hacer click con el botn izquierdo del
ratn en cualquier parte del editor.

Buscando y reemplazando
Los dilogos de bsqueda y sustitucin de Kate son muy similares, salvo porque el
segundo incluye un espacio para indicar la cadena por la que habr de sustituir la o las
presencias del texto buscado.
Los dilogos contienen estas opciones:

63

4.2 Kate: un editor para programadores


Tabla 4.2

Kate: opciones para buscar y reemplazar

Enlace

Descripcin

Texto a buscar
Expresin regular

Aqu va la cadena de bsqueda.


Si est activado, la cadena de bsqueda ser interpretada como una expresin regular.
Si est activada, la bsqueda distinguir entre maysculas y minsculas.
Si est marcado, la bsqueda iniciar desde el punto
actual del cursor.
Si est activado, la bsqueda se har desde el punto
actual hacia el inicio del documento.
Aqu va la cadena de sustitucin.
Si est activado, aparecer un dilogo preguntando la
accin que debe llevar a cabo Kate cada vez que encuentre la cadena de bsqueda. Las posibles respuestas
son: s, no, todo y cerrar.

Maysculas y minsculas
Desde el cursor
Buscar hacia atrs
Reemplazar con
Preguntar al reemplazar

Para iniciar una bsqueda puedes utilizar el men Editar Buscar o bien C-f ; para
reemplazar debes utilizar Editar Reemplazar o C-r .

Marcadores
Los marcadores sirven para sealar lneas interesantes en el documento y volver a ellas
fcilmente en el futuro. Puedes establecer y eliminar marcadores, moviendo el cursor a esa
lnea y activando la opcin Marcadores Cambiar o presionando C-b . Despus, para
recorrer los marcadores en el documento puedes utilizar en el men
Marcadores Siguiente ( CAvpg ) o Anterior ( CRepg ).

Ajustes de lnea y sangrado


Kate tiene una opcin para que le indiques que debe cortar las lneas que sean ms
largas que cierto tamao. Esto lo puedes congurar en las preferencias, en la pgina de
Editor.
Cuando est activada esta opcin de ajuste de lnea, al llegar al nmero mximo de
carcteres permitidos, Kate insertar (en un espacio en blanco apropiado) un salto de lnea.
En cuanto al sangrado del documento, Kate soporta una amplia gama de sangrados
automticos especializados en distintos tipos de entrada. Puedes utilizar uno de los modos disponibles a travs del men Herramientas Sangrado. En la siguiente tabla se

64

Edicin

muestran algunos de los sangrados disponibles en Kate:


Tabla 4.3 Kate: sangrados disponibles

Enlace

Descripcin

Ninguno

Seleccionando este modo se desactiva completamente el sangrado automtico.

Normal

Este sangrado simplemente mantiene un sangrado similar al de la lnea anterior con cualquier contenido diferente a un espacio en blanco. Puedes combinar ste con las acciones sangrar y borrar sangrado para satisfacer tu gusto
personal.

Estilo C

Es un sangrado para los lenguajes C y similares, como C++, C#, Java, Javascript. Sin embargo, no funciona con lenguajes de script como Perl o
PHP.

SS C

Es un sangrado alternativo para los lenguajes C y similares, con las mismas


restricciones.

Python

Un sangrado especco para el lenguaje de script python.

XML

Un sangrado automtico para XML. Sin embargo, no intentes utilizarlo con


HTML o XHTML, ya que falla con las etiquetas HTML de estilo antiguo
(etiquetas abiertas como <br>)

4.3. Emacs
Emacs es el editor de los Dioses, por directa contraposicin con su odiado archienemigo vi (asegrate de leer dos veces la introduccin de este captulo, en la seccin 4.1).
En el captulo anterior (seccin 3.6.2) te mostramos algunos de los conceptos esenciales
de Emacs y en esta seccin concluimos la exposicin de conceptos y te ensearemos a
utilizar una pltora de comandos para edicin. No tienes que aprenderlos todos para utilizar
Emacs, pero es importante los conozcas y practiques cada vez que tengas oportunidad.

4.3.1.
Meta x
sirve para
ejecutar
comandos

Comandos
Los comandos en Emacs tienen un nombre auto-descriptivo. En muchas ocasiones estos
comandos estn formados por dos o ms palabras separadas por un guin y, como puedes
imaginar, ejecutar estos comandos llamndolos por su nombre puede resultar engorroso.

4.3 Emacs

65
Por esta razn, Emacs crea un vnculo entre un comando y una secuencia de teclas y puedes ejecutarlo ya sea invocndolos por su nombre, por ejemplo Meta x nd-le, o bien
tecleando la secuencia asociada, en este caso C-x C-f .

Las secuencias asociadas lucen complicadas al principio, pero despus de utilizarlas un


tiempo te dars cuenta que estn ah por muy buenas razones. De hecho, notars que los
comandos ms usuales tienen asociadas secuencias de teclas cortas. Emacs fu diseado
por programadores, para programadores, por lo que la eciencia lo es todo.

Cada vez que tienes que despegar una de tus manos de la parte central del teclado para
buscar con el ratn un comando en los mens, pierdes tiempo valioso. Intenta: compara el
tiempo que te toma teclear la secuencia C-x C-f contra el tiempo que te toma encontrar en
el men el mismo comando nd-le. Ahora imagina una sesin de edicin donde escribirs
una decena de cuartillas y ejecutars varios cientos de comandos.

Entre ms utilices Emacs menos tendrs que pensar en las secuencias de los comandos,
tus manos se harn cargo. Esto se conoce como memoria dactilar. Una vez que te sientas cmodo con los comandos de Emacs que dominas, regresa a este captulo e investiga
algunos de las secciones que a continuacin presentaremos y aprende nuevas secuencias.

En la seccin 3.6.2 te dijimos que las teclas Control y Meta ( alt y alt gr ) son
usualmente utilizadas en secuencias de teclas. De hecho, ya hemos utilizado algunas de
stas a lo largo de este material, pero en nomenclatura de Emacs no mostramos el nombre
de estas teclas completo, sino que las sustituimos as: Ct rl es C y Meta es M. Entonces
una secuencia as: Cx , signica mantener presionada Ct rl y sin soltar presionar x .

Sucede lo mismo con M, aunque aqu tenemos una pequea variante y es que la tecla de
escape, esc , puede utilizarse en sustitucin de Meta . Cuando se ejecuta una secuencia
Mx utilizando esc , sin embargo, no se mantienen presionadas de manera simultnea.
Es decir, primero presionamos esc , soltamos, y a continuacin x .

El guin nos sirve para indicar que esas teclas se presionan juntas, los espacios en la
secuencia nos indican que debemos soltar la(s) tecla(s) anterior(es) antes de iniciar con las
teclas despus del espacio. Por ejemplo, Cx Cf se teclea as: simultneamente Ct rl y
x , liberamos ambas y de manera simultnea presionamos Ct rl y f .

66

Edicin

Escribir texto o ejecutar comandos


Puedes estarte preguntando si eventualmente Emacs sirve para editar texto o slo para
ejecutar comandos. Por raro que parezca, Emacs sirve exclusivamente para ejecutar comandos y el ms ejecutado es self-insert-command, que es ejecutado por cada tecla y cuya
nica funcin es imprimir el carcter que representa la tecla en el buffer actual, o sea, la
que acabas de oprimir.
Para redactar una carta, escribir tus tareas, programar o hacer una presentacin, simplemente tienes que ejecutar Emacs, visitar un archivo (con nuestro ya viejo amigo: C-x
C-f ) y comenzar a teclear. Ms adelante te decimos como salvar el contenido del buffer (seccin 4.3.11); recuerda teclear C-x C-c para terminar la ejecucin de Emacs.

4.3.2.

Movimiento
Existe una posicin privilegiada que es donde se efectan las operaciones de Emacs,
conocida como el punto. Generalmente, este punto est marcado con el principio de un
cursor, que es un simptico cuadrado que nos indica dnde ests parado con respecto al
buffer que ests editando. El punto en realidad se reere a la posicin entre el carcter
cubierto por el cursor y el inmediato anterior.
Como es natural, las primeras operaciones que desears hacer son las de movimiento
del punto dentro del buffer, las cules se pueden efectuar a muchos niveles, desde carcter
por carcter, lnea por lnea, palabra por palabra, por prrafo o por pantalla.
La mayora de las operaciones de movimiento se pueden efectuar tanto hacia adelante
como hacia atrs. A continuacin presentaremos una tabla de movimientos tratando de
explicar, cuando no sea claro, las funciones de estos comandos.

Tabla 4.4

Emacs: comandos de movimiento

Unidad

Adelante

Atrs

carcter

C-f

C-b

palabra

M-f

M-b

lnea

C-p

C-n

enunciado

M-a

M-e

prrafo

M-{

M-}

pantalla

C-v

M-v

Es posible que necesites desplazarte de manera instantnea a ciertas posiciones privilegiadas del texto. Emacs ofrece los siguientes comandos para realizarlo:

67

4.3 Emacs
Tabla 4.5

4.3.3.

Emacs: movimiento a lugares especiales

Elemento

Inicio

Fin

lnea

C-a

C-e

buffer

M<

M>

Matando y borrando
Hasta el momento sabes cmo agregar texto al buffer y cmo moverte en l, pero qu
opciones ofrece Emacs para borrar texto? sas te las mostramos aqu, pero antes te presentamos un comando muy til undo o C-x u , que deshace lo que hizo el ltimo comando.
Si ejecutas repetidamente este comando puedes retroceder tanto como quieras en el proceso
de edicin del buffer actual.
Los comandos de Emacs para borrar se dividen en dos grandes categoras, los que
matan y los que borran. Como una manifestacin del optimismo de Emacs, la muerte no es
para siempre, por lo que todo aquello que matas puede reencarnar. Para lograr esto, Emacs
enva a todos los muertos a una estructura conocida como el anillo de la muerte (kill-ring).
Por el contrario, cuando borras algo es para siempre, a menos, claro, que utilices el comando undo. Para evitar que los usuarios de Emacs pasemos malos ratos por eliminar cosas
sin quererlo, los nicos comandos para borrar que veremos funcionan sobre carcteres.
En la siguiente tabla te mostramos los comandos para borrar y matar.

Tabla 4.6

4.3.4.

Emacs: comandos para matar y borrar

Unidad

Adelante

Atrs

carcter (borrado)

C-d

BackSpace

palabra

Md

MBackSpace

lnea

C-k

C-u 0 C-k

enunciado

Mk

C-x Supr

Reencarnacin de texto
Cuando matas alguna seccin, los carcteres que la conforman entran al kill-ring. Si
eres perspicaz te preguntars: de qu sirve que se vayan a este lugar si no s como traerlas de regreso? sta es una pregunta vlida: en efecto existe una manera de traer de regreso
aquellos carcteres que han muerto en este buffer (o en cualquier otro buffer); a esta ope-

68

Edicin

racin se le conoce como yank y el comando para realizarla es C-y . La ejecucin de este
comando inserta el ltimo texto muerto en el punto actual.
Como es de esperarse, puedes reencarnar texto que hayas matado con anterioridad.
Esto se logra con el comando My , el cual, si el comando inmediato anterior fue un yank,
reemplaza el texto que ste insert con el texto inmediato anterior en el kill-ring. Esto
ltimo se puede repetir sacando sucesivamente lo que est guardado en el kill-ring.
Los elementos del kill-ring son el resultado de acomodar adecuadamente bloques de
operaciones matar; por ejemplo si matas dos lneas seguidas, estas dos lneas forman parte
de un mismo bloque en el kill-ring.

4.3.5.

Regiones
Las divisiones o unidades que hemos revisado no son todas; durante una sesin de
edicin puedes requerir tomar partes arbitrarias del texto y operar sobre ellas. A estas divisiones se les conoce como regiones.
Una regin comprende los carcteres que se encuentren entre una marca y el punto. La marca es otra posicin especial dentro del buffer y se ja por medio del comando
CSpace . El punto es la posicin que tenga el cursor. Es decir, se coloca la marca en la
posicin donde se encuentra el punto y mueves el punto ampliando o contrayendo la regin,
de nuevo entendida como los carcteres entre la posicin donde est la marca y la posicin
actual del punto. Emacs indicar visualmente la extensin de la regin, ya sea mostrndola
sombreada o cambiando el color del texto.
Existen muchas operaciones que puedes hacer sobre una regin. Por el momento slo
mencionaremos dos. La primera es matar una regin, que se lleva a cabo con el comando
C-w y la otra, copiar una regin al kill-ring sin matarla, que se lleva a cabo con el comando
Mw . Esta ltima operacin slo mete la regin al kill-ring sin quitarla de su ubicacin
actual.

4.3.6.

Rectngulos
En Emacs, adems de poder hacer selecciones de carcteres contiguos, tambin puedes
seleccionar reas con forma de rectngulos, con la esquina superior izquierda en la marca y
la esquina inferior derecha en el punto, o viceversa. Los comandos que se usan para lidiar
con rectngulos son:

69

4.3 Emacs
Tabla 4.7

4.3.7.

Emacs: comandos para manejar rectngulos

Enlace

Operacin

C-x r k

Cortar (kill) un rectngulo

C-x r y

Pegar (yank) un rectngulo

C-x r o

Abrir un rectngulo

Mx clear-rectangle

Borrar un rectngulo

Registros
En Emacs existen una especie de cajones, en donde puedes guardar cadenas de texto,
rectngulos o posiciones. Estos cajones reciben el nombre de registros, y sus principales
comandos son:

Tabla 4.8

Emacs: comandos para manejar registros

Enlace

Operacin

C-x x

Copia la regin en un registro. Te pregunta


por el nombre del registro.

C-x r r R

Guarda el rectngulo seleccionado en el registro R, donde R puede ser un carcter o un


nmero.

C-x r s R

Guarda la seleccin en el registro R.

C-x r Space R

Guarda la posicin del cursor en el registro R.

C-x r i R

Inserta el contenido del registro R, si ste es


un rectngulo o una cadena.

C-x r j R

Salta al punto guardado en el registro R.

C-x r t

Agrega el texto (que te ser pedido en el minibuffer) a todas las lneas en la regin rectangular, desplazando el texto hacia la derecha.

70

4.3.8.

Edicin

Archivos
Como mencionamos en el captulo anterior (seccin 3.6.3), para abrir un archivo en
Emacs utilizamos la secuencia: Cx Cf (nd-le). Si te equivocas de archivo, inmediatamente despus de utilizar Cx Cf , puedes utilizar el comando Cx Cv (ndalternate-le).

4.3.9.

Buscar
Emacs incluye varios tipos de bsqueda, el comando search-forward utiliza el minibuffer para solicitarte la cadena que deseas buscar.
Probablemente el comando ms til para buscar en Emacs es isearch-forward (nota la
i al inicio del comando), que sirve para realizar una bsqueda de manera incremental.
Esto signica que Emacs comienza a buscar conforme t escribes la cadena de bsqueda.
Es ms usual utilizar el enlace Cs que el comando anterior.
Para buscar hacia atrs (o hacia arriba) de manera incremental utilizamos el comando
isearch-backward o Cr .
Una vez que inicias una bsqueda incremental, ya sea hacia adelante o hacia atrs,
puedes utilizar nuevamente Cs o Cr para buscar la siguiente presencia hacia adelante
o hacia atrs, respectivamente. Cuando llegas al nal (o inicio) del buffer, Emacs utiliza el
rea de eco para avisarte que no existen ms presencias de la cadena buscada; si vuelves a
insistir en buscar hacia ese mismo lado, Emacs da la vuelta y contina la bsqueda desde
el otro extremo del buffer.

4.3.10.

Reemplazar
Habr ocasiones en las que quieras buscar y cambiar una, algunas o todas las presencias
de una cadena de texto por otra. Realizar esta tarea manualmente es tedioso, aun cuando
puedes utilizar los comandos de bsqueda para localizar rpidamente el texto a cambiar.
Por este motivo Emacs te ofrece dos comandos principales para reemplazar texto. El
primero replace-string, cambia todas las ocurrencias de una cadena por otra (utiliza el
mini-buffer para solicitar ambas cadenas).
Existe sin embargo, otro comando llamado query-replace-string que se comporta similar, pero antes de realizar cada cambio presenta una serie de opciones para decidir si esa
presencia particular se cambia o no y tambin para decidir reemplazar todas las presencias
que se encuentren ms all del punto actual. Este ltimo comando es ms popular y por
ello est asociado a una secuencia corta de teclas: M % .

71

4.3 Emacs

4.3.11.

Guardar
Ya te hemos comentado que mientras editas un documento los cambios existen nicamente dentro de Emacs, en el buffer. Para hacer estos cambios permanentes debes salvar el
archivo y esto puedes lograrlo con el comando: save-buffer o Cx Cs .
Con el comando save-some-buffers ( Cx s ) Emacs preguntar si deseas guardar
cada buffer modicado en tu sesin. Finalmente, el comando writele o C-x C-w te
permite salvar el contenido del buffer en un archivo distinto. Emacs te preguntar el nombre
de dicho archivo utilizando el mini-buffer.

4.3.12.

Ventanas
Una ventana en Emacs es una subdivisin del rea de trabajo en donde podemos desplegar un buffer. Con Cx 2 , se crea otra ventana en forma horizontal. Para crear una
ventana vertical puedes utilizar Cx 3 .
Para cambiar entre ventanas debes utilizar Cx o . En cualquiera de estas ventanas
puedes realizar todo tipo operaciones, ejecutar comandos de Emacs, etc.
Para cerrar todas las ventanas excepto en la que ests parado teclea Cx 1 ; para cerrar
la ventana en la que ests parado teclea Cx 0 .

4.3.13.

Marcos (frames)
Adems de las ventanas, en X tambin podemos crear lo que Emacs llama frames,
que en terminologa estndar de X se llama ventanas. Confundidos? Es muy fcil: estos
frames de Emacs lucen como ejecuciones distintas de Emacs, mientras que las ventanas
son sub-divisiones de un mismo frame.

4.3.14.

Ayuda en lnea
No podramos decir que Emacs es un editor de texto autodocumentado si no contara
con un sistema de ayuda en lnea. Si tecleas la secuencia Ch ? ? , Emacs te mostrar
una lista con las opciones de ayuda que tiene a tu disposicin. Por ejemplo, con la secuencia
Ch k , Emacs te pedir teclear una secuencia de teclas y te dir todo lo que sabe de esa
secuencia, a qu comando est asociada y la documentacin del comando.

72

4.3.15.

Edicin

Lista de buffers
En Emacs podemos tener una gran cantidad de buffers sobre los cuales estamos trabajando, tantos que es fcil perder de vista o recordar el nombre exacto del buffer que deseamos editar. Para estas situaciones existe el comando list-buffers o su enlace
Cx Cb , el cual despliega una lista de los buffers que tenemos abiertos en ese momento.
En este buffer se despliega informacin bsica de los buffers, su nombre, su tamao, y, en
caso de estar asociados con un archivo, el nombre del archivo. Otra informacin muy til
que nos proporciona este comando es si el buffer ha sido modicado desde la ltima vez
que se guard en disco.
Tambin desde este buffer podemos ir a los diferentes buffers, posicionndonos en el
regln correspondiente y presionando Enter .

4.3.16.

Anzuelos (Hooks), setq y otros


En esta seccin no entraremos en muchos detalles, ya que para entender bien se requiere
de conocimientos de Emacs-Lisp, que es el lenguaje para extender Emacs. Muchos de los
modos mayores, los comandos, etc. que hemos revisado en este libro estn escritos en
Emacs-Lisp.
Con los hooks podemos hacer que Emacs ejecute funciones cuando suceda algn evento. Se usan mucho para llamar a ciertas funciones cuando abrimos un archivo de cierto tipo.
Por el momento no entraremos en detalles acerca de los hooks.
Con setq le decimos el valor que queremos que tenga tal o cul variable.
Cada modo tiene su mapa de teclado (por ejemplo, text-mode-map es el mapa para
el modo mayor text) para indicar la accin que realiza cada tecla; estos mapas pueden
modicarse para cambiar los comandos a ejecutar por estas teclas.
Con require hacemos que Emacs haga un reconocimiento de un archivo de deniciones.

4.3.17.

Ortografa

Una carcterstica interesante de la mayora de los editores de texto modernos es que


te ayudan a revisar la ortografa de tus documentos. Emacs no es la excepcin, pero como muchas cosas con este gran editor, y en general en Linux, para lograrlo debes utilizar
componentes externos, otros programas.
$ smart
install
aspell-es

Para lograr que Emacs revise tu ortografa vamos a utilizar la biblioteca ispell.el, que
utiliza algn programa de Linux para realizar la revisin ortogrca. El programa predilecto

73

4.3 Emacs

en Linux para revisar ortografa se llama Aspell y, dependiendo de tu instalacin, puede o


no contener un diccionario en espaol.
Con las siguientes lneas en tu /.emacs le vamos a indicar varias cosas a Emacs. En
la lnea 1 le indicamos que queremos utilizar el programa de Linux aspell para revisar
ortografa y, en las lneas 2 y 3 le indicamos detalles sobre el tipo de carcteres que incluye
el espaol y algunos argumentos para el programa mismo. Por ejemplo, la secuencia -d es
le indica a aspell que utilice el diccionario llamado es. Finalmente, en la ltima lnea le
indicamos que utilice por omisin este diccionario en todos los buffers.
1 ( s e t q i s p e l l programname " a s p e l l "
2
i s p e l l e x t r a args ( " W" " 3 " )
3
i s p e l l d i c t i o n a r y a l i s t
4
( cons
5
( " spanish " " [ [ : alpha : ] ] " " [ ^ [ : alpha : ] ] " " [ . ] "
6
n i l (" B" "d " " es " ) n i l u t f 8)
7
i s p e l l d i c t i o n a r y a l i s t )
8
)
9 ( setd e f a u l t i s p e l l l o c a l d i c t i o n a r y " spanish " )

Es importante sepas que con el comando ispell-change-dictionary puedes cambiar a


otro diccionario. Estos cambios no son globales y funcionarn nicamente para el buffer
actual.

Utilizando ispell
Ahora que hemos congurado un revisor ortogrco en Emacs, en la siguiente tabla te
mostramos los comandos ms importantes, con los que puedes revisar la ortografa de una
palabra o de una porcin del buffer.
Tabla 4.9

Emacs: comandos para revisar ortografa

Enlace

Operacin

Mx yspell-mode

Activa el modo Flyspell que resalta todas las palabras incorrectas.

M$

Revisa y corrige errores ortogrcos en la palabra


en el punto.
Contina en la siguiente pgina

74

Edicin
Contina de la pgina anterior

4.3.18.

Enlace

Operacin

MTab

Completa la palabra antes del punto basado en una


ortografa del diccionario.

Mx ispell

Revisa la ortografa en la regin o buffer activo.

Mx ispellbuffer

Revisa la ortografa en el buffer.

Mx ispellregion

Revisa la ortografa de la regin.

Extendiendo Emacs
Dado que Emacs es y ha sido utilizado por miles de programadores a lo largo de varias
dcadas, la manera ms sencilla de extenderlo es investigar si esa extensin deseada no fue
ya implementada por alguien ms. Utiliza un buscador de web para localizar extensiones.
Una vez localizada la extensin o paquete, debemos decidir entre realizar una instalacin global (para todos los usuarios del sistema) o una instalacin personal. Si este equipo
es utilizado por mucha gente, conviene hacerlo de manera global, pero despus, cuando
actualices tu sistema operativo, debes repetir todo el procedimiento. En general, es ms
fcil y recomendable instalar extensiones a Emacs de manera personal y aqu te mostramos
cmo hacerlo.

Preparatorios

La variable
load-path

Los siguientes pasos te servirn para instalar cualquier programa para extender Emacs,
por lo que es importante realizarlos de una vez.
i. Crea el directorio /elisp (puedes usar otro nombre, pero entonces recuerda cambiar
elisp por el nombre que elegiste ms adelante).
ii. En tu /.emacs ahora agrega este directorio a la ruta de bsqueda de Emacs. Esta
ruta se parece mucho a la variable de ambiente PATH de Unix y, en realidad, tienen
una funcin similar:
( addto l i s t

loadpath ( expandf i l e name " / e l i s p / " ) )

y listo: a partir de ahora, cada vez que entres a Emacs, ste sabr que todos los programas
(archivos que tienen extensiones .el o .elc dentro de el directorio elisp son extensiones.

Instalando paquetes en 1, 2, 3
Aunque el procedimiento para instalar paquetes vara grandemente de uno a otro, en
general tienes que seguir los siguientes pasos:

75

4.3 Emacs

1. Localizar el archivo y descargarlo de la red. Si est comprimido, tienes que expandirlo.


2. Copiarlo o moverlo a tu directorio /elisp. Si es un archivo con extensin .el, pasa
al siguiente paso; si es un directorio, tienes que agregar el directorio a la ruta de
bsqueda. Por ejemplo, si el directorio se llama foo, agregas esto a tu /.emacs:
% (add-to-list load-path (expand-le-name "/elisp/foo"))
Usualmente cuando el paquete viene en un directorio, incluye instrucciones especiales para instalacin. Generalmente incluyen un archivo README o INSTALL
con instrucciones. En estos casos puedes revisar el procedimiento explicado en el
Anexo B para instalar programas paso a paso.
3. Despus tienes que leer el archivo principal del paquete y copiar las lneas de iniciacin a tu /.emacs. Generalmente tienen la forma: (require foo), donde foo es el
nombre del archivo con extensin .el.
En los siguientes captulos de este libro utilizaremos este procedimiento para instalar
algunas extensiones importantes de Emacs. A manera de ejemplo, sin embargo, a continuacin agregaremos una extensin muy sencilla para modicar los colores de Emacs.

Poniendo color a tu vida


Dependiendo del tipo de archivos que editas, Emacs reconoce distintas unidades sintcticas de esos archivos. Por ejemplo, cuando programas reconoce palabras reservadas,
cadenas, etc. Para activar los colores de manera global agrega lo siguiente a /.emacs:
( r e q u i r e f o n t l o c k )
( addhook f o n t l o c k modehook t u r n onf a s t l o c k )
( g l o b a l f o n t l o c k mode 1 )

Qu puedes hacer si no te gustan los colores de Emacs? La respuesta sencilla sera


cambiarlos. Por desgracia, la cantidad de variables que controlan los colores en Emacs es
muy grande, por lo que esta tarea sera muy complicada.
Afortunadamente hay alternativas; por ejemplo, podemos instalar la extensin de Emacs,
color-theme, que puedes obtener de la siguiente direccin:
http://download.gna.org/color-theme/
Despus de instalar y compilar el programa, agrega esto a tu /.emacs:
( addto l i s t loadpath ( expandf i l e name " ~ / e l i s p / c o l o r theme " ) )
( r e q u i r e c o l o r theme )
( c o l o r theme i n i t i a l i z e )

Ahora puedes ejecutar el comando Mx color-theme-select y color-theme crear un


nuevo buffer con una lista de los temas disponibles para darle color y vida a tu Emacs.

76

Edicin

Puedes recorrer la lista y con Enter puedes seleccionar el tema en la lnea actual. Cuando
seleccionas un tema, inmediatamente Emacs ajustar todos los colores.
Recorre la lista y selecciona el tema que ms te guste y, una vez que tengas tu favorito, agrega el comando que lo activa a tu /.emacs; as, cada vez que regreses, Emacs
recordar tu tema predilecto. Por ejemplo:
( c o l o r themec h a r c o a l b l a c k )

Internet

5.1. Redes de computadoras


La palabra red, cuando se habla de computadoras, hace referencia a dos o ms computadoras conectadas entre s. Las computadoras se conectan en red con el propsito de
compartir recursos.
Cuando las computadoras estn conectadas directamente (usando algn tipo de cable),
el sistema se denomina red de rea local o LANa (por su nombre en ingls Local Area
Network). Una LAN tpica se encuentra en un solo edicio o en algunas ocasiones en el
mismo piso. Sin embargo, la conectividad no tiene por qu terminar en una red local. Varias
LAN estn conectadas a otras redes, formando lo que se denomina Red de rea Amplia o
WAN (Wide Area Network).
En varias organizaciones las computadoras estn conectadas entre s por redes de rea
local. En ocasiones, estas LAN estn conectadas con un enlace de alta velocidad (denominado soporte principal o backbone) que rene a las LAN pequeas para formar una red
de rea amplia. Las organizaciones grandes, con muchos departamentos, pueden tener ms
de un soporte principal. Esto signica, entre otras cosas, que es posible enviar un correo
electrnico desde cualquier computadora dentro de la organizacin hacia cualquier otra
computadora (siempre y cuando estn conectadas por la red). De hecho, enviar un mensaje que atraviese todo el pas puede ser tan sencillo como enviar un mensaje hacia el otro
extremo de un corredor.

78

5.1.1.

Internet

Relacin cliente-servidor
En trminos propios de una red, cualquier programa que ofrezca un recurso recibe el
nombre de servidor. Un programa que usa un recurso es un cliente.
Si un programa proporciona acceso a los archivos en una red, recibe el nombre de
servidor de archivos; un programa que coordina la impresin de los datos usando varias
impresoras se denomina servidor de impresin; en general, cualquier programa que ofrece
un servicio y recibe solicitudes para el mismo recibe el nombre de servidor1 .
Las redes de muchas organizaciones estn conectadas a redes regionales y nacionales muy grandes. Dentro de estos sistemas, ciertas computadoras, denominadas puertas o
puentes (gateway), actan como enlaces entre la red y el mundo exterior.
En todo el mundo las redes de rea amplia ms importantes estn conectadas a un sistema conocido como Internet. Toda computadora en Internet puede conectarse a cualquier
computadora que tambin se encuentre en Internet.
La mayora de los pases tienen redes nacionales grandes que estn conectadas a Internet mediante puertas. Con eciencia, este sistema enlaza cientos de miles de computadoras,
formando una red mundial enorme. Esto signica que uno puede, con poco esfuerzo, enviar
correo electrnico y archivos de datos a todo el mundo. Existen incluso puertas para redes
de cmputo comerciales. Por ejemplo, tambin se pueden intercambiar mensajes con personas que usen Amrica Online, CompuServe, MCI, Mail, Delphi, Prodigy, AT&T Mail,
entre otros prestadores de servicios.
Cuando una computadora da el servicio de servidor y permite, a su vez, trabajo en ella,
a esta computadora se le conoce como antrin (host).
Son expertos los que conguran y administran las conexiones de red descritas anteriormente. Estas conexiones, por lo general, usan cables o lneas telefnicas rentadas. Las
conexiones a gran escala usan enlaces va satlite. Sin embargo, puede usarse una lnea
telefnica comn y hacer que una computadora llame por telfono directamente a la computadora antrin o a un ruteador (router), establecindose la conexin. En trminos tcnicos, la conversin de seales de computadora a seales telefnicas se llama modulacin. El
proceso inverso se denomina demodulacin. Por tal motivo, el dispositivo que se requiere
para conectarse a una computadora se llama mdem (modulador/demodulador).
Ahora bien, recuerda que la nica manera de trabajar con una computadora antrin
UNIX es mediante una terminal. Como la computadora que se tiene en casa no es una
terminal, el programa de comunicaciones que se utilice debe hacer que la computadora
casera acte como una terminal. Se dice entonces que el programa est emulando una
terminal. Los sistemas UNIX pueden trabajar con muchas marcas y tipos de terminales,
pero existe una que por costumbre es la que se emula cuando se trabaja con una lnea
telefnica. Se trata de la terminal tipo VT100.
1

En ocasiones el nombre servidor se emplea para referirse a una computadora y no a un programa.

5.1 Redes de computadoras

5.1.2.

79

TCP/IP
Internet es una coleccin de redes en todo el mundo que contiene muchos tipos de
sistemas. Algo debe mantenerlos unidos. Ese algo es TCP/IP.
Los detalles de TCP/IP son altamente tcnicos y superan las expectativas de este material. Sin embargo, hablaremos de manera general sobre el tema.
TCP/IP es un nombre comn que se aplica a una coleccin de ms de cien protocolos
(un protocolo es un conjunto de reglas que permiten que diferentes mquinas y programas se coordinen entre s). Los protocolos TCP/IP derivan de dos protocolos bsicos: TCP
que es acrnimo de Transmition Control Protocol e IP que es acrnimo de Internet Protocol. En esencia, estos protocolos se utilizan en Internet (y en otras redes) para conectar
computadoras, equipo de comunicaciones y programas. Cabe mencionar que no todas las
computadoras en Internet ejecutan UNIX, pero lo que es seguro es que todas usan TCP/IP.
Dentro de un sistema TCP/IP, los datos transmitidos se dividen en pequeos paquetes.
Cada paquete contiene el domicilio de la computadora del receptor junto con un nmero
de secuencia. Por ejemplo, el sistema puede dividir un mensaje en diez paquetes, cada uno
con su propio nmero de secuencia. Estos paquetes se envan por la red y cada uno se
transporta individualmente hacia su destino. Cuando se han recibido todos los paquetes,
el sistema destino usa los nmeros de secuencia para juntarlos. Si por alguna razn uno
de dichos paquetes llega en mal estado, el sistema destino transmite un mensaje al emisor
sealndole que debe volver a enviar determinado paquete.
Tiene varias ventajas dividir los datos en paquetes:
Las lneas de comunicacin se pueden compartir entre varios usuarios.
Se pueden transmitir al mismo tiempo distintos tipos de paquetes, ya que se ordenarn y combinarn hasta que lleguen a su destino.
Los datos no tienen que enviarse directamente entre dos computadoras.
Cada paquete pasa de computadora en computadora hasta llegar a su destino.
Rapidez, ya que slo se necesitan unos segundos para enviar un archivo de gran
tamao de una mquina a otra, aunque estn separadas por miles de kilmetros y
pese a que los datos tienen que pasar por mltiples computadoras. De esta forma,
si al enviar los paquetes algo sale mal con al menos uno de ellos, slo es necesario
volver a transmitir ese paquete y no todo el mensaje.
Los paquetes no necesitan seguir la misma trayectoria.
La red puede llevar cada paquete de un lugar a otro y usar la conexin ms idnea que
se encuentre disponible en ese preciso momento. Esto implica que no necesariamente
los paquetes deben viajar por la misma ruta y por supuesto, tampoco tienen que llegar
todos al mismo tiempo a su destino.
El proceso que TCP sigue cuando se enva un mensaje es el siguiente:
i. TCP divide los datos en paquetes.

80

Internet

ii. Ordena stos en secuencia.


iii. Agrega cierta informacin para el control de errores.
iv. Y despus los distribuye.
El proceso en el otro extremo es:
i. TCP recibe los paquetes.
ii. Verica si hay errores.
iii. Y los vuelve a combinar para convertirlo en los datos originales.
iv. Si existe algn error, el programa TCP destino enva un mensaje solicitando que
se vuelvan a enviar determinados paquetes.
La tarea de IP es llevar los datos a granel (es decir, los paquetes), de un sitio a otro. Las
computadoras que encuentran las vas para llevar los datos de una red a otra, ruteadores,
utilizan IP para trasladar los datos.
Si el usuario est interesado en ver la ruta que va desde su computadora hasta otra,
puede usarse el comando traceroute. El problema es que este comando no se encuentra
disponible en todos los sistemas. El comando se usa de la siguiente manera:
% traceroute computadora

5.2. Web
Internet, como ya mencionamos, es una coleccin mundial de redes que transmiten datos usando el protocolo IP. Ahora la pregunta a resolver es qu se puede hacer en Internet?
Son siete los servicios principales que Internet puede ofrecer:
Correo: Se pueden enviar y recibir mensajes.
Transferencia de archivos: Se pueden copiar archivos de una computadora a otra.
Entrar a un sistema remoto: Podemos entrar a otra computadora y trabajar en ella como
si nuestra terminal estuviera conectada directamente a ella.
Grupos de inters (Usenet): Se pueden leer y escribir artculos en los miles de grupos
de inters de Usenet (tambin llamados foros).
Software compartido: Podemos obtener copias gratuitas de cualquier tipo de software y
nosotros mismos podemos compartir nuestros programas con otras personas.
Acceso a informacin: Se puede buscar y recuperar cualquier tipo de informacin. Si no
se est seguro de dnde buscar, existen programas especiales que nos pueden ayudar.
Comunicacin con otras personas: Se puede sostener una conversacin con otras personas usando el teclado y la pantalla (puede ser una sola persona o incluso un grupo).

5.3 Redes y direcciones

81

5.3. Redes y direcciones


Una vez que se nos asigna una cuenta UNIX, podemos comunicarnos con todos los
integrantes de la comunidad UNIX y transferir datos a todo el mundo. Lo nico que se
necesita es un domicilio y saber usar los programas en red.

5.3.1.

Domicilios estndar en Internet


La clave para poder usar el Internet consiste en entender qu son los domicilios o correo
electrnico. Lo ms asombroso del esquema de los domicilios en Internet es que cada
identicador de usuario y cada computadora necesitan un solo domicilio, sin importar el
servicio que utilicen.
Un domicilio en Internet consta de un identicador de usuario, seguido por el signo
@ y despus el nombre de la computadora (compuesto por el mismo nombre de la computadora y el de su dominio). De tal forma que el dominio estndar de Internet luce as:
identicador@computadora.dominio. Por ejemplo, el correo electrnico de nuestro usuario
es Juan.Perez@ciencias.unam.mx.
En este ejemplo, el identicador de usuario es Juan.Perez y el dominio (el nombre o
domicilio de la computadora) es ciencias.unam.mx.
Las partes del dominio que estn separadas por puntos se llaman subdominios. El domicilio anterior tienen tres subdominios: ciencias.unam.mx. El subdominio ms a la derecha
(en este caso, mx) se denomina dominio de jerarqua superior.
Para leer un domicilio, se examinan los dominios de derecha a izquierda. As vamos del
nombre ms general al ms particular2 .

5.3.2.

Nomenclatura antigua e internacional


Existen dos tipos de dominios de jerarqua superior: en nomenclatura antigua y en nomenclatura internacional moderna. El formato antiguo se emplea principalmente en Estados Unidos y Canad y consiste en siete dominios de jerarqua superior, que son:

2
Nota: los domicilios de Internet no son sensibles a maysculas y minsculas, por lo que es lo mismo
teclear una direccin con letras maysculas o con letras minsculas o con una mezcla de ambas. Aunque es
una buena costumbre teclear cualquier direccin slo en minsculas.

82
Tabla 5.1

Internet
Dominios de jerarqua superior

Dominio

Signicado

com

Organizacin comercial

edu

Institucin educativa

gov

Institucin gubernamental

int

Organizacin internacional

mil

Ejrcito

net

Organizacin de redes

org

Organizacin no lucrativa

Este tipo de domicilio se desarroll para la antigua red Arpanet, ancestro de Internet, y
se dise slo para usarse en Estados Unidos.
Cuando Internet se expandi, fue claro que se necesitaba un mejor sistema. La solucin
consisti en usar dominios de jerarqua superior que representaban a pases. Para la mayora
de los pases, el dominio de jerarqua superior es la abreviatura internacional de dos letras.
Fuera de los Estados Unidos, virtualmente todos los sitios enlazados con Internet usan la
nomenclatura de domicilios internacional moderna, donde el dominio de jerarqua superior
muestra el cdigo del pas. Dentro de los Estados Unidos (y parte de Canad), la mayora de
las computadoras en Internet an utilizan la antigua nomenclatura de domicilios; es decir
el estilo con los dominios de jerarqua superior.

5.4. WWW
WWW signica World Wide Web o simplemente web. Es un proyecto desarrollado por
Tim Berners. El web es una coleccin de documentos interconectados en todo el mundo.
Los documentos en el web son usualmente conocidos como pginas web y poseen hipervnculos que enlazan una porcin de texto o una imagen a otro documento, normalmente
relacionado con el texto o la imagen.
Para acceder al web debes utilizar un navegador (browser). El navegador lee documentos dispuestos en el web y puede buscar documentos de otras fuentes. La informacin es
provista por los servidores de hipertexto de los cuales se pueden obtener los documentos.
Los navegadores pueden tambin acceder a archivos va FTP, NNTP, y otros protocolos
vlidos para Internet. Tambin permiten bsquedas en documentos y bases de datos. Los
documentos que los navegadores despliegan son documentos de hipertexto. El trmino hipertexto se dene como texto con apuntadores a otros textos. Los navegadores tratan con
los apuntadores de manera transparente. La ventaja del hipertexto es que en un documento

83

5.4 WWW

en hipertexto, si quieres ms informacin acerca de un tema en particular que fue mencionado, usualmente puedes hacer click sobre el tema para leer con ms detalle. De hecho, los
documentos pueden estar ligados a otros documentos de autores completamente diferentes, mucho como las referencias al pie de pgina, pero puedes sumergirte en ella de forma
instantnea.
El trmino hipermedia es un super conjunto de hipertexto; esto es, cualquier medio con
apuntadores a otro medio. Esto signica que los navegadores pueden desplegar no slo
archivos de texto, sino imgenes, sonidos o animaciones.
Existen diferentes sitios donde todos los usuarios pueden encontrar todo tipo de informacin y hacer bsquedas en la red. Por ejemplo:
Google: www.google.com
Yahoo: www.yahoo.com

5.4.1.

URL: especicacin de objetos en Internet


URL signica Uniform Resource Locator. Es un estndar para especicar un objeto en
Internet, tal como el nombre de un archivo. Los URL se ven como los que ac siguen:
ftp://ftp.fciencias.unam.mx/pub/cursos/677/tarea.txt
http://www.fciencias.unam.mx/admin/directorio.html
La primera parte del URL, antes de los dos puntos, especica el mtodo de acceso. La
parte del URL despus de las dos diagonales indica el nombre de la mquina y cada diagonal separa la ubicacin del archivo dentro de dicha mquina; en el caso del primer ejemplo
mencionado anteriormente se lee como: dentro de la mquina ftp.fciencias.unam.mx, utilizando el protocolo FTP, en la ruta pub/cursos/677 encontrars el archivo tarea.txt.
El mtodo de acceso http es acrnimo de HiperText Transfer Protocol y es el mtodo
de acceso ms comn, por lo que si no aparece un mtodo de acceso explcitamente, la
mayora de los sistemas suponen que se trata de http.

5.4.2.

Navegadores
El primer navegador fue desarrollado por Tim Berners-Lee en el CERN a nales de
1990 y principios de 1991. Despus surgi el navegador Mosaic, que funcionaba inicialmente en plataformas UNIX sobre X11; fue el primero que se extendi debido a las versiones para Windows y Macintosh que haba. Despus entr al mercado Netscape Navigator,
el cual super en capacidades y velocidad a Mosaic. Este navegador tiene la ventaja de
funcionar en casi todos los UNIX, as como en ambientes Windows.
Microsoft poco despus sac el navegador Internet Explorer, desbancando as a Netscape Navigator. En aos recientes Netscape Communications Corporation liber el cdigo

84

Internet

fuente de su navegador y de esta manera naci el proyecto Mozilla. Sin embargo ste fue
reescrito desde cero tras decidirse a desarrollar y usar como base un nuevo conjunto de
herramientas multiplataforma basado en XML llamado XUL.
A nales de 2004 apareci en el mercado Firefox, una rama de desarrollo de Mozilla
que pretende hacerse con parte del mercado de Internet Explorer. Se trata de un navegador
ms ligero que Mozilla.
La comunicacin entre el servidor web y el navegador se realiza mediante el protocolo
HTTP. Su funcin principal es mostrar documentos HTML en pantalla. En la actualidad,
no solamente se descargan este tipo de documentos sino tambin documentos con imgenes, sonidos e incluso videos en diferentes formatos. Adems, permiten almacenar la
informacin en el disco o crear marcadores (bookmarks) de las pginas ms visitadas.
Algunos de los navegadores web ms populares se incluyen en lo que se denomina una
Suite. Estas Suites disponen de varios programas integrados para leer noticias de Usenet y
correo electrnico mediante los protocolos NNTP, IMAP y POP.
Actualmente existen diferentes navegadores y todos cumplen con el mismo objetivo:
permitir al usuario recuperar y visualizar documentos de hipertexto, comnmente descritos
en HTML, desde servidores web de todo el mundo a travs de Internet. Algunos de los ms
utilizados en el mundo Linux son:
Firefox: http://www.mozilla.com
Opera: http://www.opera.com/
Konqueror (integrado con KDE)
Galeon (integrado con Gnome)

Navegadores web basados en texto:


Lynx: http://lynx.browser.org/
w3m: http://w3m.sourceforge.net/

Ya hemos utilizado Konqueror con anterioridad, pero lo hicimos para recorrer el sistema
de archivos; ahora lo utilizaremos adems para navegar el web.
Konqueror te da la oportunidad de teclear un URL directamente en el campo location
(o en la ventana de dialogo de URL File|Open|Location). Al usar el URL, Netscape traer
la pgina especicada tal como si hubieses hecho click en la liga. Nota que la etiqueta en
el campo location expresa la ubicacin despus de que trae la pgina, o Go to si editas el
campo.

85

5.4 WWW

Actividad 5.1
(a) Abre un navegador y visita la pgina de la Facultad de Ciencias de la U.N.A.M.
ubicada en http://www.fciencias.unam.mx
(b) Localiza los servicios en lnea para estudiantes.

5.4.3.

Google
Google es una compaa cuyo principal producto es el motor de bsqueda del mismo
nombre. Fue fundada el 27 de septiembre de 1998 por dos estudiantes de doctorado de la
Universidad de Stanford, Larry Page y Sergey Brin. Aunque su principal producto es el
buscador, la empresa tambin cuenta con otros servicios: un comparador de precios llamado Froogle, un motor de bsqueda para material almacenado en discos locales llamado
Google Desktop Search y un servicio de correo electrnico gratuito llamado Gmail, que ha
revolucionado los sistemas de correo electrnico en el web.
A continuacin se listan algunos de los servicios que ofrece Google actualmente:

Tabla 5.2

5.4.4.

Servicios comunes de Google

Buscadores

Servicios

Imgenes
Grupos
Directorio
Noticias

Gmail
Video
Maps
Calendar
Earth
Talk
Books

Wikipedia
La wikipedia es una enciclopedia gratuita a la cual todos los usuarios de Internet tenemos acceso. Est escrita por todos aquellos voluntarios que quieran colaborar con sus
conocimientos y exponerlos en este medio. Actualmente existe mucha gente que va mejorando la wikipedia, con cientos de ediciones por hora, que son registradas especcamente
en el historial y generalmente en los cambios recientes del sitio. Si alguna persona expone
sus ideas en forma inapropiada o simplemente escribe disparates, las personas encargadas
del contenido del sitio lo verican y descartan este tipo de informacin.
La wikipedia se encuentra disponible en varios idiomas, con distintos niveles de avance,
ya que la traduccin de artculos y entradas de la enciclopedia la realizan voluntarios. Entre

86

Internet

otros idiomas encontramos ingls (el de mayor cobertura), espaol, francs y alemn.
La carcterstica principal de la wikipedia es la posibilidad de editar los artculos de la
enciclopedia. En general, a los sitios web que permiten la edicin (en lnea y sin mayores
restricciones) de su contenido se les conoce como wikis.
El objetivo de la wikipedia es almacenar artculos sobre temas considerados enciclopdicos; sin embargo dentro de sta puedes encontrar otros proyectos de contenido diverso,
como:
Tabla 5.3

Otros servicios de la Wikipedia

Servicio

Descripcin

Wikinoticias
Wikiversidad
Wikilibros
Wikisource
Wikiquote
Meta-Wiki
Wikiespecies

El noticiario libre
La universidad libre
La casa editorial libre
La biblioteca libre
Citas y frases famosas
Coordinacin de proyectos
Directorio de especies

Cada uno de estos sitios se rigen bajo la misma losofa, permitirle a los usuarios que
as lo deseen, colaborar con la ampliacin del contenido del mismo, para de esta forma
ampliar cada uno de estos proyectos en el web de manera gratuita. Los temas ah descritos
son textos originales de dominio pblico.

5.5. Los programas de correo de Unix


Como ya habamos mencionado, Unix viene con un sistema de correo incorporado. La
parte ms importante de este sistema es su interfaz de usuario, es decir el programa que se
utiliza para enviar y leer correo.
Originalmente haba en todo sistema Unix un programa sencillo llamado mail. Era adecuado aunque con limitaciones. Despus fue reemplazado por mailx y Mail, que en realidad
son bastante similares entre s.
Existen otros ms como pine, elm, mush, rmail, y algo que tienen en comn estos sistemas es que extienden de gran forma la funcionalidad de mail, ofreciendo carctersticas
adicionales. Sin embargo nosotros veremos VM como lector de correo.

87

5.6 Netiquete

5.6. Netiquete
La palabra netiquete se deriva de dos raices, Net, que signica red y etiquete que se
reere az las reglas de etiqueta para comportarse en un cierto mbito, por lo que el trmino
se reere a la etiqueta que debemos seguir cuando usemos la red, es decir, son ciertas
reglas (de etiqueta) que sera deseable seguir cuando estemos utilizando cualquier forma
de comunicacin a travs de la red. Estas reglas no son obligatorias pero si deseables. En
resumen Netiquete se reere a la forma adecuada de comportarse en Internet.
Antes de entrar en materia, es esencial que cada usuario en la red reconozca su responsabilidad, al tener acceso a servicios, sitios, sistemas vastos y personas, pues es ste el
responsable por sus acciones al acceder a servicios de la red.
Internet, o la red, no es una simple red; es ms que eso: un grupo de miles de
redes individuales que han escogido permitir pasar trco entre ellas. El trco enviado a
Internet puede atravesar varias redes diferentes antes de llegar a su destino. Por eso, los
usuarios involucrados en estas redes interconectadas deben de estar informados de la carga
que imponen en otras redes participantes.
Como un usuario de la red, se te permite acceder a otras redes (y/o los sistemas de
computadora unidos a esas redes). Cada red o sistema tiene su propio grupo de polticas
y procedimientos. Acciones que estn rutinariamente permitidas en una red pueden estar
controladas, o igualmente prohibidas en otra red. Es responsabilidad de los usuarios regirse
por las polticas y procedimientos de estas otras redes. Recuerda, el hecho que un usuario
pueda ejecutar una accin particular no implica que deba tomar tal accin.
El uso de la red es un privilegio, no un derecho, que puede temporalmente ser revocado
en cualquier momento, por conducta abusiva. Tal conducta incluira el poner informacin
ilegal en un sistema; el uso abusivo o de, por otra parte, lenguaje inaceptable tanto en
mensajes pblicos o privados; el envo de mensajes que den como resultado la prdida de
trabajo del destinatario o de sus sistemas; el envo de artas cadena"; o la "transmisin"de
mensajes a listas o individuos y cualesquiera otros tipos de uso que causen congestin de
la red o que intereran con el trabajo de otros.

5.6.1.

Algunos puntos del netiquete para comunicacin electrnica


stas son algunas de las reglas que todo usuario de Internet debera cumplir:
El volumen y mantenimiento del buzn electrnico de un usuario es responsabilidad
del propio usuario.
Cuando cites a otra persona, borra cualquier cosa que no sea directamente aplicable
a tu respuesta. No permitas que tu email o software de Usenet cite automticamente
todo el cuerpo de los mensajes que se responden cuando no sea necesario. Tmate el

88

Internet

tiempo de editar lo citado a un mnimo como para proveer contexto a la respuesta. A


nadie le gusta leer un mensaje largo citado tres o cuatro veces, slo para ser seguido
por una lnea de respuesta como: "S, yo tambin".
Usa palabras en mayscula slo para destacar un punto importante o distinguir un
ttulo o cabecera. El usar palabras en mayscula que no sean ttulos suele ser considerado como GRITOS.
Nunca mandes cartas cadena por Internet. El hacerlo puede causarte la prdida de
tu acceso a Internet.
S cuidadoso cuando uses sarcasmo y humor. Sin comunicaciones cara a cara tu chiste puede verse como una crtica. Cuando trates de ser gracioso, usa emoticons para
expresar humor. (Voltea tu cabeza hacia la izquierda para ver el emoticon sonrisa: :-)
= carita de humor feliz).
Recuerda que algunas listas de discusin y grupos Usenet tienen miembros de muchos pases.
No des por hecho que ellos van a entender una referencia a un programa de TV,
pelculas, cultura popular o hechos actuales de tu propio pas. Si debes usar la
referencia, por favor explcala.
No des por hecho que ellos van a entender referencias geogrcas que son locales o nacionales.
Si alguien enva un comentario o pregunta fuera del tema de la lista, no respondas a
la lista y no mantengas el tema de fuera de la lista en la conversacin pblica.

Los 10 mandamientos de tica para la computadora


1. No debers usar una computadora para daar a otras personas.
2. No debers interferir con el trabajo de computadora de otras personas.
3. No debers entrometerte en los archivos de otras personas.
4. No debers usar una computadora para robar.
5. No debers usar una computadora para dar falso testimonio.
6. No debers usar o copiar software de manera que violes su licencia.
7. No debers usar recursos de computadora de otras personas sin autorizacin.
8. No debers apropiarte del trabajo intelectual de otras personas.
9. Debers pensar acerca de las consecuencias sociales del programa que escribes.
10. Debers usar una computadora en formas en que muestres consideracin y respeto.

5.7 KMail: lector de correo electrnico

89

5.7. KMail: lector de correo electrnico


5.7.1.

$ smart
install KMail

Figura 5.1

5.7.2.

Introduccin
KMail es un cliente de correo electrnico dentro del ambiente de escritorio de KDE y
parte del sistema Kontact. Soporta carpetas, ltrado, visualizacin de correo con HTML
y carcteres internacionales. Permite enviar correo a travs de un servidor de correo va
SMTP o Sendmail y recibir correo por los protocolos POP3 o IMAP. Tambin tiene compatibilidad para ltrar mensajes de correo a travs de antivirus o antispam que se encuentren
instalados en el sistema. En la gura 5.1 puedes ver la pantalla de KMail.
Ventana principal de KMail

Utilizando KMail
Seguramente ya habrs utilizado algn otro lector de correo, pero aqu te presentaremos
algunas de las ventajas que tiene KMail:

90

Internet

Filtros de mensajes.
Muchas veces se tienen problemas para ordenar los nuevos mensajes cuando llegan a
la bandeja de entrada. Los ltros te permiten realizar ciertas tareas automticamente
sobre los mensajes entrantes y llevar a cabo acciones manualmente sobre los mensajes
seleccionados en una carpeta.
Los ltros constan de criterios de ltrado, cuyas reglas determinan si un ltro aplica a
un mensaje; y una lista de acciones de ltro, que describe qu hacer con el mensaje.
Los ltros se consideran uno despus de otro, comenzando por el primero de la lista. El
primero en el que coincida el patrn de bsqueda ser ejecutado.
Patrones de bsqueda: Los criterios por los que un ltro puede buscar:
Mensaje. Busca en todo el mensaje (es decir cabeceras, cuerpo y adjuntos, si los hay).
Cuerpo. Busca en el cuerpo del mensaje (es decir, todo el mensaje salvo las cabeceras).
Cualquier cabecera. Busca en las cabeceras del mensaje.
Destinatarios. Busca en los campos Para y CC del encabezado del mensaje.
Tamao en bytes. Establece los lmites inferiores o superiores del tamao del mensaje.
Edad en das. Establece los lmites superiores o inferiores de la antigedad del mensaje.
Estado. Dene las restricciones al estado del mensaje.
Cualquier otro nombre. Busca el campo de la cabera indicado por ese nombre.
Acciones de ltrado.
El uso ms frecuente de los ltros es el de ordenar los mensajes entrantes en diferentes
carpetas. Las posibles acciones son:
Mover a carpeta. Esto mover el mensaje a otra carpeta, eliminndolo de su carpeta
actual si fuera necesario.
Copiar en carpeta. Copiar el mensaje en otra carpeta.
Denir identidad. Denir la identidad que se va a usar si respondes al mensaje.
Marcar. Esto permite marcar los mensajes como ledo, importante, reenviado o contestado.
Enviar MDN falso. Enviar un mensaje de noticacin de disposicin falso (es decir
un recibo de lectura) al remitente del mensaje.
Denir transporte. Esto establecer el mtodo de transporte (por ejemplo SMTP)
que se va a usar si respondes al mensaje.
Denir Responder. Modicar el campo Responder-a de este mensaje. Esto es til
para la listas de correo.
Reenviar. Reenviar el mensaje en la lnea a otras direcciones de correo electrnico.
Redirigir. Redirigir el mensaje como si hubiera sido para otra direccin de correo
electrnico.

5.7 KMail: lector de correo electrnico

91

Conrmar entrega. Intentar devolver un mensaje al remitente indicando que el mensaje ha sido entregado correctamente, si es que el remitente lo solicit.
Ejecutar orden. Ejecutar un programa, pero no modicar el mensaje. Aqu se pueden introducir lneas de comando complejas, ya que KMail hace uso de un intrprete
de comandos para ejecutarlas.
A travs de tubera. Esto enviar el mensaje a un programa.
Eliminar cabecera. Eliminar todos los campos de la cabecera del mensaje que contengan el nombre dado.
Aadir cabecera. Se aadir un nuevo campo de cabecera con el nombre dado y el
valor para el mensaje.
Reescribir cabecera. Buscar el campo de cabecera dado, modicar su contenido
y lo volver a escribir. La cadena de bsqueda se interpretar como una expresin
regular sensible a las maysculas.
Reproducir sonido. Reproducir el sonido especicado.
Optimizacin de ltrado.
El orden de los ltros tiene un impacto sobre la velocidad del proceso de ltrado.
Algunas formas de mejorar el ltrado son:
Detn el proceso de ltros tan pronto como sea posible.
Considera el costo de la evaluacin de las reglas de ltrado.
Comprueba el orden de tus ltros.
Firmar y cifrar mensajes con PGP o GnuPG.
Para congurar y usar el soporte PGP de KMail, es necesario tener PGP instalado y
congurado adecuadamente.
Asimismo, es necesario generar un par de claves (clave secreta y clave pblica) para
su identidad. Puedes hacer esto con la lnea de comandos pgp kg o gpg gen-key
respectivamente.
Para una mejor explicacion de este tema puedes revisar la seccion 5.10.
Entre las opciones para rmar y cifrar mensajes se encuentran:
Firmar mensajes. Edita tu mensaje como de costumbre en la ventana del editor de
KMail. Antes de enviar el mensaje, marca el icono Firmar mensaje en la barra de
herramientas de la ventana del editor. Luego, puedes enviar el mensaje.
Cifrar mensajes. Para enviar un mensaje cifrado a alguien del que tienes una clave
pblica, simplemente edita el mensaje en la ventana del editor. Antes de enviar el
mensaje, selecciona Cifrar mensaje en la barra de herramientas de la ventana del
editor. Luego enva el mensaje.
Enviar tu clave pblica. Elije en el men de la ventana del editor el submen Adjunt>Adjuntar clave pblica. Esto adjuntar la clave pblica que hayas denido para la
identidad de ese mensaje.
Recibir un mensaje cifra. Selecciona el mensaje y escribe tu frase de paso. Luego,

92

Internet

KMail intentar descifrar el mensaje y lo mostrar en texto plano si ha conseguido


descifrarlo con tu clave pblica.
Recibir una clave pblica. Puedes recibir una clave pblica como un adjunto, o va
http o ftp, para cifrar un mensaje al propietario de la clave. Luego puedes aadir esta
clave junto con el resto de claves pblicas tecleando
pgp ka nombre_archivo
en la lnea de rdenes (usando PGP) o tecleando
gpg import nombre_archivo
en la lnea de rdenes (usando GnuPG).
Anti correo basura.
KMail usa herramientas externas y especializadas para el correo basura. Algunas de las
herramientas admitidas son:
Bogolter. Bogolter es un ltro que detecta spam en la fase inicial de entrenamiento.
SpamAssassin. SpamAssassin es una herramienta que no necesita entrenamiento y
depende principalmente de su conguracin.
Filtro de correo de GMX. Usa el contenido del campo de encabezado del mensaje para
determinar si es o no correo basura.
Antivirus.
KMail usa herramientas externas y especializadas para la deteccin de virus dentro de
correos. La deteccin de mensajes que contienen virus se realiza deniendo acciones a
travs de una herramienta dentro de un ltro especial. Otro ltro tiene las reglas para
vericar los mensajes con virus detectados y acciones para marcarlos.
Seguridad.
Las opciones de seguridad relativas a la lectura de mensajes son:

Convertir HTML a texto plano.


Permitir a los mensajes cargar referencias externas desde Internet.
Disponer de las noticaciones de mensajes.
No enviar MDNs en respuesta a los mensajes cifrados.
Importar automticamente las claves y los certicados.

Las opciones de validacin S/MIME son:

Validar certicados usando CRL.


Validar certicados en lnea (OCSP).
Validar URL del OCSP.
Validar rma del OCSP.
Ignorar la URL para el servicio de certicados.
No comprobar las polticas de certicados.
No consultar nunca una CRL.
Obtener certicados de los emisores que no se tengan.
No realizar ninguna peticin HTTP.
Ignorar puntos de distribucin de certicados de CRL por http.

93

5.8 FTP

Usar el proxy HTTP del sistema.


Usar proxy para peticiones http.
No realizar ninguna peticin LDAP.
Ignorar los puntos de distribucin de certicados de CRL por LDAP.
Validar la mquina principal para las peticiones LDAP.
Groupware.
Hace posible almacenar las entradas de las aplicaciones de Kontact (KOrganizer, KAddressBook y KNotes).

5.8. FTP
FTP (File Transfer Protocol) se utiliza para transferir archivos entre dos computadoras,
generalmente conectadas va Internet. Cuando usas FTP, lo que realmente ests usando
es un programa llamado cliente, que se conecta con otra computadora que mantiene los
archivos, llamada servidor.

5.8.1.

Qu es un FTP annimo?
Muchos sistemas de computadoras a travs de Internet ofrecen archivos por medio de
FTP annimos. Esto signica que puedes acceder a una mquina sin necesidad de tener
una cuenta en esa mquina (es decir no tienes que ser un usuario ocial del sistema). Estos
servidores FTP annimos contienen software, archivos para congurar redes, imgenes,
canciones y todo tipo de informacin. Los archivos para las listas de correo electrnico con
frecuencia tambin estn almacenadas y todo est disponible a travs de un FTP annimo.
Una enorme cantidad de informacin est almacenada en estas mquinas y est lista para
cualquiera que la necesite.

5.8.2.

Comandos para FTP


Puedes usar los siguientes comandos para trasladar archivos. Algunos comandos de
FTP son los mismos para distintas computadoras, pero otros no. Tambin, algunos sitios de
FTP ofrecen distintos comandos, por eso es importante leer los archivos README en el
sitio. Usualmente FTP lista los comandos si tecleas help o (?). Tambin los comandos de
ayuda de la computadora pueden tener informacin acerca del FTP. Trata con cualquiera de
los siguientes comandos: % man FTP, % man ftpd, % help ftp, % ftp /?, % fftp -?, o % ftp
/h .
Algunos comandos disponibles en el sistema se muestran en la tabla 5.4

94
Tabla 5.4

Internet
Algunos comandos disponibles en el sistema

Comando

Descripcin

ascii

Cambia a modo ascii.

binary

Cambia a modo binario.

cd

Cambia de directorio en la computadora remota.

dir

Lista los archivos en el directorio actual en la computadora remota.

ls

Es parecido a dir, pero a veces muestra menos informacin.

get

Copia un archivo de la computadora remota a la tuya.

help

Brinda ayuda sobre el uso de los comandos con el programa ftp.

lcd

Cambia de directorio en tu computadora (la l es por local).

lpwd

Muestra el directorio actual (pwd) en tu computadora.

mget

Copia varios archivos de la computadora remota a la tuya.

pwd

Muestra el directorio actual de la computadora remota.

Un FTP annimo es un servicio que ofrecen muchas mquinas en Internet. Esto permite
que t ingreses en la mquina con un nombre de usuario annimo o seas un usuario con
nombre ftp.
Los archivos residen en discos y estn identicados por un nombre
, como
NETDISK, y el archivo que est en ese disco se identica como
NETDISK:[FAQ.INTERNET]FTP.FAQ.
Puedes cambiar de directorio tecleando:
% cd netdisk:[faq.internet]
% cd [faq.internet]
% cd faq
seguido de
% cd internet
Para acceso annimo, teclea
% ftp.simtel.net
usando como tu login anonymous y como password tu direccin de correo.

5.9 SSH: Secure Shell

95

Muchos sistemas brindan informacin acerca de cmo usar el sistema cuando entras
a l. Usualmente los archivos estn agrupados en grupos de archivos. Los formatos ms
comunes para preparar archivos para traslado o almacenamiento ms econmico son tar y
zip.
Actividad 5.2
i. Haz un ftp annimo a la mquina que sea el servidor.
ii. Ya en la mquina servidor busca y baja los archivos foo.tgz y bar.tgz, que se encuentran dentro del servidor.
iii. Gurdalos en un directorio llamado cosas_foo y brelos.

5.9. SSH: Secure Shell


$ smart
install ssh

5.9.1.

Secure Shell (SSH) es el reemplazo para rsh, rlogin, rcp y ftp. Encripta todo el trco
y proporciona varios niveles de autenticacin dependiendo de las necesidades. Entre las
principales caractersticas de Secure Shell se encuentran accesos remotos seguros a otra
mquina sobre una red, ejecucin de comandos en una mquina remota, mover y copiar
archivos de una mquina a otra. Proporciona una autenticacin fuerte y comunicaciones
seguras sobre canales inseguros. Adicionalmente, SSH proporciona conexiones seguras de
X y direccionamiento seguro de conecciones TCP arbitrarias.
Hay dos versiones principales del protocolo Secure Shell: SSH1 y SSH2. La versin
vieja SSH1 est siendo reemplazada por SSH2 para alcanzar una exibilidad mejorada,
mejor escalabilidad para organizaciones con cientos de usuarios y mejor seguridad. Actualmente hay funciones que se pueden encontrar en SSH1 que estn siendo trasladadas a
SSH2.
SSH trabaja cambiando y vericando informacin y usando llaves pblicas y privadas
para identicar servidores y usuarios. Despus proporciona cifrado para la comunicacin
subsecuente, tambin usando criptografa de llaves pblicas y privadas. Cada sistema tiene su propio par de llaves pblicas y privadas que identican a otros sistemas. Una llave
pblica de un sistema cliente puede colocarse en un archivo del servidor para permitir al
servidor la autenticacin del cliente por medio de un intercambio de llaves.

Accediendo a sistemas remotos


Para establecer una conexin interactiva a un sistema remoto debes usar el comando
ssh. Supongamos que eres el usuario Juan.Perez en el cliente beta.fciencias.unam.mx
y quieres conectarte a lambda.fciencias.unam.mx; debes de usar el comando ssh y como
nico parmetro el nombre del sistema remoto.

96

Internet

%
%
%
%

beta# ssh lambda.fciencias.unam.mx


Juan.Perez@lambda.fciencias.unam.mxs password:
Authentication successful.
lambda#

Ahora, si el nombre de tu cuenta en el sistema remoto diere del que usas en el sistema
local (desde donde te ests conectando) debes agregar al parmetro tu nombre en el sistema remoto seguido de una @, como en tu direccin electrnica. Por ejemplo, supn que
el nombre en el sistema remoto es Juan.Perez. As, para conectarse a lambda como el
usuario Juan.Perez debemos usar:
%
%
%
%

beta# ssh Juan.Perez@lambda.fciencias.unam.mx


Juan.Perez@lambda.fciencias.unam.mxs password:
Authentication successful.
lambda#

La sintaxis simplicada para conexiones remotas con ssh es:


ssh [opciones] [usuario@]sistema_remoto
Actividad 5.3 Inicia una sesin remota en la mquina que tengas a tu lado usando tu
mismo nombre de usuario.
Actividad 5.4 Inicia una sesin remota en el.servidor.temporal como el usuario
guest.

5.9.2.

Copiando archivos entre sistemas


Puedes copiar archivos del sistema local a una mquina remota o viceversa, o an entre
dos sistemas remotos usando el comando scp. Para especicar un archivo en un sistema
remoto simplemente hay que agregar como prejo el nombre del sistema remoto seguido
de dos puntos (:).
La sintaxis simplicada para copiar archivos a sistemas remotos de forma segura con
scp es:
scp [[usuario@]sistema_orig:]archivo [[usuario@]sistema_dest:]archivo_o_dir

Si no tecleas el nombre del archivo donde se copiar o no especicas un directorio,


se usar el nombre del origen. Una forma sencilla de obtener una copia de un archivo
remoto en el directorio actual es usando un punto como destino; por ejemplo, para copiar
el archivo hola de la mquina beta al directorio donde estamos actualmente y usando el
mismo nombre de usuario, hacemos lo siguiente:

5.10 PGP: Pretty Good Privacy

97

% omega# scp @beta:hola .


foos password:
hola | 154B | 0.0 kB/s | TOC: 00:00:03 | 100
omega# ls
hola
Para copiar el archivo hola-Mundo del usuario ivanx en la mquina lambda al usuario
kar en la mquina beta usamos:
% kappa# scp ivanx@lambda:holaMundo kar@beta:
ivanx@lambdas password:
kar@betas password:
holaMundo | 34B | 0.0 kB/s | TOC: 00:00:01 | 100
Nota que la copia fue en dos mquinas remotas, pues la mquina local es kappa.
Para copiar un directorio completo, tenemos que usar la bandera r; por ejemplo, si
quiero copiar el directorio tarea1, tecleo:
% omega# scp -r @beta:tarea1 .
ivanxs password:
Actividad 5.5
Copia un archivo de la mquina local a una mquina remota como el mismo usuario
y despus como un usuario diferente.
Copia un archivo de una mquina remota a la mquina local como el mismo usuario
y despus como un usuario diferente.
Copia un archivo entre dos mquinas remotas.
Copia un directorio entre cualesquiera dos mquinas.

5.10. PGP: Pretty Good Privacy


PGP (Pretty Good Privacy) es un sistema de autenticacin y cifrado basado en una
tecnologa llamada criptografa de llave pblica, escrito por Philip Zimmermann en 1991;
permite que nadie, excepto uno mismo y el destinatario o destinatarios a los que vaya
dirigido, pueda leer el mensaje, gracias a que los stos estn codicados. Asimismo puede
usarse para comprobar la autenticidad del mensaje asegurndonos que en verdad lo ha
escrito el remitente.
Tambin se utiliza para enviar archivos a travs de correo electrnico codicados en
formato ASCII; resulta mucho mejor que otros sistemas como el uuencode, ya que PGP
realiza una compresin zip al documento que va a codicar.

98

5.10.1.

Internet

Funcionamiento de PGP

El funcionamiento de PGP es muy sencillo: cada usuario tiene dos llaves una pblica y
otra privada; la pblica es la que distribuyes a la gente y sirve para que ellos puedan enviarte
un mensaje codicado que slo t, mediante tu llave privada, podrs descifrar; tambin
puede servir para rmar un mensaje poniendo una parte de tu llave privada (irreconocible
claro) dentro de una rma. Esto es como un certicado de autenticidad, ya que al recibir el
mensaje, PGP comprueba la rma y texto y lo compara con la llave pblica que tenemos
del remitente, dando un error si se ha cambiado algo en el texto o la rma no corresponde
a la persona que nos enva el mensaje.
El cifrado de PGP utiliza la criptografa de llave pblica e incluye un sistema que asocia
las llaves pblicas con cada uno de los usuarios. El cifrado de correo electrnico a travs de
PGP utiliza algoritmos de cifrado de llaves asimtricas: el remitente utiliza la llave pblica
del destinatario para cifrar una llave compartida; esta llave compartida se usa para cifrar
el mensaje; despus el destinatario que recibe el correo cifrado lo desencripta (o descifra)
usando su llave privada.
Una estrategia similar se utiliza para detectar cuando un mensaje ha sido alterado o para
autenticar que fue enviado realmente por la persona que dice ser el remitente. El remitente
utiliza el cifrado de PGP para crear una rma digital para el mensaje con algoritmos de
RSA o DSA. Para esto, PGP calcula un identicador nico(hash) para el mensaje y despus crea la rma digital de dicho identicador, usando la llave privada del remitente. El
destinatario del mensaje calcula el identicador del mensaje recibido y despus lo utiliza
junto con la llave pblica del remitente, dentro del algoritmo de la rma, para crear su propia rma digital del mensaje recibido. Si esta rma coincide con la rma que contena el
mensaje recibido, entonces se puede decir que el mensaje recibido no ha sido corrompido
deliberadamente o accidentalmente, puesto que fue rmado correctamente.
No existe un mtodo que pueda romper el cifrado PGP por medios criptogrcos o de
cmputo. Adems, en comparacin con otros protocolos de seguridad, como SSL que slo
protegen la informacin momentneamente mientras estn en trnsito a su destino, PGP
puede ser utilizada para proteger la informacin en medios de almacenamiento de larga
duracin como discos duros. La seguridad en el mtodo de cifrado PGP se basa en el hecho
de que los algoritmos utilizados son inquebrantables con las tcnicas del criptoanlisis
moderno.

5.11 RSS: sistema de noticias

99

5.11. RSS: sistema de noticias


5.11.1.

Introduccin
RSS es parte de la familia de formatos XML (una especicacin genrica para formatos
de datos) desarrollado especcamente para sitios que se actualicen con frecuencia y por
medio del cual se puede compartir la informacin y usarla en otros sitios web o programas.
A esto se le conoce como redifusin o sindicacin.
El RSS no es otra cosa que un formato de datos que es utilizado para difundir contenidos
de un sitio web. El formato permite distribuir contenido sin necesidad de un navegador. Las
iniciales RSS se usa para los siguientes estndares:
Rich Site Summary (RSS 0.91)
RDF Site Summary (RSS 0.9 y 1.0)
Really Simple Syndication (RSS 2.0)
Los programas que leen y presentan fuentes RSS de diferentes procedencias se denominan agregadores. Gracias a los agregadores o lectores de feeds (programas o sitios que
permiten leer fuentes RSS), se pueden obtener resmenes de todos los sitios que se desee
desde tu correo electrnico o por medio de aplicaciones web que funcionan como agregadores. No es necesario abrir el navegador y visitar decenas de paginas web.

5.11.2.
$ smart
install
Akregator

Akregator
Akregator es un lector de RSS como parte de la integracin de KDE utilizado principalmente en sistemas UNIX. RSS contiene noticias y actualizaciones de sitios Web y Web
logs. Los fuentes de RSS pueden ordenarse dentro de categoras, se pueden hacer bsquedas incrementales para los ttulos de todas las entradas de la base de datos y Akregator
puede ser congurado para que actualice los fuentes en intervalos regulares de tiempo.
Provee integracin con Konqueror y un navegador interno para leer noticias.

5.1 RSS

El lector de RSS en Gnome es blam, est escrito en C# para el proyecto Mono y GTK#.

Utilizando Akregator
Una vez instalado, Akgregator se encuentra en en el men principal, dentro de la categora de Internet; o puedes iniciarlo desde una terminal con el comando akgregator. Akregator

5.12 Mensajera instantnea

101

Integracin
Dentro de las opciones de conguracin de Akregator, puedes establecer que el sistema
actualice todas las noticias en intervalos regulares de tiempo y que cada vez que ha sido
descargada una noticia nueva el sistema te mande una noticacin.
Akregator est integrado dentro de Konqueror en el sentido de que permite agregar noticias RSS al sistema de Akregator desde un navegador Konqueror y viceversa, Konqueror
est integrado dentro de Akregator en el sentido en que estando dentro de Akregator es
posible navegar a travs de pginas web.
Si pensabas que no era posible tener mayor integracin dentro de aplicaciones KDE, los
usuarios de Kontact estarn acostumbrados a tener todas sus aplicaciones de informacin
personal en un solo lugar y Akregator tambin permite tener un mdulo de Kontact de
forma que todas tus noticias de RSS estn disponibles dentro de tu correo electrnico,
calendario y dems entretenimientos.

5.12. Mensajera instantnea


5.12.1.

Introduccin
La mensajera instantnea (IM) es una manera para comunicarse de manera inmediata
con personas a travs de Internet. Te permite tener una conversacin casi tan natural como
en el telfono o cara a cara, tecleando mensajes en una ventana compartida entre t y la
otra persona.
Adems permite ver el estado en que se encuentran las personas, esto es, si estn actualmente conectadas al mismo tiempo que t, de manera que despliega un mensaje IM en
la pantalla de la otra persona tan pronto como se enva. O se puede cambiar el estado si
preeres no ser interrumpido, y as otros sabrn que no deben contactarte.

5.12.2.
$ smart
install
kopete

Kopete
Kopete es un cliente de mensajera instantnea, desarrollado por y para el ambiente
grco de KDE. Te permite comunicarte con amigos utilizando varios servicios de mensajera instantnea. Proviene de la palabra chilena copete utilizada para referirse a bebidas
alcohlicas.
Kopete soporta los siguientes protocolos:
AOL Instant Messenger
Gadu-Gadu

102

Internet

ICQ
Internet Relay Chat
Jabber (XMPP)
MSN Messenger
Novell GroupWise
SMS
Skype (via Kopete Skype)
Yahoo! Messenger
Lotus Sametime
La idea es tener una nica herramienta que permita acceder a los diferentes sistemas
de mensajera instantnea de una manera fcil de utilizar. El sistema est integrado con
otras aplicaciones KDE de manera que te permite acceder a los contactos de la agenda
de direcciones y otras utileras proporcionadas. Tambin provee herramientas para guardar conversaciones, cifrado de mensajes, ltrado de contactos e intercambio de archivos;
adems es un sistema extensible al que se le pueden agregar fcilmente nuevos accesorios
como protocolos de comunicacin, edicin en LATEX, traductores de texto, etc.
Kopete introduce la idea de metacontactos, que permite combinar las diferentes formas que tienes de contactar a alguien en una sola persona. Otras aplicaciones listan a una
misma persona con varias cuentas de mensajera de manera separada (como si se tratara
de personas diferentes por tener diferentes cuentas de mensajera); un metacontacto es una
persona y los contactos son las diferentes formas de comunicacin con sta. As, los contactos se reconocen fcilmente mediante iconos pequeos que representan el protocolo de
comunicacin que puedes utilizar.

Empezando a utilizar Kopete


Probablemente ya cuentes con un servicio de mensajera instantnea, tanto porque ya
uses IM, como porque necesitas usar el mismo servicio que tus amigos. Si no es as, te recomendamos utilizar un servicio de mensajera instantnea basado en estndares abiertos,
porque stos estn diseados para ser usados con software libre. Los servicios de mensajera, basados en estndares abiertos que Kopete soporta son Jabber e IRC.
La siguiente seccin supone que ya ests registrado con un servicio de IM.
Puedes iniciar Kopete desde el men de KDE, eligiendo Internet y dentro de este submen
Kopete; desde la barra de herramientas seleccionando el icono correspondiente, como se
muestra en la gura 5.3; o en una terminal con el comando kopete. Utilizando el men de
KDE localiza la seccin de internet, que mostrar todos los servicios de internet disponibles
en tu sistema y selecciona kopete.

5.12 Mensajera instantnea

105

Agregar contactos.
Renombrar contactos.
Eliminar contactos.
Salir de Kopete. Si solamente se cierra la ventana el programa continuar ejecutndose en la bandeja de sistema de KDE.
Ventana de conversacin. La Ventana de conversacin es el lugar donde realizas la conversacin. Los mensajes aparecen en el orden en que se reciben, con los mensajes
anteriores en la parte superior de la vista.
Entre los aspectos que contiene la ventana de conversacin se encuentran:
Lista de miembros de conversacin. Algunos sistemas de IM permiten conversar en
grupo.
rea de entrada. Aqu es donde se pueden teclear mensajes antes de enviarlos.
Barra de estado. La barra de estado contiene mensajes temporales, la noticacin de
que alguien ms est tecleando y el botn Enviar.
Pestaas. Kopete permite llevar mltiples conversaciones en una ventana, colocando
cada una en su propia pestaa dentro de la ventana.

5.12.5.

Extensiones
Kopete ofrece extensiones que proveen funciones que no son esenciales para la mensajera, pero son tiles, entre las que se encuentran:
Auto reemplazo de texto, que permite corregir palabras mal escritas o guardar palabras
usando abreviaturas.
Criptografa, que permite usar GnuPG para cifrar conversaciones.
Respuesta a mensajes particulares, como resaltar texto o reproducir sonidos.
Guardar conversaciones usando cualquier sistema de IM.
KopeteTex, que permite mantener conversaciones utilizando el lenguaje de marcas
LaTeX.
Auto-ausente por movimiento.
Permite a la gente con la que ests conversando en ese momento saber qu msica
ests escuchando.
Estadsticas con informacin sobre el patrn de actividad de tus contactos.
Efectos de texto.
Traductor que permite denir un idioma para cada contacto.

106

Internet

5.13. Rdesktop: Remote Desktop Protocol Client


Rdesktop es un cliente RDP(Remote Desktop Protocol)3 para la mayora de los sistemas
Unix, como son Linux o FreeBSD. Fue creado por Matthew Chapman. Es una herramienta
libre y de cdigo abierto, escrita bajo la licencia de GNU (General Public License) que
permite al usuario interactuar con terminales Windows NT/2000.

5.13.1.

Utilizando Rdesktop
Rdesktop inicia indicndole al programa cul es la computadora Windows a la que se
quiere conectar. Puedes iniciar el programa desde una terminal con el comando
% rdesktop 192.168.1.10.
Esto lo que hace es arrancar el programa e iniciar una sesin en la mquina indicada,
es decir, abre una ventana de autenticacin de Windows en la mquina con direccin IP
192.168.1.10. El servidor utiliza por defecto el puerto TCP 3389.

5.3 rdesktop en Gnome

La interfaz grca dentro de Gnome para utilizar el cliente de Rdesktop es grdesktop y


funciona de manera muy similar a krdc.
La manera ms comn de utilizar Rdesktop es dentro de aplicaciones linux distribuidas
sobre clientes delgados, de forma que los clientes delgados arrancan dentro de una red y se
conectan a un servidor Windows utilizando Rdesktop.

5.14. Kontact, una suite de productividad en KDE


Kontact es un conjunto de programas para manejo de informacin personal que ofrece
KDE. Est integrado a partir de varios componentes, de los cuales la mayora son aplicaciones por s mismas, pero aparecen embebidas dentro de kontact. ste se encarga de
integrarlos para tener un solo punto de acceso a ellos y permitir que interacten entre s.
3
El protocolo RDP es un protocolo de aplicacin multi-canal que permite a los usuarios conectarse a
computadoras con sistemas operativos Windows; adems no se necesita tener un ancho de banda muy grande
(un modem de 56K es suciente)

108

Internet

cmo congurar cada una de ellas para realizar slo las operaciones ms sencillas.

5.14.1.

Resumen
ste es un componente especco de Kontact, donde se le presenta al usuario un resumen de la informacin contenida en los dems aspectos de Kontact. Permite que de forma
rpida te enteres de los eventos relevantes al da actual, como pueden ser las ltimas noticias, fechas importantes (cumpleaos o aniversarios) o tal vez asuntos pendientes.

5.14.2.

Correo, KMail
Kontact utiliza a KMail como el lector de correo. La conguracin y uso de esta aplicacin ya se revis en la seccin 5.7.

5.14.3.

Contactos, KAddressBook
Para poder mantener de forma organizada la lista de todas las personas con las que
tratas, es necesario que lleves una libreta de direcciones. La aplicacin que te permite hacer
eso en KDE es KAddressBook. Aqu puedes mantener toda la informacin de tus contactos
y hacer uso de ella con distintas aplicaciones de KDE como KMail o Kopete.
KAddressBook te permite organizar tus contactos en distintas agendas. Esto es til si
quieres tener una agenda con tus contactos personales en tu computadora, pero tambin
quieres tener acceso a una agenda con los contactos de tu trabajo. Si esa agenda la exportan
mediante algn servidor de groupware, KAddressBook puede acceder a ella y permitir que
el resto de tus aplicaciones KDE hagan uso de esa informacin. Lo primero que se necesita
para empezar a utilizar KAddressBook es tener una agenda, aun cuando te provee de una
por omisin. En la gura 5.6 se muestra la ventana inicial de KAddressBook. En la seccin
1 se muestran los contactos pertenecientes a las agendas seleccionadas. En la seccin 2 se
muestran las agendas que estn disponibles, y cuales estn seleccionadas. En la seccin 3
se muestran los datos del contacto seleccionado.

Creando una nueva agenda


Cuando creamos una nueva agenda es necesario indicarle a KAddressBook en donde
se encuentra la informacin correspondiente a nuestros contactos, esta puede estar en la
misma computadora en la que se esta arrancando esta aplicacin o bien puede estar en una
mquina remota. La ventaja de tener una agenda en una mquina remota radica en poder
compartir contactos con distintas personas, y poder acceder a esa informacin desde diferentes computadoras. Existen varias formas para hacer eso, pero en este captulo veremos

122

Internet

5.15.1.

VM

5.1 Rmail y Gnus

Adems de VM, Emacs cuenta con varios subsistemas ms para leer y enviar correo electrnico. Los ms importantes son Rmail y Gnus. El primero, Rmail, es un lector de correo
muy sencillo, mientras que el segundo, Gnus, naci como un lector de noticias (USENET)
al que le agregaron opciones de correo.
Gnus es un sistema tan grande y completo como VM y una excelente alternativa. Desafortunadamente ha cado un poco en desuso, por lo que no lo revisaremos.
$ smart
install vm

VM (siglas de View Mail, en ingls) es un subsistema de Emacs que te permite manejar tu correo electrnico desde Emacs. Como la mayora de los lectores de correo, VM
te permite leer correos, contestarlos, reenviarlos y otras acciones ms. Sin embargo, tambin tiene algunas funciones avanzadas como creacin de resmenes (digest), el reenvo de
mensajes y la organizacin de los mismos de acuerdo a ciertos criterios.
Para iniciar VM basta que teclees el comando M-x vm y aunque esto funcionar y te
mostrar la cara de VM, no te lo recomendamos hasta concluir la siguiente seccin, donde
te ensearemos a congurar VM para leer tu correo.

Iniciando con VM
VM es probablemente uno de los subsistemas ms grandes que cubriremos en este
libro probablemente con la excepcin de AUCTEX en la seccin 6.12 tanto as que
por la cantidad de variables que puedes modicar, VM utiliza un archivo de conguracin
distinto del /.emacs, que se llama /.vm.
Despus de ejecutar vm, si hay mensajes en tu bandeja de entrada VM selecciona el
primero de los mensajes no ledos y te muestra una vista previa. Estas vistas previas son la
manera de VM de mostrarte parte del mensaje y permitirte decidir si quieres verlo completo
o no. Si deseas verlo completo, con Space (vm-scroll-forward) puedes hacerlo. Nota que
este comando hace dos cosas distintas, primero te muestra el inicio del mensaje y, si ste
es ms largo que la ventana actual, ejecuciones subsecuentes del comando (tecla Space )
paginan el contenido del mensaje.
Si no deseas ver el mensaje que VM muestra, con n (vm-next-message) puedes
cambiarte al siguiente mensaje, si es que hay otro.
Puedes guardar el mensaje que ests viendo con s (vm-save-message) o borrarlo
tecleando d (vm-delete-message); sin embargo, el mensaje no se borra inmediatamente,
sino que VM pone una marca en l para borrarlo ms tarde. Esto es importante, porque

123

5.15 Emacs

si te arrepientes acerca de borrar el mensaje, puedes seleccionarlo y presionar u (vmundelete-message) y rescatas el mensaje.
La accin de eliminar para siempre los mensajes borrados se conoce como expulsin y
se logra tecleando # # # (vm-expunge-folder).
Puedes utilizar h (vm-summarize) para que VM te muestre una ventana con un resumen del contenido de la carpeta actual. En esta lista aparecen los mensajes presentados por
nmero de mensaje, con el autor, fecha, tamao (en lneas y bytes) y el asunto del mensaje.
Adems, a la izquierda de cada resumen, aparecen una serie de letras que te indican, entre
otros, si el mensaje es nuevo, no ledo o marcado para ser borrado.
Una vez que terminas de leer y manejar tu correo, debes guardar la carpeta actual para
que la prxima vez que entres a VM, ste sepa cules ya fueron ledos, cules ya contestaste, etc. La tecla S (vm-save-folder) salva la carpeta. Puedes optar por terminar la visita
de esta carpeta con q (vm-quit), que salva la carpeta antes de terminar su revisin.
En cualquier momento durante tu sesin de VM puedes utilizar el comando g (vmget-new-mail) para revisar si arribaron nuevos mensajes para esta carpeta. Si hay nuevos
mensajes, este comando los mover de la bandeja de entrada (en ingls spool) a la carpeta
actual.

Tu carpeta de correo base


Por omisin VM intentar asociar tu buzn local con tu carpeta de correo base, por
lo que si este comportamiento no es adecuado, y en la mayora de los casos no lo ser,
debes indicarle dnde vive tu correo. Por ejemplo, nuestro viejo amigo Juan Prez tiene lo
siguiente en su /.vm para indicarle a VM de dnde debe obtener el correo nuevo:
1
2
3
4
5
6

( s e t q vmspool f i l e s
( ( " ~ / INBOX "
" imaps s l : g a l a d r i e l . f c i e n c i a s . unam . mx: 9 9 3 :
i n b o x : l o g i n : Juan . Perez : "
" ~ / INBOX .CRASH " ) )
)

Como puedes apreciar, la variable vm-spool-les recibe una lista de listas. Esto signica
varias cosas. Primero, que VM puede manejar varias bandejas de correo electrnico distintas, sin importar si stas son bandejas locales o remotas. Segundo y menos obvio, que
puedes asociar en una misma carpeta correo proveniente de diversas fuentes. La sintaxis
para especicar cada una de las fuentes de correo, es decir cada una de las listas internas
de esta variable, es utilizar tres cadenas que representen, en este orden, una carpeta, una
bandeja de entrada de correo y una carpeta de recuperacin.
VM tiene por omisin una carpeta de entrada para correo llamada /INBOX y, como
puedes ver en el ejemplo arriba (lnea 2), es la carpeta que utiliz Juan para congurar su
correo. La carpeta de recuperacin (en este caso el valor por omisin es /INBOX.CRASH)
la utiliza VM para almacenar inicialmente todos los mensajes extrados de la bandeja de

124

Internet

entrada de correo; despus procesa todos los mensajes almacenados en la carpeta de recuperacin y los mueve a la carpeta de entrada.
Gracias a esto ltimo, VM ofrece un excelente soporte para errores, ya que si algo sale
mal durante el proceso de tu correo o se interrumpe la ejecucin de Emacs por cualquier
motivo, tu correo no se pierde y cuando ejecutes VM nuevamente, ste buscar en la bandeja de entrada y la carpeta de recuperacin, y procesar los mensajes que encuentre y los
mover a tu carpeta de inicio.
Finalmente, en las lneas 3 y 4 del ejemplo de conguracin arriba5 , Juan le indica a
VM que para acceder a su correo tiene que utilizar estos parmetros:

Protocolo: El protocolo que soporta el servidor de correo donde Juan tiene su cuenta es
IMAP y requiere cifrado con SSL. VM adems soporta los protocolos de correo local
y POP3.

Servidor: El servidor es galadriel.fciencias.unam.mx.


Puerto: 993, que es el puerto estndar para IMAP sobre SSL. El puerto usual para IMAP
es 143, para POP3 el 110 y para POP3 sobre SSL el 995.

Bandeja de entrada: La bandeja de entrada en el servidor es inbox.


Mecanismo de autenticacin: El mecanismo para que Juan se autentique con el
servidor que utiliza en este caso es login, pero VM tambin soporta preauth y crammd5, que son mecanismos comunes en muchos servidores IMAP sobre SSL.

Direccin de correo: Juan adems le indica a VM que su cuenta de correo en el servidor tiene el identicador Juan.Perez.

Contrasea: Finalmente, por razones de seguridad, Juan le indica a VM que la contrasea para acceder al servidor deber solicitarla (utilizando el mini-buffer) cada vez
que l quiera acceder a su carpeta de inicio.
Una vez que VM recibe la contrasea y logra autenticarse exitosamente con el servidor, almacena la contrasea por el resto de la sesin, por lo que Juan solamente debe
teclear su contrasea una vez durante su sesin actual de Emacs.

Seleccin de mensajes
Para poder leer, borrar o realizar cualquier accin con un mensaje, primero debes seleccionarlo o, en terminologa VM, convertirlo en el mensaje actual. La mayora de los
comandos de VM surten efecto sobre el mensaje actual.
5

En realidad estas dos lneas (3 y 4) deben aparecer como una sola, pero la dividimos en dos por razones
de legibilidad.

125

5.15 Emacs

Estos son los principales comandos para seleccionar mensajes en VM:


Tabla 5.5

Emacs: comandos de seleccin de VM

Enlace

Comando/Descripcin

(vm-next-message) se mueve hacia adelante en la carpeta actual. Salta mensajes marcados como borrados.

(vm-prev-message) se mueve hacia atrs en la carpeta actual.


Salta mensajes marcados como borrados.

Enter

(vm-goto-message) te pedir un nmero de mensaje, N , y saltar a ese mensaje.

Tab

(vm-goto-message-last-seen) te llevar al ltimo mensaje


revisado.

M-n

M-s

(vm-{next|prev}-message-no-skip) selecciona el mensaje siguiente (anterior), sin importar si est marcado como ledo o
no.

M-p

(vm-{next(prev)}-unread-message) se mueve hacia adelante


(atrs) hasta encontrar el siguiente (anterior) mensaje no ledo.
(vm-isearch-forward) funciona como la bsqueda incremental de Emacs, excepto que cuando termina la bsqueda VM te
muestra el mensaje en el que termin el punto.

Si deseas que los comandos bsicos n y p se salten tambin los mensajes ledos, debes asignar t a la variable vm-skip-read-messages; y si adems deseas que los mensajes
en la carpeta VM los recorra como en una lista circular, es decir que al llegar al ltimo y
seleccionar el siguiente (con n ), VM te lleve al primer mensaje, tambin debes asignar t a
la variable vm-circular-folders.
Una vez seleccionado un mensaje VM te lo mostrar. Como ya mencionamos anteriormente, esto es un trabajo de dos pasos: vista previa y mensaje completo.
La vista previa te muestra una pequea parte del mensaje para que puedas decidir si
quieres o no verlo completo. Con Space accedes al mensaje completo y puedes paginarlo.

Soporte en VM para MIME


VM tiene soporte para los dos mecanismos de codicacin MIME (Multipurpose Internet Mail Extensions) que son Quoted-Printable y BASE64. En general, MIME asegura
que la transmisin de los mensajes se realiza sin errores y dene ciertos tipos de contenidos
vlidos.

126

Internet

Existen variables en VM que te permiten controlar si deseas o no ver ciertos contenidos


MIME. Por ejemplo, vm-auto-displayed-mime-content-types, cuyo valor por omisin
es ("textimagemultipart") y que incluye algunos de los valores comunes para mensajes de
correo codicados con MIME.

Enviando mensajes
Cuando envas mensajes desde VM utilizas el modo mayor Mail de Emacs, ms algunas
extensiones con los siguientes enlaces:
Tabla 5.6

Emacs: comandos para manipular la composicin de correo en VM

Enlace

Comando/Descripcin

C-c C-y

(vm-yank-message) copia un mensaje de la carpeta padre al buffer de composicin. Lee el nmero de mensaje deseado del minibuffer. Por omisin, a cada lnea del mensaje copiado se le agrega
el valor de la variable vm-included-text-prex, cuyo valor por
omisin es " > ".

C-c C-a

(vm-mime-attach-le) anexa un archivo a la composicin. Cuando enves el mensaje, VM insertar el archivo y lo codicar utilizando MIME.

C-c C-m

(vm-mime-attach-message) anexa un mensaje de correo a la


composicin. Te preguntar el nmero del mensaje que anexar y
cuando enves tu correo, VM aadir el mensaje como un digerido
MIME.

C-c C-b

(vm-mime-attach-buffer) aade un buffer de Emacs a la composicin.

C-c C-e

(vm-mime-encode-composition) codica el mensaje elaborado


utilizando MIME, pero no lo enva. Esto es til si quieres rmar el
mensaje con PGP antes de enviarlo. Despus de esto puedes enviar
el mensaje con C-c C-c .

C-c C-p

(vm-preview-composition) Te muestra una vista previa del mensaje actual en elaboracin. En la vista previa todos los comandos
tpicos de VM estn disponibles y con q continas la composicin.

La forma ms simple de iniciar un buffer de composicin es con el comando m (vmmail).


En caso de que el mensaje sea rechazado y regresado por cualquier motivo, puedes re-

127

5.15 Emacs

enviar el mensaje utilizando M-r (vm-resend-bounced-message). Este mensaje tendr


un nuevo encabezado Resent-To donde debes poner la direccin correcta del receptor que
fue rechazado.
Los comandos ms interesantes de Mail y que son heredados por VM son:
Tabla 5.7

Emacs: comandos de Mail

Enlace

Comando/Descripcin

C-c C-s

(mail-send) enva el mensaje y mantiene el buffer de


composicin seleccionado.

C-c C-c

(mail-send-and-exit) enva el mensaje y selecciona


otro buffer. Este es el comando ms comn para concluir la composicin de mensajes y enviarlos.

C-c C-f C-t

(mail-to) mueve el punto al encabezado To, creando


uno si no existe.

C-c C-f C-s

(mail-subject) mueve el punto al encabezado Subject,


creando uno si no existe.

C-c C-f C-c

(mail-cc) mueve el punto al encabezado Cc, creando


uno si no existe.

Iniciar una nueva composicin de correo es tan usual como contestar a un mensaje
recibido y VM hace muy sencillo lograrlo. Cuando contestas un mensaje desde VM, ste
se encarga de llenar los encabezados de destinatario (To) y asunto (Subject), anexando Re:
al asunto del mensaje, que es la forma estndar de indicar que es una respuesta.
VM tambin puede ayudarte a citar material del mensaje al que contestas y lo identica
anexando el valor de la variable vm-included-text-prex.
Los comandos para contestar son:
Tabla 5.8

Emacs: comandos para contestar correo en VM

Enlace

Comando/Descripcin

(vm-reply) contesta al autor del mensaje actual.

(vm-reply-include-text) contesta al autor del mensaje actual y cita el


cuerpo del mensaje.

(vm-followup) contesta a todos los receptores del mensaje actual.

(vm-followup-include-text) contesta a todos los receptores del mensaje actual y cita el cuerpo del mensaje.

VM ofrece adems tres comandos para traspasar o enviar mensajes que recibes a otros

128

Internet

receptores. stos son:


Tabla 5.9

Emacs: comandos para adelantar mensajes de VM

Enlace

Comando/Descripcin

(vm-forward-message) este comando te sita en un buffer de composicin, similar al comando m , pero el mensaje original aparece
en el buffer.

(vm-send-digest) funciona como z , excepto que todos los mensajes en el folder actual se concatenan en un digerido y puestos en el
cuerpo del buffer de composicin.

(vm-resend-message) si deseas traspasar un mensaje recibido, pero que no aparezca encapsulado (que es lo que hace z ) entonces
debes utilizar este comando y VM iniciar un buffer de composicin
con una rplica del mensaje, pero agregar un encabezado Resent-To
que debes llenar con la direccin deseada.

Marcas de mensajes
La mayora de los comandos mencionados para enviar, contestar y traspasar mensajes
reciben argumentos numricos prejos (con C-u N , donde N es un nmero) y pueden
trabajar sobre mensajes marcados. VM provee marcas de propsito general que pueden
aplicarse a cualquiera o a todos los mensajes dentro de un folder.
Para marcar el mensaje actual teclea M M (vm-mark-message). Si le pasas un argumento numrico N , marcar tambin los siguientes N 1 mensajes siguientes; con un
argumento negativo, los N -1 previos. Un asterisco (*) aparecer a la derecha de los nmeros de mensaje marcados.
Para quitar la marca a un mensaje puedes utilizar M U (vm-unmark-message).
M m marca todos los mensajes en la carpeta actual y M u les quita la marca.

Conguracin de correo saliente


VM intentar enviar los mensajes que compones utilizando el mtodo denido por Mail
de Emacs, esto es, por el valor de send-mail-function, el cual por omisin intentar utilizar
el programa sendmail local.
Dependiendo de tu servicio y conguracin de acceso a la red, puede ser que no cuentes
con un programa sendmail o con un equipo capaz de enviar directamente correo electrnico. En estos casos es comn que tu servicio de correo incluya un servidor de SMTP, que
es el protocolo de internet para transmisin de mensajes electrnicos. Si es as, te conviene

129

5.15 Emacs

utilizar otro programa para enviar mensajes llamado smtpmail y poner algo similar a lo
que nuestro amigo Juan puso en su /.vm:
( s e t q vmmail headerfrom " Juan Perez <Juan . Perez@ciencias . unam . mx>"
sendmail f u n c t i o n smtpmailsend i t
smtpmailsmtps e r v e r " g a l a d r i e l . f c i e n c i a s . unam . mx"
smtpmaill o c a l domain " c i e n c i a s . unam . mx"
smtpmailsendtodomain " c i e n c i a s . unam . mx"
)

5.15.2.
$ smart
install bbdb

BBDB
BBDB es una base de datos para manejar contactos en Emacs. BBDB viene de Insidious
Big Brother Database y ofrece las siguientes caractersticas:
Integracin con distintos lectores de correo:
Despliega de manera sencilla la entrada correspondiente al remitente del mensaje
actual.
Permite la creacin automtica de entradas basado en el contenido del mensaje
actual.
Permite agregar de manera automtica datos a campos de la entrada que corresponde al remitente del mensaje.
Muestra una lista de registros que casan con una expresin regular.
Para activar BBDB debes poner lo siguiente en tu /.emacs:
( r e q u i r e bbdb )
( bbdb i n i t i a l i z e )

Con lo anterior tendrs una base funcional que te permite realizar bsquedas y manipular registros. Sin embargo, no est asociada con ninguno de los lectores de correo. Para
utilizarlo con VM (ver la Seccin 5.15.1) y poder enviar mensajes aprovechado tu base de
contactos, debes utilizar algo como esto:
( r e q u i r e bbdb )
( bbdb i n i t i a l i z e

vm)

Adems, para utilizarlo desde VM debes agregar lo siguiente a tu /.vm.


( bbdbi n s i n u a t e vm)

Esta lnea agrega enlaces de teclas a VM y lo congura para que le notique a BBDB
cuando se carguen nuevos mensajes. Tambin agrega el enlace MTAB al modo Mail con
el cul puedes completar direcciones que salen de tu base de contactos en BBDB.

Utilizando BBDB
Ahora que hemos instalado y activado BBDB, podemos utilizarla para agregar, revisar
o editar nuestros contactos. Por omisin, el archivo donde se guardan los contactos se llama

130

Internet

/.bbdb y puedes cambiarlo asignando un nuevo valor a la variable bbdb-le.


La base de datos de BBDB consiste de un conjunto de registros y cada registro corresponde a una persona. Cada registro tiene varios campos y estos campos pueden tener distintos tipos; en la tabla 5.10 te mostramos los tipos predenidos.
Tabla 5.10 Emacs: tipos vlidos para campos BBDB

Tipo

Descripcin

name

El nombre de la persona, o vaco si corresponde a una organizacin.

company

El nombre de la organizacin de la persona.

AKA

Lista de otros nombres o apodos para esta persona.

net

Lista de las direcciones electrnicas de la persona.

adress

Lista de direcciones postales (fsicas).

phone

Lista de telfonos de la persona.

notes

Comentarios.

Cuando ejecutas BBDB con el comando M-x bbdb te pide una expresin regular y te
muestra todos los registros que casan con esta expresin. La bsqueda la realiza sobre todos
los campos de la base, aunque puedes realizar bsquedas ms limitadas utilizando otros
comandos, como bbdb-name para buscar nicamente en el campo de nombre o bbdb-net
para el campo de direcciones electrnicas.
Una vez que BBDB te muestra algunos registros de tu base, ests en el modo especial
*BBDB* y tienes varios comandos a tu disposicin para moverte, editar, agregar o borrar
registros.
Tabla 5.11 Emacs: comandos de BBDB

Enlace

Comando/Descripcin

(bbdb-edit-current-eld) edita el campo en la lnea actual.

(bbdb-edit-notes) abreviatura para editar el campo de comentarios.

d C-k

(bbdb-delete-current-eld-or-record) borra el campo en la lnea actual. Si la lnea actual es la primera del registro, BBDB te preguntar si
deseas borrar el registro completo.

C-o

(bbdb-insert-new-eld) inserta un nuevo campo en el registro actual.

(bbdb-next-record) se mueve al siguiente registro.

(bbdb-prev-record) se mueve al registro anterior.


Contina en la siguiente pgina

131

5.15 Emacs

Contina de la pgina anterior

Enlace

Comando/Descripcin

(bbdb-send-mail) inicia la composicin de un mensaje de correo electrnico dirigido a la persona.

(bbdb-save-db) salva la base actual al disco.

(bbdb-rele-record) integra el contenido del registro actual con otro registro en la base. Esto es til porque es usual tener varios registros con
informacin distinta, como, por ejemplo, distintos correos electrnicos
de la misma persona.

(bbdb-create) crea un nuevo registro en la base de datos con la informacin que ingresas en el mini-buffer.

(bbdb-bury-buffer) esconde el buffer *BBDB*. Nota que este comando


no mata el buffer.

(bbdb-add-or-remove-mail-alias) aade un nuevo alias de correo para


persona.

Para crear tu primer registro, ejecuta M-x bbdb-create (o simplemente c dentro del
buffer *BBDB*). Inmediatamente despus de ejecutar este comando, BBDB te preguntar,
utilizando el mini-buffer para ello, los siguientes datos: Name, Organization, Net, Address
(direccin postal en varias lneas), Phone y nalmente Notes. Nota que a excepcin de los
primeros tres, puedes teclear Enter y BBDB dejar en blanco (y no desplegar) ese campo.
En general, los comandos que acabamos de mencionar en la tabla 5.10, no los utilizars
frecuentemente, porque BBDB ofrece una interfaz ms ecaz para manejar tus contactos.
Adems, con las lneas que agregamos al /.emacs arriba, la mayora de las modicaciones a tu base de contactos se realizan de manera automtica cuando redactas nuevos correos
electrnicos o lees correo dirigido a ti.
De hecho, notars que cuando entras a VM y seleccionas un correo, en el fondo de
la pantalla BBDB te mostrar el registro de tu base de contactos con la informacin del
remitente. Si no existe ya un registro para ste, BBDB crear uno por ti. De hecho, los
registros de la base cuentan con un nuevo campo llamado mail-alias que te permite asignar
nombres especiales, o simplemente alias, a ciertos contactos para enviar mensajes.
Por ejemplo, si agregamos (con el enlace a ) el campo mail-alias al registro de Elisa Viso que creamos arriba, podemos teclear mami y despus, durante la edicin de un
mensaje electrnico, puedes utilizar el alias en el campo To:.

132

5.15.3.

$ smart
install
w3m-el

Internet

w3m
En sus inicios, W3 era el navegador ms popular para Emacs, pero era sumamente lento.
Por otro lado, w3m era un paginador con capacidades para navegar el web, desarrollado por
Akinori Ito. As que se desarroll esta interfaz para utilizar w3m desde Emacs y el resultado
es un navegador eciente.
Para iniciar w3m debes poner la siguiente lnea en tu /.emacs:
( r e q u i r e w3ml o a d )

Al igual que VM, w3m preere tener su propio archivo de conguracin, en este caso
/.emacs-w3m, que es el valor por omisin de la variable w3m-init-le.

Uso bsico de w3m


Existen tres formas bsicas para iniciar w3m, que se muestran en la tabla 5.12.
Tabla 5.12 Emacs: iniciando w3m

Comando

Descripcin

w3m

Arranca emacs-w3m y despliega la pgina de inicio. Esta pgina


est especicada por la variable w3m-home-page.

w3m-nd-le

Te solicitar el nombre de un archivo local en el mini-buffer y


lo desplegar en emacs-w3m.

w3m-browse-url

Te solicitar un URL en el mini-buffer y lo desplegar en


emacs-w3m. Este comando es usualmente invocado desde otros
programas.

133

5.15 Emacs

Moverte en un buffer de emacs-w3m no es difcil, pues la mayora de las teclas de Emacs


funcionan de la misma forma. Por ejemplo, C-n , C-v y C-s (que usualmente sirven para
moverte una lnea hacia abajo, una pgina o buscar una palabra) tambin son operaciones
vlidas en los buffers de emacs-w3m.
Para seguir una liga utiliza la tecla Enter . Debes mover el punto a la liga, lo cual es
sencillo pues las ligas se destacan del texto normal ya sea que estn subrayadas o tengan un
color distinto. Aqu est una lista de enlaces para navegar dentro de un buffer emacs-w3m:
Tabla 5.13 Emacs: siguiendo ligas con w3m

Enlace

Comando/Descripcin

Enter

(w3m-view-this-url) despliega la pgina sealada con el punto. El comportamiento exacto de este comando depende de las propiedades de la
liga en cuestin.

(w3m-goto-url) te solicitar un URL en el mini-buffer y har que emacsw3m despliegue la pgina.

(w3m-goto-url-new-session) te solicitar un URL en el mini-buffer y


desplegar la pgina en una nueva sesin.

(w3m-print-current-url)despliega el URL de la pgina mostrada en el


rea de eco y la pone en el anillo de la muerte.

(w3m-print-this-url) despliega, en el rea de eco, la pgina objetivo del


URL marcado con el punto.

(w3m-reload-this-page) vuelve a cargar la pgina. Esto es particularmente til si ests leyendo las noticias o el diario de una persona, que
pudieron ser actualizados desde el momento en que fue cargada la pgina.

Probablemente la posibilidad de moverte dentro de una pgina, como lo puedes hacer


en cualquier buffer de Emacs, te tiene fascinado. Y, aunque no lo creas, an hay ms y
resulta que emacs-w3m agrega una gran cantidad de enlaces para lograr que navegues a
velocidades nunca antes vistas.
Las teclas fueron seleccionadas de manera tal que avanzar la pgina se logra con secuencias muy cortas. Ms an, dado que no puedes escribir en cualquier parte de una pgina,
muchas de las teclas no ejecutan ms el comando self-insert-command.

134
Tabla 5.14

Internet
Emacs: navegando con w3m

Enlace

Comando/Descripcin

Space

(w3m-scroll-up-or-next-url) recorre la pgina hacia abajo. Si utilizas


VM ya debes estar acostumbrado a este comportamiento, pues as funciona la lectura de mensajes en VM.

delete

(w3m-scroll-down-or-previous-url) recorre la pgina hacia arriba.

>

(w3m-scroll-left) recorre la pgina hacia la izquierda.

<

(w3m-scroll-right) recorre la pgina hacia la derecha.

(w3m-shift-left) se mueve (una posicin) hacia la izquierda.

/,

(w3m-shift-right) se mueve (una posicin) hacia la derecha.

M-l

(w3m-horizontal-recenter) recorre la pgina horizontalmente hasta


que la posicin actual quede en el centro.

El modo mayor de emacs-w3m, w3m-mode, dene adems una serie de comandos


para moverse entre distintos objetos, tales como ligas, formas o imgenes.
Tabla 5.15 Emacs: puntos de inters en la pgina ala w3m

Enlace

Comando/Descripcin

Tab

(w3m-next-anchor) mueve el punto a la siguiente liga (o ancla, en


el idioma de emacs-w3m).

M-Tab

(w3m-previous-anchor) mueve el punto al ancla anterior.

(w3m-next-form) mueve el punto a la siguiente forma.

(w3m-previous-form) mueve el punto a la forma previa.

(w3m-next-image) mueve el punto a la siguiente imagen.

(w3m-previous-image) mueve el punto a la imagen previa.

Por ejemplo, si ests viendo la pgina http://www.google.com, (s, la del afamado


buscador), puedes realizar los siguientes pasos: ] , Enter , (teclea lo que sea que quieras
buscar en google) y nalmente C-c C-c para localizar lo deado.
Ahora que ya sabes moverte dentro de una pgina, resta revisar los mecanismos que
ofrece emacs-w3m para movernos entre pginas. Dado que estas pginas son buffers de
Emacs, bien podramos utilizar los mecanismos ya provistos por Emacs, tales como C-c C-b .
Sin embargo, esto sera muy lento; por ello contamos con las siguientes formas de hacerlo:

135

5.15 Emacs
Tabla 5.16 Emacs: movimiento entre pginas con w3m

Enlace

Comando/Descripcin

(w3m-view-preview-page) se mueve una pgina atrs en la historia. Con un


argumento numrico se mueve hacia atrs N pginas.

(w3m-view-previous-page) se mueve hacia adelante una pgina en la historia. Por supuesto, esto funciona si utilizaste B

(w3m-gohome) se mueve a la pgina de inicio. Puedes cambiar la pgina de


inicio cambiando el valor de la variable w3m-home-page.

(w3m-view-parent-page) intentar moverse al directorio padre de la pgina desplegada. Por ejemplo, intentar moverse a http://foo/ cuando
http://foo/bar/ sea la pgina actual. Esto tiene sentido porque es comn que
busques algo en el sitio que no se encuentra ah, la pgina ya no existe u otros
problemas similares.

Space

(w3m-scroll-up-or-next-url) cuando el punto se encuentra al nal de buffer


y no puedes avanzar hacia adelante, entonces la tecla Space te llevar a la
siguiente pgina donde la siguiente pgina es aqulla denida por el encabezado especial next en la pgina actual. Este comando no tiene relacin alguna
con la historia.
Por ejemplo, si continuamos con la bsqueda que realizamos en google arriba, notars que al llegar al nal de la primera pgina de resultados y teclear
Space , te lleva a la segunda pgina de resultados.

Del

(w3m-scroll-down-or-previous-url) cuando el punto se encuentra al inicio


del buffer y no puedes moverte hacia arriba, puedes teclear Del y esto te
llevar a la pgina previa. Al igual que Space , esto funciona si la pgina
contiene el encabezado especial previous.

Regresa a tu vida ordinaria


Una vez que inicias este recorrido por los subsistemas de Emacs, como emacs-w3m,
es fcil perderse y olvidar que existe un mundo fuera de Emacs, que tienes una vida, un
trabajo, responsabilidades. Probablemente iniciaste tu sesin pensando terminar ese programa de tarea, aquella poesa que completar tu obra maestra o tal vez las formas que te
permitirn defender mejor a tu cliente en corte. Sin embargo, a la mitad de tu trabajo, tenas
la necesidad de buscar informacin en el web y pudiste hacer eso desde Emacs: increble.
Sin embargo, es momento de continuar tu trabajo y dejar emacs-w3m, para lo cual
tienes dos opciones. Teclea q si piensas regresar a emacs-w3m ms tarde o Q si no
piensas regresar en un buen rato.

136

Internet

La primera opcin, q , ejecuta el comando w3m-close-window que esconde la ventana de emacs-w3m y selecciona otro buffer, mientras que la segunda, Q , ejecuta w3m-quit,
que salva la historia de navegacin al disco y termina la ejecucin de emacs-w3m.

Imgenes y ms
Por omisin, emacs-w3m no mostrar las imgenes de las pginas; sin embargo, la
mayora de encarnaciones de Emacs modernas soportan mostrar imgenes en buffers. Con
el comando T puedes cambiar la opcin para mostrar o no imgenes en emacs-w3m.
Si deseas que emacs-w3m despliegue siempre las imgenes, debes asignar t a la variable
w3m-default-display-inline-images.
Adems de esto, emacs-w3m te permite agrandar o achicar las imgenes, guardarlas al
disco o verlas con un visor externo. Aqu estn los comandos ms relevantes:
Tabla 5.17 Emacs: manejo de imgenes en w3m

Enlace Comando/Descripcin
T

(w3m-toggle-inline-images) cambia entre mostrar o no imgenes en los buffers de emacs-w3m.

(w3m-view-image) utiliza un visor externo para ver la imagen actual.

M-i

(w3m-save-image) salva la imagen actual a un archivo.

M-[

(w3m-zoom-out-image) agranda la imagen actual.

M-]

(w3m-zoom-in-image) achica la imagen actual.

Favoritos
Emacs-w3m tambin soporta listas de ligas favoritas o bookmarks y, para no variar, te
ofrece varias formas de indicarle qu ligas quieres conservar y cmo quieres referirte a
ellas. As, tenemos las opciones que se listan en la tabla 5.18 de la siguiente pgina.
Una vez que tienes ligas favoritas almacenadas, puedes acceder a ellas con el comando v (w3m-bookmark-view) desde cualquier buffer de emacs-w3m. Otra posibilidad es
visitar el URL especial: about://bookmark/. En esta pgina vers tus ligas favoritas organizadas por seccin.
Emacs-w3m tiene muchas ms acarctersticas que, por cuestiones de espacio, no podemos explicar aqu. Por ejemplo puedes interactuar con tu buscador de web favorito con
una sola tecla, S (w3m-search) o puedes acumular varios URLs y abrirlos todos con un
solo movimiento. Pero todas estas caractersticas las dejaremos como ejercicio al lector.

137

5.15 Emacs
Tabla 5.18 Emacs: ligas favoritas en w3m

5.15.4.

Enlace

Comando/Descripcin

(w3m-bookmark-add-current-url) te permite integrar la pgina actual a tu lista de favoritos. Si lo llamas con un argumento prejo, entonces te pedir el URL a utilizar. Adems, utilizar el mini-buffer
para preguntarte si quieres editar el ttulo y el URL.

M-a

(w3m-bookmark-add-this-url) aade el URL marcado con el punto a los favoritos.

ERC

5.2 ZenIRC

ZenIRC es otra alternativa popular para acceder a servidores de IRC. Al igual que
ERC, ZenIRC no es parte estndar de Emacs y puedes encontrarlo en la direccin
http://www.zenirc.org/.
$ smart
install erc

ERC es un cliente de IRC6 para Emacs. ERC es poderoso, modular y extensible. Por
omisin ofrece las siguientes caractersticas:
Control de inundacin (detecta y detiene ataques electrnicos).
Fechas.
Puede conectarte a ciertos canales de manera automtica.
Convierte en botones (ligas) a los URLs, nombres de usuarios, etc.
Rompe lneas muy largas para facilitar su lectura.
Completa nombres de usuario y comandos.
Mantiene una historia de tus entradas.
Te informa de actividades en el canal utilizando la lnea de modo.

Utilizando ERC
Una vez instalado ERC, que como ya dijimos no es parte estndar de Emacs, debes
agregar lo siguiente a tu /.emacs:
6

IRC son siglas del protocolo de Internet Internet Relay Chat (RFC 1459), que especica una red internacional para conectarse y charlar en tiempo real.

138

Internet
( r e q u i r e erc )
( r e q u i r e ercs p e l l i n g )

Y para iniciar el programa debes utilizar el comando M-x erc-select, quien te preguntar por el nombre del servidor al que debe conectarse. Una vez en un buffer de ERC tienes
los siguientes comandos a tu disposicin:
Tabla 5.19 Emacs: comandos de ERC

Enlace

Comando/Descripcin

C-a

(erc-bol) te lleva al inicio de la lnea o al nal del prompt.

Enter

(erc-send-current-line) enva la lnea actual.

Tab

(erc-complete-word) si ests en un prompt, completa la palabra actual. En cualquier otro caso, se mueve a la siguiente
liga o botn.

M-Tab

(ispell-complete-word) completa la palabra actual utilizando ispell.

C-c C-b

(erc-iswitchb) te pregunta por un buffer de ERC al que te


quieres cambiar.

C-c C-c

(erc-toggle-interpret-controls) activa/desactiva el intrprete de secuencias como comandos en los mensajes.

C-c C-d

(erc-input-action) de manera interactiva, ingresa una accin


de usuario y la enva al IRC.

C-c Tab

(erc-invite-only-mode) convierte el canal en uno por invitacin (+i).

C-c C-j

(erc-join-channel) te permite ingresar a un canal. Si el punto


est al inicio del nombre de un canal, utiliza ese nombre.

C-c C-n

(erc-channel-names) ejecuta /names #channel en el canal


actual.

C-c C-p

(erc-part-from-channel) este comando sirve para salir del


canal actual.

C-c C-q

(erc-quit-server) te desconecta del servidor despus de preguntarte la razn.

C-c C-t

(erc-set-topic) te pregunta el nuevo tema del canal.

C-c C-u

(erc-kill-input) elimina la lnea actual utilizando erc-bol seguido de kill-line.

139

5.15 Emacs

Mdulos
ERC viene con una manera poco estndar de agregar funcionalidad que involucra la
utilizacin de mdulos. Hay mdulos de muchos tipos y para muy diversas funciones; para
activarlos debes asignar los deseados a la variable erc-modules y a continuacin ejecutar
erc-update-modules.
Aqu est una lista de los mdulos disponibles:
Tabla 5.20 Emacs: mdulos para extender ERC

Mdulo

Descripcin

autoaway

Asigna el estado de ausente (away) de manera automtica.

autojoin

Te registra a ciertos canales de manera automtica.

bbdb

Integracin con la base de contactos BBDB (ver la seccin 5.15.2).

button

Convierte en botones a los URL, nombres y otros textos interesantes.

ll

Rompe lneas muy largas.

log

Guarda el contenido de los buffers en bitcoras.

match

Resalta amigos, tontos y otras palabras clave.

notify

Te avisa cuando cambia el estado en lnea de ciertos usuarios.

pcomplete

Completa nombres de usuarios y comandos.

readonly

Convierte las lneas mostradas en slo de lectura.

replace

Reemplaza texto en mensajes.

ring

Activa la historia de la entrada.

scrolltobottom

Mueve la vista al nal del buffer.

smiley

Convierte los emoticones en iconos.

spell

Revisa tu ortografa.

stamp

Aade la hora a tus mensajes.

track

Rastrea toda actividad en el canal utilizando la lnea de modo.

truncate

Trunca el tamao de los buffers a cierto tamao.

unmorse

Traduce el cdigo morse en los mensajes.

Y listo; ahora puedes iniciarte en el arte de perder el tiempo en lnea. Hay muchos
servidores de IRC en el mundo; los hay de muchos tipos y con todo tipo de temas para
conversar. Nosotros te recomendamos irc.freenode.net.

140

5.15.5.

Internet

TRAMP
TRAMP es un paquete para editar archivos remotos en Emacs y son siglas de la frase
en ingls Transparent Remote (le) Access, Multiple Protocol.
TRAMP se distribuye con versiones recientes de Emacs y, una vez cargado, te permitir
el acceso a un sistema de archivos remoto para editar archivos, control de versiones y dired
(ver la seccin 3.6.3).
El acceso al sistema remoto se puede lograr con distintos programas como rsh, rlogin,
telnet o con cualquiera que tenga un mtodo similar de acceso. TRAMP soporta conexiones utilizando ssh y es el mecanismo recomendado.
Para hacer su trabajo, TRAMP requiere tener acceso al sistema remoto y hacer una
copia local para trabajar. La transferencia se puede realizar en una variedad de formas.
Los mecanismos ms ecientes para transferir archivos grandes son rcp, scp y rsync.
Los otros mecanismos requieren de herramientas adicionales para codicar y transferir los
archivos en lnea, tales como mimencode o uuencode.
Para activar TRAMP debes agregar lo siguiente a tu /.emacs:
( r e q u i r e tramp )

Utilizando TRAMP
Aunque hasta el momento todo lo que hemos dicho de TRAMP suena complicado, te
sorprender lo sencillo que es utilizarlo. Imagina que deseas abrir el archivo UNARCHIVO
en la mquina remota MAQUINA; entonces necesitas visitar el archivo, s, con el comando
C-x C-f (nd-le) y le das la siguiente ruta: /MAQUINA:UNARCHIVO. El mtodo de
acceso por omisin es ssh; si deseas cambiarlo debes asignar el nuevo valor a la variable
tramp-default-method, por ejemplo con la lnea que aparece a continuacin:
( s e t q trampd e f a u l t method " scp " )

Aqu estn algunos ejemplos de las rutas para distintos archivos en sitios remotos:
/moria.fciencias.unam.mx:.emacs, para editar tu /.emacs en tu directorio raz en
la mquina moria.fciencias.unam.mx.
/moria.fciencias.unam.mx:/.emacs, para editar el mismo archivo, ya que se
expande a tu directorio raz.
/ada.fciencias.unam.mx:/etc/issue, para editar el archivo /etc/issue en el servidor
ada.fciencias.unam.mx.
Lo anterior supone que tu nombre de usuario en la mquina local es idntico al de la
remota. Si ste no es el caso, puedes indicarle a TRAMP el nombre en el servidor remoto
en la misma lnea: /USUARIO@MAQUINA:MIARCHIVO.

141

5.15 Emacs

Tambin puedes especicar el mtodo de conexin para abrir cierto archivo, como
en: /ssh:juan@galadriel.fciencias.unam.mx:/home/juan/miarchivo.txt, que se conectar utilizando ssh al servidor galadriel.fciencias.unam.mx como el usuario juan.

5.15.6.

Diccionario

Adems de revisar la ortografa de tus documentos (ver la seccin 4.3.17), puedes requerir un diccionario. Aqu te mostramos cmo integrar y utilizar un cliente para un servicio de diccionarios en lnea, conocido como DICT o RFC 2229. Los servidores de diccionarios, aunque existen para muchos idiomas, manejan exclusivamente ingls.
$ smart
La extensin que nos ocupa se llama Dictionary y ofrece una excelente interfaz, amigable y navegable, para acceder a deniciones de palabras en uno o varios servidores. Sobre
install
dictionary-el todo en computacin, cuntas veces te encuentras con palabras para las que desearas tener
un diccionario a mano? Con este cliente y Emacs no tienes un diccionario, sino muchos.
Para activar este subsistema de Emacs debes agregar lo siguiente a tu /.emacs:
( load " d i c t i o n a r y i n i t " )

Adems te recomendamos agregar tambin las siguientes dos lneas que agregan enlaces de teclas para dos de los comandos ms intersantes de dictionary:
( g l o b a l setkey [ ( c o n t r o l c ) ?s ]
( g l o b a l setkey [ ( c o n t r o l c ) ?m]

d i c t i o n a r y search )
d i c t i o n a r y matchwords )

Utilizando dictionary
Puedes ejecutar el comando dictionary o utilizar alguno de los enlaces de tecla que
denimos arriba, C-c s o C-c m , para acceder al diccionario.. Todos estos comandos
te llevarn a un nuevo buffer, con el modo mayor Dictionary.
Este buffer de dictionary est dividido en dos partes. La primera es la seccin de botones que te permiten navegar las deniciones, buscar nuevamente, seleccionar diccionarios
o salir del diccionario. La siguiente es la seccin de deniciones. Una vez que dictionary
localiza una o varias deniciones solicitadas, las muestra en esta seccin.
Notars que en las deniciones aparecen palabras resaltadas con otro color. stas son
referencias cruzadas y funcionan como hipertexto, es decir, son ligas que puedes seguir y
dictionary te llevar a su denicin.
La forma ms usual para interactuar con dictionary es con el comando dictionary-search
que te pide en el mini-buffer una palabra a buscar, pero utiliza como propuesta inicial la
palabra ms cercana al punto. Por la frecuencia de su uso te recomendamos asociar este
comando al enlace C-c s , porque as puedes acceder a l rpidamente.
Dentro del buffer de dictionary tienes a tu disposicin los siguientes comandos:

142
Tabla 5.21

Internet
Emacs: comandos de dictionary

Enlace

Comando/Descripcin

(dictionary-close) cierra el buffer de dictionary.

(dictionary-help) despliega la ayuda en lnea de dictionary.

(dictionary-search) te pregunta por una nueva palabra para


buscarla en los diccionarios.

(dictionary-lookup-denition) busca la denicin de la palabra cercana al punto.

n o Tab

(dictionary-next-link) posiciona el punto en la siguiente liga.

p o Shift - Tab

(dictionary-prev-link) posiciona el punto en la liga anterior.

(dictionary-match-words) pregunta por un patrn y lista todas


las palabras que casan con l.

Enter

Visita la liga.

LATEX

6.1. Introduccin
Una de las aplicaciones ms importantes de la computadora hoy en da es la preparacin
de texto, sea ste para notas, una carta, un libro, reporte, artculo, tarea, etc.
Un procesador de texto es un paquete al que le tecleas texto, con algunas observaciones y el paquete procede a formatear el texto. Entre las operaciones que deseamos haga
con el texto estn las siguientes:
1. Armar los renglones de tal manera que quede el texto bien repartido.
2. Armar pginas de tal manera que se vayan numerando y que tengan todas el mismo
tamao.
3. Facilitar el cambio de tipo de letra y proveer distintos tipos de letras como itlicas,
negritas, etc..
4. Facilitar la edicin de tablas de distintos tipos.
5. Facilitar la construccin de ecuaciones matemticas.
6. Facilitar la insercin de guras en el texto.
Muchos de los procesadores de texto pretenden hacer mucho trabajo por ti. Por ejemplo, al escribir una carta proveen maneras directas y fciles de formar la carta, pidiendo
nicamente el destinatario, el remitente, la rma, etc..
Hay fundamentalmente dos tipos de procesadores de texto, aquellos que van mostrando el resultado de la edicin en la misma pantalla, conforme se va escribiendo como es
el caso de Word y aquellos que funcionan con comandos de control y que ejecutan un

144

LATEX

programa para poder ver cmo queda el texto ya formateado. LATEX es de este ltimo tipo.
Llamemos a los primeros de tipo intrprete, porque van interpretando conforme van recibiendo el texto, y a los segundos de tipo compilador, porque primero reciben todo el texto
y despus lo transforman a las pginas correspondientes.
Cada uno de estos tipos de procesadores tiene sus ventajas y sus desventajas. La principal ventaja del intrprete es que es ms fcil de usar y detectas inmediatamente cuando
algo no es como lo quieres. La principal desventaja es que supone demasiados parmetros
respecto a cmo quieres el texto, y toma muchas decisiones que son difciles de deshacer.
La principal ventaja de los compiladores es que te da un manejo ms preciso del formato
que quieres, permitiendo de esta manera una edicin ms rpida. La principal desventaja
es que requiere un nivel de abstraccin mayor, ya que como no ests viendo1 el resultado
de lo que haces, y tienes que compilarlo para verlo, trabajas ms a ciegas.
Se eligi LATEX para trabajar ac por varias razones, entre ellas:
(a) Es un paquete de distribucin gratuita, disponible en prcticamente todos los sistemas
Unix y que est ampliamente documentado.
(b) La documentacin viene con LATEX, por lo que est accesible.
(c) Cuenta con un gran nmero de gente trabajando continuamente en el proyecto, por lo
que hay muchos paquetes adicionales para casi cualquier cosa que se te pueda ocurrir,
como gracacin, msica, animacin, entre otros.
(d) Es el ms usado en el medio de Ciencias de la Computacin y Matemticas para la
elaboracin de trabajos.
En suma, aun cuando no logres ver ms que una pequea parte, la estructura de LATEX
es tal que el resto de los paquetes los podrs aprender a manejar por su cuenta, conforme
los vayas requiriendo.

6.2. Componentes de un texto


Muchos se reeren a los procesadores de texto como procesadores de palabra, reconociendo con esto que el componente bsico de un texto son las palabras. Sin embargo,
es en la forma de agrupar palabras donde realmente se formatea texto. Veamos algunos
componentes importantes de un texto:
palabras
oraciones
prrafos
subsubsecciones subsecciones secciones
captulos
partes
documento
A partir de las subsubsecciones puedes poner ttulos y subttulos.
1

Esto, en realidad, ya no es del todo cierto, pues LATEX cuenta ya con intrpretes que permiten ir viendo
cmo queda el texto conforme lo vas escribiendo.

145

6.3 Ambientes para formato

6.3. Ambientes para formato


Por el tipo de procesador que es LATEX, debes indicarle en qu tipo de ambiente quieres
elaborar el documento. Los ambientes denen los mrgenes que quieres (arriba, abajo,
derecho, izquierdo), qu componentes se vale que tenga el documento (captulos, secciones,
partes), el tamao del rengln, la separacin entre prrafos, la sangra. LATEX cuenta, entre
otros, con las siguientes clases de documentos:
Tabla 6.1

LATEX: ambientes

Ambiente Nombre Descripcin


Reporte

report

Se utiliza para textos menos formales que un libro o un artculo.


No tiene captulos, sino que agrupa a partir de secciones.

Artculo

article

Es, tal vez, el ambiente que ms seguido utilizarn para la entrega de tareas, elaboracin de pequeos manuales, etc. Permite
escribir en dos columnas fcilmente.

Libro

book

Da toda la infraestructura para la publicacin de un libro, con


partes, captulos, secciones, etc. Permite preparar las pginas
para imprimir algo por los dos lados.

Acetatos

seminar

Supone un tamao de letra de cuatro veces el normal, con lo que


permite armar acetatos.

Cartas

letter

Permite elaborar cartas que acomodan de manera fcil el remitente, la rma, etc.

Cada una de las clases de documento supone un distinto ambiente. El ambiente es lo


primero que le debes dar al compilador de LATEX .
Un archivo fuente de texto para LATEX consiste de:
Una especicacin de ambiente
\ documentclass { r e p o r t }

El prembulo, donde especicas algunos modicadores para este ambiente, como pueden ser paquetes adicionales que quieras usar.
\ usepackage [ spanish ] { babel }
\ usepackage { ucs }
\ usepackage [ u t f 8 x ] { i n p u t e n c }
\ usepackage { amsmath }

Tambin en el prembulo puedes cambiar de manera explcita algunos de los parmetros de la hoja.
\ setcounter { chapter } { 5 }

146

LATEX
\ a d d t o l e n g t h { v o f f s e t } { 2cm}

O, en general, establecer propiedades de los objetos con que vas a trabajar o incluir
deniciones:
\ input { definiciones }
\ i n c l u d e o n l y { segundo }

El documento propiamente dicho que empieza con


\ begin { document }

y termina con
\ end { document }

y entre estas dos marcas puede haber texto;


s t e es un documento que t r a e conceptos b s i c o s

comandos de LATEX;
\ begin { c e n t e r }
...
\ end { c e n t e r }

o, en general, comandos que insertan en ese lugar texto de otros archivos:


\ include { primero }
\ i n c l u d e { segundo }

Actividad 6.1 En esta primera prctica de LATEX escribirs las observaciones en un archivo de texto simple. Para ello, utilizando Emacs, debers abrir un archivo nuevo donde
vayas escribiendo.
Actividad 6.2 Carga en tu Emacs el archivo template1.tex que se encuentra en el subdirectorio indicado en la pgina 3.1.
Actividad 6.3 Compila el archivo fuente. Para hacerlo, vas a llevar a cabo el siguiente
dilogo en la ventana de comandos. Irs anotando lnea por lnea la interaccin. Deber
estar subrayado lo que Emacs escribe y sin subrayar las respuestas.
Cc Cc

para invocar al compilador de LATEX.


Save le /home/usuario/template1.tex?(y/n)
pregunta si se desea actualizar la copia del archivo en el disco. La respuesta deber ser s
(y) para que LATEX trabaje con la ltima versin.
Command: (Default LATEX )

6.3 Ambientes para formato

147

Invoca al compilador de LATEX para que trabaje sobre el archivo fuente. Se oprime la tecla
Enter . En este momento, el compilador mandar un mensaje:
Type teclaCc teclaCl to display results of compilation
Si tecleas en este momento Cc Cl , el compilador de LATEX ir mostrando, conforme
va revisando el archivo, el resultado de la compilacin. Al terminar, indicar si hubo o no
errores. Si no los hubo, aparecer un mensaje de que termin bien:
LATEX succesfully compiled (3) pages
donde dice, entre parntesis, el nmero de hojas que pudo armar con el texto dado. Tambin
aparece el mensaje en la otra mitad de la pantalla que dir que LATEX termin o que tuvo
errores.
Para ver cmo quedaron las pginas compiladas, vuelve a teclear Cc Cc y el
mensaje que aparecer es si deseas ver (View) cmo qued. Si oprimes la tecla Enter se
abrir una ventana nueva que mostrar el resultado de la compilacin, utilizando para
ello el paquete xdvi. El archivo generado tiene el mismo nombre, pero su extensin es dvi.
Si es que hubo algn error, LATEX te pedir que oprimas Cc ` . (aunque el mensaje
pide, en realidad, que teclee nada ms Cc y el acento grave (), en algunos casos y
que tienen que ver conque tienes Emacs para que ponga acentos para el espaol, debers
repetir esta ltima tecla, o bien teclearla en combinacin con la tecla Alt de la parte
derecha del teclado). En seguida, LATEX te llevar a donde se encuentra el error en el texto.

6.3.1.

Posibles errores
En este primer ejercicio realmente tendrs pocos errores que reportar. Generalmente
sern aqullos ocasionados por errores de dedo. Nta que LATEX tiene varios tipos de comandos:
i. Aquellos que estn entre \begin {...} y \end {...} , donde lo que va entre llaves se repite.
Veamos algunos ejemplos:
\ begin { document }
....
\ end { document }

148

LATEX
\ begin { compactenum }
\ item . . . .
\ item . . . .
\ end { compactenum }
\ begin { c e n t e r }
...
\ end { c e n t e r }

A estos comandos les llamamos de ambiente porque delimitan a un texto para que
se les apliquen determinadas reglas.
ii. Tambin tenemos comandos que marcan el inicio y nal de un cierto tipo de datos;
por ejemplo, carcteres matemticos. Para esto, cuando quieres que la frmula vaya
insertada entre el texto, puedes usar cualquiera de los dos ambientes que siguen.
$
\(

.... $
. . . . \)

y cuando quieres que aparezca en un prrafo separado, tienes para ello cualquiera de
los dos ambientes que siguen.
$$
\[

....
....

$$
\]

iii. Aquellos que marcan lo que sigue, y que aparecen nicamente como comandos de
control. A estos les llamamos comandos de estado, porque cambian el estado del ambiente:
Ejemplos:
\ bf
\ large

Estos comandos funcionan hasta nuevo aviso. Puedes delimitar tambin su rango de
accin si colocas entre llaves al comando y a todo a lo que quieres que se aplique:


\ l a r g e Esta es una prueba

y entonces el comando se referir nicamente a lo que est en las llaves ms internas.


iv. Aquellos comandos que actan sobre sus parmetros:
\ s e c t i o n { Primera }
\ setcounter { section } { 4 }

v. Y por ltimo, aquellos comandos que simplemente se usan como abreviaturas convenientes o para denotar smbolos especiales. Siempre empiezan con \
\ cdot
\ uparrow

6.4 Formato general de un documento

149

En el primero, segundo y tercer tipo de comandos es usual que se te olvide cerrar un


ambiente, y entonces el compilador reportar que se encontr el nal del documento antes
de lo esperado, o algn mensaje donde indique que lo que sigue no tiene sentido donde
est.
Es frecuente que tengas errores al teclear y LATEX no reconozca el comando. En esos
casos sealar exactamente el lugar donde no est entendiendo.
En el ltimo tipo de comandos, adems del primer tipo de error, como pudiera ser el
de teclear mal el nombre del comando, puedes tambin darle menos parmetros de los que
espera, o de distintos tipos. Por ejemplo, el comando
\ setcounter { section } { 4 }

espera una nmero entero en su segundo parmetro, por lo que si le dieras otra cadena
protestara.
Muchas veces es necesario tener en el documento texto que no quieres que aparezca en
la versin nal. Tambin pudiera suceder que tengas problemas con un comando particular
y quieras ver qu pasa si lo quitas, pero sin quitarlo realmente del archivo. Lo que conviene
en esos casos es usar comentarios.
LATEX tiene dos tipos de comentarios. El primero, y el ms sencillo de usar, es el que
simplemente comenta el resto de una lnea. Para ello se usa el carcter % (porciento), y
desde el punto en el que aparece hasta el n de lnea (en la pantalla, aunque la lnea se haya
doblado) el compilador de LATEX no va a considerar eso para compilar y no aparecer en
el trabajo nal.
La segunda manera es introduciendo el ambiente de comentario mediante
\ begin { comment }
...
\ end { comment }

y todo lo que quede en este ambiente quedar excluido de la compilacin de LATEX. Para que
puedas usar esta forma de comentario, debes incluir el paquete comment en el prembulo
de tu documento:
\ usepackage { comment }

Esta manera de incluir comentarios tambin puede ser muy til si ests trabajando con
un archivo de texto muy grande y deseas compilar por pedazos.

6.4. Formato general de un documento


LATEX procesa los espacios en blanco de manera especial. Por ejemplo, entre dos palabras un espacio en blanco es lo mismo que 25 o que un cambio de rengln; similarmente,
un rengln en blanco es equivalente a diez. En general, no respeta de manera estricta el
formato que trae el documento fuente, pues su trabajo consiste, precisamente, en acomodar

150

LATEX

adecuadamente el texto de acuerdo a los comandos que recibe. Distingue una palabra de
otra por al menos un espacio en blanco, y un prrafo de otro por al menos un rengln en
blanco. La forma como aparece el texto fuente, en ausencia de separaciones de palabras o
prrafos, no tiene nada que ver con el formato nal, ni en el tamao del rengln, ni en la
manera en que silabea.
LATEX se encarga de generar espacios entre los prrafos cuando encuentra dos cambios
de rengln seguidos (al menos un rengln en blanco). Tambin, cada vez que empieza un
captulo, seccin, subseccin, etc. genera espacios verticales en blanco.
LATEX ofrece la posibilidad de manipular directamente los espacios que se dejan entre
prrafos o el cambio de rengln. En los comandos que siguen, <num> representa a un entero
positivo o negativo y <mdda> representa una unidad de medida, que puede ser pt, in, cm,
mm, ex, em o cualquier variable de longitud ex representa la altura de una x mientras
que em representa el ancho de la letra m . Los comandos con que cuentas para manipular
los espacios se muestran en la tabla 6.2.
Tabla 6.2

LATEX: comandos para modicar espacios

Comando

Descripcin

Indica que se deje incondicionalmente un espacio en blanco; puede ser necesario cuando LATEX genera algn cdigo
y suprime los blancos que lo separan.

Produce tambin un espacio en blanco, pero que el compilador no puede usar para cambiar de lnea.

\\

Cambia de rengln y el siguiente rengln empieza en el


margen izquierdo.

\\[< num><mdda>]
\\[< num><mdda>]

Da un cambio de rengln, pero salta, adems de al rengln


siguiente, tanto como se le indique. Si el nmero es negativo, retrocede en la hoja. El a continuacin de \\\\ es para
forzar a que se d el espacio; de otra manera, LATEX decide
si aplica el espacio o no.

\vspace{<num><mdda>}
\vspace{<num><mdda>}

Da un espacio vertical del tamao especicado. Si el nmero es negativo, retrocede en la pgina. Nuevamente, el es
para forzar a LaTeX a que recorra el espacio especicado.

\smallskip
\medskip
\ bigskip

Permiten el desplazamiento vertical del texto en un cuarto


del tamao de la lnea base ( \\ baselineskip), media lnea base y una completa. Es muy til porque son saltos relativos
al tamao de letra que ests usando.
Contina en la siguiente pgina

151

6.4 Formato general de un documento


Tabla 6.2

LATEX: comandos para modicar espacios

Contina de la pgina anterior

Comando

Descripcin

\noindent

Hace que un prrafo o rengln empiece en el margen izquierdo de la hoja, en lugar de hacerlo con sangra.

\indent

Obliga a dejar un espacio horizontal igual al de la sangra


de prrafos.

\hspace{<num><mdda>}
\hspace{<num><mdda>}

Deja un espacio horizontal dado por el nmero. Si el nmero es negativo, retrocede en la lnea. LATEX puede decidir
que el espacio no es adecuado en ese punto y no obedecer.
Nuevamente, el fuerza a LaTeX a obedecer la instruccin.

Tanto \vspace como \hspace pudieran ser inhibidos por LATEX si es que el compilador
considera que no se vera bien. Por ejemplo, si el desplazamiento vertical toca a principio
de una pgina, decide no hacerlo.
Todo documento, menos las cartas, deben tener un ttulo, autor(es) y la fecha en que
fue impreso. Algunas veces se agrega una nota de agradecimiento. En general, a esto se le
llama el ttulo. En el prembulo (antes de que empiece el documento propiamente dicho)
debes colocar los datos para que LATEX pueda armar el ttulo que se desea. Los comandos a
LATEX son:
\ t i t l e { E j e r c i c i o s de Latex }

Este es un comando con un parmetro que le indica a LATEX que el ttulo del documento es
Ejercicios de Latex. Nota que el argumento debe ir entre llaves.
\ a u t h o r { E l Chapuln Colorado \ and Pepe G r i l l o }

Si se trata de ms de un autor, los nombres de los autores irn separados por la palabra
\and.
\ date { E l da ms b e l l o d e l p l a n e t a \ \
\ today }

En la fecha puedes poner lo que quieras, aunque se espera una fecha. Las dos diagonales
inversas \\ sirven para cambiar de rengln, y las puedes utilizar en casi cualquier momento.
El comando \today sirve para que LATEX inserte la fecha de hoy.
\ thanks { Gracias a l o s v o l u n t a r i o s de e s t e t a l l e r }

Sirve para agregar, al pie de la pgina, algn comentario que se desee. Este comando deber
aparecer una vez iniciado el documento propiamente dicho.
Como ya mencionamos, dependiendo de la clase de documento LATEX se comportar de
manera diferente al compilar el texto fuente (la especicacin de \documentcl ass).
Actividad 6.4 Agrega encabezado al documento. Ponte t como autor, junto con tus mejores amigos, el ttulo que a t ms te parezca y algn comentario respecto a la fecha. Agrega

152

LATEX

un prrafo de agradecimiento tan grande como quieras. Recuerda nada ms que debe ir
despus de \begin{document}. Compila y ve el efecto.
Actividad 6.5 El objetivo ahora es ver el efecto que tienen las distintas clases de documento sobre lo que se imprime. En todas las acciones que siguen, haz el cambio, compila
y ve el resultado. Anota cul es el efecto del cambio. Convierte en comentarios (ya sea con
% o con \begin{comment} ... \end{comment} para conseguir que compile bien. Comenta tus
observaciones y qu es lo que tuviste que quitar para que compilara bien. Cada vez que
cambies a un nuevo tipo de documento, quita los comentarios que hayas puesto.
Actividad 6.6 Cambia el tipo de documento a article . Vuelve a compilar y reporta lo que
observas, en cuanto al formato de la hoja.
Actividad 6.7 Haz lo mismo que en la actividad anterior, pero con la clase book.

6.4.1.

Cartas
Para escribir cartas, todo indica que el formato que le tiene que dar LATEX es muy distinto
al de los documentos que hemos visto hasta ahora. Puedes meter en un mismo documento
varias cartas, ya que se espera que el remitente y la rma sean los mismos para todas las
cartas incluidas en el documento. Por ello, una vez iniciado el documento, debes especicar
estos dos parmetros. Veamos primero el remitente:
Remitente: Se reere a lo que normalmente aparece en el tope de la carta y que es la
direccin de aqul quien rma la carta:
\ address { Dra . Genoveva B i e n v i s t a \ \
Cub c u l o 003. E d i f . de Matem t i c a s \ \
F a c u l t a d de Ciencias , UNAM}

Puede consistir de uno o ms renglones. Si deseas ms de un rengln en el remitente,


separas los renglones con \\.
Firma: Para la rma se especica de manera similar al remitente:
\ s i g n a t u r e { Dra . Genoveva B i e n v i s t a \ \
P r o f e s o r T i t u l a r B}

Una vez que tienes denidos estos parmetros, se procede a escribir cada una de las
cartas. Se delimita cada una de stas por
\ begin { l e t t e r }
. . .
\ end { l e t t e r }

Dentro de cada carta colocars los parmetros que se reeren a cada una de ellas. Veamos cmo se hace:

6.5 Tipos y tamaos de letras

153

Destinatario: A continuacin de \begin{ letter } colocars entre llaves los datos del destinatario:
\ begin { l e t t e r } { D i s t i n g u i d o e s t u d i a n t e de C i e n c i a s
de l a Computacin \ \
Primer I n g r e s o \ \
Generacin 2007}

Con esto, aparecer el texto inmediatamente antes de la carta.


Introduccin: Llamamos introduccin a la frase con la que se saluda o inicia la carta.
Tambin se relaciona nicamente con la carta en cuestin:
\ opening { Muy q u e r i d o e s t u d i a n t e : }

y este rengln aparecer al inicio de la carta.


Despedida: Esta es la frase que aparecer antes de que aparezca la rma y jalar a la
rma a continuacin. Aparecer dondequiera que coloques el comando, por lo que lo
deber colocar inmediatamente antes del n de la carta ( \end{ letter } ).
\ c l o s i n g { Quedo de Uds . atentamente , }

Copias: Muchas veces quieres poner al pie de la carta la lista de las personas a las que
pretendes entregarle una copia de la carta. Esto se logra con el comando:
\ cc { Mis mejores amigos \ \
Mis estimados colegas \ \
Primer i n g r e s o en g e n e r a l }

Tambin este comando, como el de despedida, aparecer en donde lo coloques, por lo


que lo debers colocar tambin al nal de la carta y despus de la despedida.
Actividad 6.8 Ahora cambia a la clase letter y modica el texto fuente para que parezca,
en efecto, una carta (o edita un archivo propio para ello). Observa los resultados.

6.5. Tipos y tamaos de letras


Si revisas estas notas, hechas con LATEX, vers que existen una gran cantidad de tipos
de letras y tamaos que puedes usar dentro de tu documento. Para cambiar el tamao de las
letras cuentas con comandos de estado, por lo que el que uno de ellos aparezca se referir
a todo el ambiente en el que estn. Es conveniente, por ello, escribirlos entre llaves:
{ \ l a r g e e s t e es . . . . . . . }

154

LATEX

Veamos una lista de tamaos de letras con sus nombres en la tabla 6.3.
Tabla 6.3

Tamaos disponibles para letras

Nombre

Descripcin del tamao

tiny

esta es una muestra diminuta

scriptsize

un poco menos pequea

footnotesize

creciendo un poco

small

esta es una muestra pequea

normalsize

este es el tamao normal

large

una muestra agrandada un poco

Large

Agrandamos la muestra un poco ms

LARGE

Muy grande

huge
Huge
HUGE

Mucho muy grande


Sper extra grande!
Sper dper extra grande!

Como se ve, tienes a tu disposicin siete tamaos distintos de letras (aunque en realidad
no hay casi diferencia entre huge, Huge y Huge. En cualquier lugar donde puede aparecer
texto, ste puede aparecer agrandado o empequeecido. Sin embargo, cuando se est usando ambiente matemtico estos comandos no tendrn efecto alguno dentro del ambiente y
pueden causar un mensaje de aviso.
Actividad 6.9 Vuelve a cargar el archivo CalcProp.tex para que vuelvas a tener la versin
original.
Actividad 6.10 Localiza en el documento fuente aquellos renglones que estn precedidos
por la palabra \item. A cada uno de ellos, ponle uno de los tamaos de letra listados anteriormente, encerrando el comando y el texto correspondiente entre llaves. Compila y ve el
resultado.
Actividad 6.11 Quita las llaves que delimitan el texto. Compila y ve el resultado.
Actividad 6.12 Haz que la primera letra de cada prrafo empiece en cada uno de los
tamaos especicados. Compila y ve el resultado.

155

6.5 Tipos y tamaos de letras

Veamos ahora cules son los tipos de letra que provee LATEX (se les denomina fonts).
Vienen tanto como comandos de cambio de estado como con un argumento, que es el texto
que se va a cambiar.
Tabla 6.4

LATEX: comandos para cambios de tipo de letra

Decl.

Abr.

Comando

Descripcin

\textmd {...}

Medium Series, se reere a tipo normal

\ bfseries

\ bf

\ textbf {...}

Boldface Series, se reere a negritas

\rmfamily

\rm

\textrm {...}

Roman Family, un tipo de letra

\ sffamily

\ sf

\ textsf {...}

Sans Serif Family, letras simples

\ ttfamily

\ tt

\ texttt {...}

Typewriter Family, letra


como de mquina de escribir

\mdseries

\textup {...}

Letras sin inclinacin

\itshape

\ it

\ textit {...}

Texto en itlicas

\slshape

\ sl

\ textsl {...}

Texto ligeramente inclinado

\scshape

\sc

\ textsc {...}

T EXTO EN MAYSCULAS E S C A L A DAS

\textnormal {...}

Texto normal

\upshape

\normalfont

Todas las abreviaturas funcionan como cambios de estado, por lo que si deseas que
nicamente se apliquen a un pedazo de texto, encerrars el comando junto con el texto
entre llaves, la que abre precediendo al comando.
Puedes utilizar otro tipo de texto, conocido como enfatizado, que simplemente implica
un cambio de tipo de letra, que depende de la instalacin de LATEX. Su abreviatura, es \em
y su comando es \emph{. . . }. Funcionan de manera similar al resto de los cambios de tipo
de letra. Tiene la propiedad de que si est en modo enfatizado y se encuentra un comando,
cambia a modo normal y viceversa:

{ \ em Veamos cmo f u n c i o n a e s t e comando cuando tenemos


{ \ em uno d e n t r o de o t r o } }

Veamos cmo funciona este comando cuando tenemos uno dentro de otro

El ltimo comando, \textnormal, lo usas para escapar a algn tipo que hayas dado
para todo un prrafo o una seccin:

156

LATEX

\ t e x t b f { Quieres que aparezca en n e g r i t a s , excepto


\ textnormal { este t e x t o } }

Quieres que aparezca en negritas, excepto este texto


Actividad 6.13 Modica el archivo CalcProp.ltx para que las primeras dos palabras de
cada prrafo sean con un tipo de letra distinto y un tamao distinto. Usa todos los tipos
listados, aunque repitas.
Actividad 6.14 Compila y reporta tus resultados.
A veces puedes combinar dos o ms tipos y tamaos de letras. Por ejemplo, puedes
querer tener negritas de itlicas:
Negritas itlicas
Este tipo de combinaciones las consigues utilizando los comandos que corresponden a
la declaracin, cuyo uso es de comando de estado:
{ \ b f s e r i e s \ i t s h a p e N e g r i t a s i t l i c a s } } comparadas
con \ t e x t i t { I t l i c a s }

que produce
Negritas itlicas comparadas con itlicas
Si se utilizan los dos comandos de abreviatura
{ \ i t \ b f I t l i c a s n e g r i t a s } comparadas con \ t e x t b f { n e g r i t a s }

nicamente se vericar el ltimo (ms interno) cambio de estado que se haya solicitado:
Itlicas negritas comparadas con negritas
Lo mismo suceder con cualquier combinacin que se desee de dos tipos de letras: debers
combinar usando una como cambio de estado y la otra como comando con argumento
aunque la ecacia de esto depende del orden o las dos en modo de declaracin.

6.6. Listas de enunciados o prrafos


Un prrafo es un conjunto de oraciones que empiezan y terminan con doble Enter .
En el documento fuente puedes observar un rengln en blanco para nalizar cada prrafo.
El aspecto en el documento formateado depender de los parmetros que tenga LATEX para
compilar ese texto aunque se pueden modicar, no lo haremos por el momento.
LATEX provee mecanismos para presentar listas de prrafos, ya sean numerados, etiquetados o con una marca separndolos entre s. En general, tienen el siguiente formato:

6.6 Listas de enunciados o prrafos

157

\ begin { <tipo-de-lista >}


\ i t e m <prrafo>
\ i t e m <prrafo>
\ item . . .
\ end { <tipo-de-lista >}

Cada prrafo que desees marcar (numerar) deber ir precedido del comando \item.
Entre un \item y el siguiente, o entre \item y el nal de la lista puede haber ms de un
prrafo.
Los <tipo de lista> que vas a manejar por lo pronto son los siguientes:
\ begin { enumerate }

<enumeracin de prrafos>
\ end { enumerate }
\ begin { i t e m i z e }

<listado de prrafos>
\ end { i t e m i z e }
\ begin { d e s c r i p t i o n }

<descripcin de prrafos>
\ end { d e s c r i p t i o n }

Cada uno de stos puede aparecer anidado en el otro, o anidado en s mismo. Veamos
primero las numeraciones.

6.6.1.

Numeraciones
Empezaremos por el tema de incisos numerados. Veamos un anidamiento de numeracin:
\ begin { enumerate }
\ i t e m Este es e l p r i m e r p r r a f o en e l p r i m e r n i v e l
\ begin { enumerate }
\ i t e m Queremos v e r qu pasa a l a n i d a r en e l segundo n i v e l
\ begin { enumerate }
\ i t e m Anidamos una vez ms para e l t e r c e r n i v e l
\ i t e m Otro i n c i s o para que se vea qu pasa en e l t e r c e r n i v e l
\ begin { enumerate }
\ i t e m Numeracin en e l c u a r t o n i v e l
\ end { enumerate }
\ end { enumerate }
\ i t e m Otro i n c i s o en e l segundo n i v e l de numeracin
\ end { enumerate }
\ i t e m Otro i n c i s o en e l p r i m e r n i v e l de numeracin
\ end { enumerate }

que produce el texto:

158

LATEX

1. Este es el primer prrafo en el primer nivel


a) Queremos ver qu pasa al anidar en el segundo nivel
1) Anidamos una vez ms para el tercer nivel
2) Otro inciso para que se vea qu pasa en el tercer nivel
a Numeracin en el cuarto nivel
b) Otro inciso en el segundo nivel de numeracin
2. Otro inciso en el primer nivel de numeracin

Como puedes observar, cada nivel lleva su propio contador y usa sus propios mtodos
de numeracin. Los valores por omisin, como acabas de ver, son los nmeros arbigos
seguidos de un punto para el primer nivel; las letras minsculas seguidas de un parntesis para el segundo nivel; nuevamente nmeros arbigos, pero seguidos de un parntesis
para el tercer nivel; y nuevamente letras maysculas, pero seguidas de un apstrofo para
el cuarto nivel. LATEX admite nicamente cuatro niveles de anidamiento para las numeraciones. Las numeraciones tambin tienen denidas espacio entre los distintos niveles y
sangras para los mismos. Puedes denir qu tipo de numeracin utilice. La manera ms
fcil es incluyendo el paquete para numeraciones en el prembulo de tu documento fuente,
\usepackage{enumerate} y entonces podrs marcar qu tipo de numeracin deseas, colocando el que correspondera al primero de la lista:
\ begin { enumerate } [ ( a ) ]
\ i t e m Es un paquete de d i s t r i b u c i n g r a t u i t a , d i s p o n i b l e
en p r c t i c a m e n t e todos l o s sistemas Unix , y que e s t
ampliamente documentado .
\ i t e m La documentacin v i e n e con \ t e x t n o r m a l { \ LaTeX { } } ,
por l o que e s t a c c e s i b l e .
\ end { enumerate }

Con esta opcin, produces la numeracin con las etiquetas que deseas:
(a) Es un paquete de distribucin gratuita, disponible en prcticamente todos los sistemas
Unix, y que est ampliamente documentado.
(b) La documentacin viene con LATEX, por lo que est accesible.

6.6 Listas de enunciados o prrafos

159

Mientras que
\ begin { enumerate } [ I . ]
\ i t e m Es un paquete de d i s t r i b u c i n g r a t u i t a , d i s p o n i b l e en
p r c t i c a m e n t e todos l o s sistemas Unix , y que e s t
ampliamente documentado .
\ i t e m La documentacin v i e n e con \ t e x t n o r m a l { \ LaTeX { } } ,
por l o que e s t a c c e s i b l e .
\ end { enumerate }

produce
I. Es un paquete de distribucin gratuita, disponible en prcticamente todos los sistemas
Unix, y que est ampliamente documentado.
II. La documentacin viene con LATEX, por lo que est accesible.
Adems del tipo de nmero a usar, indicas tambin una cierta manera de editarlo. Por
ejemplo, en el caso anterior, cuando usas minsculas las colocas entre parntesis, mientras
que cuando usas nmeros romanos en mayscula, al nmero lo haces seguir por un punto.
Las maneras que tienes de numerar presentan al tipo de letra que va a ir, precedido y/o
seguido de algn separador, como ):,-:
Arbigos. El valor por omisin para el primer nivel. [1.]
Letras minsculas. [a]
Letras maysculas. [A:]
Nmeros romanos en minscula. [ i .]
Nmeros romanos en mayscula. [ I .]
Si aparece entre los corchetes algo que no sea identicado como el primer nmero
de cierto tipo, LATEX simplemente repetir esa cadena frente a cada uno de los prrafos
marcados con \item. Si deseas, por ejemplo, agregar un texto antes del nmero, como Nota
1, lo que debes hacer es encerrar entre llaves lo que no corresponde al nmero.
\ begi
\ item
\ item
\ end {

Nota 1. Primera nota.


Nota 2. Segunda nota.
Cabe aclarar que la sustitucin que hagas para el tipo de numeracin afecta nicamente
al nivel en el que aparece. Los niveles anidados seguirn la convencin por omisin descrita
arriba.

160

6.6.2.

LATEX

Listas marcadas

Cuando simplemente quieres marcar a cada prrafo con algn carcter, como un guin,
un punto o algo similar, puedes utilizar las listas de prrafos:
\ begin { i t e m i z e }
\ item . . .
\ item . . .
. . .
\ end { i t e m i z e }

Tambin estas listas las puedes anidar entre s hasta cuatro niveles de profundidad,
cambiando el carcter que marca a los distintos prrafos. Observa el siguiente ejemplo, con
el cdigo de LATEX a la izquierda y el resultado a la derecha.

\ begin { i t e m i z e }
\ i t e m Primero d e l p r i m e r n i v e l
\ begin { i t e m i z e }
\ i t e m Primero d e l segundo n i v e l
\ begin { i t e m i z e }
\ i t e m Primero d e l t e r c e r n i v e l
\ begin { i t e m i z e }
\ i t e m Primero d e l c u a r t o n i v e l
\ i t e m Segundo d e l c u a r t o n i v e l
\ end { i t e m i z e }
\ i t e m Segundo d e l t e r c e r n i v e l
\ end { i t e m i z e }
\ i t e m Segundo d e l segundo n i v e l
\ end { i t e m i z e }
\ i t e m Segundo d e l p r i m e r n i v e l
\ end { i t e m i z e }

Primero del primer nivel


Primero del segundo nivel
Primero del tercer nivel
Primero del cuarto nivel
Segundo del cuarto nivel
Segundo del tercer nivel
Segundo del segundo nivel
Segundo del primer nivel

Al igual que en las numeraciones, no puedes tener ms de cuatro anidamientos del


mismo tipo de listas.
Puedes modicar el carcter que quieras que use como marca en la lista, colocando
el carcter deseado entre corchetes a continuacin de \item en el prrafo seleccionado. El
cdigo se encuentra a la izquierda y el resultado a la derecha.

6.6 Listas de enunciados o prrafos

161

\ begin { i t e m i z e }
- Primero del primer nivel
\ \ i t e m [ ] Primero d e l p r i m e r n i v e l
\ begin { i t e m i z e }
+ Primero del segundo nivel
\ i t e m [ + ] Primero d e l segundo n i v e l
: Primero del tercer nivel
\ begin { i t e m i z e }
> Primero del cuarto nivel
\ i t e m [ : ] Primero d e l t e r c e r n i v e l
Segundo del cuarto nivel
\ begin { i t e m i z e }

Segundo
del tercer nivel
\ i t e m [ > ] Primero d e l c u a r t o n i v e l
\ i t e m Segundo d e l c u a r t o n i v e l
Segundo del segundo nivel
\ end { i t e m i z e }
Segundo del primer nivel
\ i t e m Segundo d e l t e r c e r n i v e l
\ end { i t e m i z e }
\ i t e m Segundo d e l segundo n i v e l
\ end { i t e m i z e }
\ i t e m Segundo d e l p r i m e r n i v e l
\ end { i t e m i z e }

Como puedes observar, a diferencia de las numeraciones, nicamente cambia el prrafo


de la lista que hayas marcado. El resto de las marcas se mantiene igual. Hay manera de
cambiar la marca para todos los elementos del nivel de anidamiento, de la misma manera
que se hizo con las numeraciones.

6.6.3.

Descripciones
El formato para las descripciones es:
\ begin { d e s c r i p t i o n }
. . .

prrafos-marcados

. . .
\ end { d e s c r i p t i o n }

donde cada prrafo marcado lleva inmediatamente despus de \item, entre corchetes, el
ttulo que quieres aparezca para la descripcin. Este ttulo aparecer con otro tipo de letra
que el normal, para destacarlo. El resto del prrafo se alinear dejando una pequea sangra.
Sigue un ejemplo en el siguiente cdigo.

162

LATEX

\ begin { d e s c r i p t i o n }
\ i t e m [ enumerate : ] Cada n i v e l se va numerando manteniendo un
c o n t a d o r para t a l e f e c t o .
\ begin { d e s c r i p t i o n }
\ i t e m [ segundo n i v e l ] Es una prueba para v e r s i t i e n e s e n t i d o
meter o t r o n i v e l ms en d e s c r i p c i o n e s .
\ begin { d e s c r i p t i o n }
\ i t e m [ t e r c e r n i v e l ] Otra p r u e b i t a ms d e l asunto
\ begin { d e s c r i p t i o n }
\ i t e m [ c u a r t o n i v e l ] Y an hay ms
\ begin { d e s c r i p t i o n }
\ i t e m [ q u i n t o n i v e l ] A v e r s i en e s t e t i p o de l i s t a s
s se v a l e
\ end { d e s c r i p t i o n }
\ end { d e s c r i p t i o n }
\ end { d e s c r i p t i o n }
\ end { d e s c r i p t i o n }
\ i t e m [ i t e m i z e : ] Cada p r r a f o se marca con un determinado c a r c t e r ,
dependiendo d e l n i v e l de anidamiento .
\ i t e m [ d e s c r i p t i o n : ] S i r v e para poner e x p l i c a c i o n e s o d e f i n i c i o n e s .
\ end { d e s c r i p t i o n }

que produce el siguiente texto:


enumerate: Cada nivel se va numerando manteniendo un contador para tal efecto.
segundo nivel Es una prueba para ver si tiene sentido meter otro nivel ms en descripciones.
tercer nivel Otra pruebita ms del asunto
cuarto nivel Y an hay ms
quinto nivel A ver si en este tipo de listas s se vale
itemize: Cada prrafo se marca con un determinado carcter, dependiendo del nivel de
anidamiento.
description: Sirve para poner explicaciones o deniciones.
Es importante que notes que en el caso de las descripciones puedes anidar tantas veces
como lo desees.
Vamos a crear un archivo nuevo para escribir algunas preguntas y respuestas respecto a
las listas de prrafos que te acabamos de presentar. Para ello:
Actividad 6.15 Crea un archivo con clase de documento article y que use los mismos
paquetes que usa CalcProp.tex.

6.6 Listas de enunciados o prrafos

163

Actividad 6.16 Ponle como ttulo tu nombre y el nmero de actividad.


Actividad 6.17 A continuacin, escribe en el archivo el nombre de cada paquete que usas
y una breve descripcin de para qu lo usas (los nombres de los paquetes te deben dar una
idea).
Ahora que ya tienes ms comandos que teclear, veremos algunas tareas que Emacs te
facilita:
1. Aparear bien los ambientes en
\ begin { . . . }
...
\ end { . . . } +

Esto se consigue tecleando C-c C-e y en la lnea de comando de Emacs aparecer


Environment t y p e ( d e f a u l t . . . )

Generalmente, el valor por omisin es el del ltimo ambiente elegido o itemize, si


es la primera vez en la sesin que lo solicitas. Si tecleas Enter , proceder a crear la
pareja \begin {..} \end {..} , dejando el cursor entre ellos para que procedas a escribir. Si
el ambiente que elegiste es alguna lista, coloca el primer \item. Si la lista elegida es
description , pregunta por la primera etiqueta.
Este comando de Emacs va guardando los ambientes que le vas solicitando. Puedes
recorrer la lista de comandos usados con la echa vertical. Cuando es la primera vez
que vas a usar un ambiente dado, simplemente tecleas el nombre del ambiente (por
ejemplo, enumerate, description) para que lo meta a la lista de ambientes disponibles.
2. Cerrar algn ambiente que est abierto: C-c ] . Con este comando, Emacs coloca el
\end {..} del \begin {..} ms cercano que no haya sido cerrado.
Actividad 6.18 Haz una lista de invitados a una boda, donde separes los invitados de los
padres del novio, los padres de la novia, los invitados del novio y los invitados de la novia.
Esta lista deber aparecer en el archivo que acabas de crear. La lista deber facilitar sacar
el total de invitados a la boda.

6.6.4.

Listas ms compactas
Como puedes observar de los ejemplos que mostramos, muchas veces el espacio entre
los incisos en cada tipo de lista es excesivo. LATEX cuenta con un paquete de LATEX que
te permite acortar estos espacios, el paquete paralist . Este paquete, adems de acortar los
espacios verticales, asume las funciones del paquete enumerate permitiendo modicar las
etiquetas de las distintas listas. Para poder hacer esto ltimo, pasas como opciones al cargar
el paquete newenum y newitem de la siguiente manera:

164

LATEX
\ usepackage [ newenum , newitem ] { p a r a l i s t }

Si usas este paquete, es conveniente ya no cargar el paquete enumerate. Proporciona los


siguientes ambientes:
\ begin { compactenum }
...
\ end { compactenum }
\ begin { compactitem }
...
\ end { compactitem }
\ begin { compactdesc }
...
\ end { compactdesc }

Estos tres ambientes resultan muy cmodos para compactar un poco el texto que se est
produciendo. En este libro es ms comn que usemos estos ambientes que los originales de
LATEX. paralist tiene adems listas corridas en un nico rengln, pero no las revisaremos
en este momento.

6.7. Tablas
En general, LATEX provee comandos para denir tablas de los tipos ms variados. Veremos ac nicamente las ms sencillas, aunque no por eso poco poderosas.
Una tabla es un conjunto de renglones alineados por columnas. Por ello, para que LATEX
vaya acomodando las columnas le debes dar el nmero de columnas y el formato de de
cada una de ellas. El formato general de una tabla de texto es el siguiente:
\ begin { t a b u l a r } [ <pos> ] { <cols> }
<renglones>
\ end { t a b u l a r }

Es necesario aclarar que una tabla puede aparecer en cualquier posicin donde aparezca
una palabra. Por ello, es conveniente en la inmensa mayora de los casos preceder y suceder
a la tabla con un rengln en blanco.
El argumento que va entre corchetes, <pos> se reere al caso en que desees que la tabla
aparezca a continuacin de una palabra, si la queremos alineada desde arriba ( [ t ] ), desde
abajo ( [b]) o centrada [c] , que es el valor por omisin. Este parmetro no tendr sentido si
se deja, como acabamos de mencionar, un rengln en blanco antes y despus de la tabla.
El argumento <cols> se reere al formato que debern tener las columnas de la tabla,
y que ser aplicado a cada uno de los renglones. Debes especicar el formato para cada
una de las columnas que deseas tener en la tabla. Tambin especicas si se debe colocar

165

6.7 Tablas

algo entre las columnas. De esto, <cols> corresponde a una lista de especicadores, que
se reeren a la sucesin de columnas e intercolumnas:
Tabla 6.5

Modicadores para la denicin de columnas

Especicacin

Descripcin

Especica que el contenido de esta columna se colocar pegado a la


izquierda, y ocupar tanto espacio como requiera para quedar contenido en un rengln.

Similar al anterior, pero pegado a la derecha.

Similar al anterior, pero centrado.

p{<ancho>}

Da un ancho jo para la columna. LATEX acomodar el texto como si


fuera un prrafo, ocupando tantos renglones como sea necesario.

m{<ancho>}

Igual que p, excepto que si hay columnas que dan un nmero distinto
de lneas para el mismo rengln, centra verticalmente el contenido de
las columna.

Para estas dos opciones, el {<ancho>} deber estar dado en:


in

pulgadas

cm

centmetros

mm

milmetros

pt

puntos

em

ancho de carcter

Algn nombre de longitud


|

Una lnea vertical que separa columnas.

||

Dos lneas verticales separando las columnas.

En los primeros tres casos, el tamao nal de la columna ser el mximo de todos los
renglones de la tabla. Si es que va a haber mucho texto en cada columna, te recomendamos
usar la cuarta o quinta descripcin, para que el rengln se doble y se conforme un prrafo.
Los renglones se componen de material que quieres en cada columna. Cada vez que
deseas cambiar de columna, debes insertar un carcter & y cada vez que quieras cambiar de
rengln debers agregar al nal del rengln \\.
Puedes colocar lneas entre cada dos renglones con el comando \hline. Cuando no es el
primero de los renglones, debe venir a continuacin de un cambio de rengln. Veamos un
ejemplo sencillo a continuacin.

166

LATEX

\ begin { t a b u l a r } [ t ] { cccc }
l e t r a s y smbolos \ \
palabras & oraciones
& p r r a f o s & subsecciones \ \
secciones & cap t u l o s
& p a r t e s & documento
\ end { t a b u l a r }

Se tiene una tabla con cuatro columnas y dos renglones y se usa & para separar las
columnas entre s. Se utilizan \\ para separar los renglones. La tabla queda de la siguiente
manera:
letras
pa
sec
Es importante que notes que lo que corresponde a un rengln formado no forzosamente
tiene que aparecer en el mismo rengln en el cdigo. Slo en el caso en que la especicacin de la columna sea p o m, el introducir un rengln en blanco ser interpretado
como cambio de prrafo, que lo realiza dentro del mismo rengln de la tabla y en la misma
columna.
Actividad 6.19 Crea un archivo Tablas.tex y copia el prembulo de CalcProp.tex. Copia
la denicin de la tabla anterior, compila y ve el resultado.
Actividad 6.20 Modica la tabla anterior para que quede de la siguiente manera:
letras y smbolos
prrafos
captulos

palabras
subsecciones
partes

oraciones
secciones
documento
don-

de la primera columna est justicada a la izquierda, la segunda centrada y la tercera a la


derecha. La tabla tiene tres columnas en lugar de cuatro.

6.7.1.

Multicolumnas
En la tabla anterior, el texto letras y smbolos ocupa mucho ms espacio que el resto
de los textos en esa columna. Por ello, se toma la decisin de que este texto ocupe dos
columnas. Si lo separas a pie queda mal distribuido, pues interviene el espacio entre
columnas:
letras
palab
seccio

167

6.7 Tablas

Para que se centre en dos columnas puedes utilizar el comando


\ m u l t i c o l u m n { <nm> } { < c o l s > } { < t e x t o > }

donde {<nm>} es el nmero de columnas de la tabla original que va a ocupar; {#<cols>} es


la manera de acomodar esa columna, con sus posibles carcteres entre columnas; y {<texto>}
es lo que queremos que aparezca en esa nueva columna. Un \multicolumn puede aparecer
en cualquier lugar donde pueda aparecer el contenido de una columna, al inicio de un
rengln o inmediatamente a continuacin de un &. Debes tener cuidado de que el nmero
de columnas que se coloca en {<nm>} no exceda el nmero de columnas que quedan
disponibles en el rengln, a partir de la columna donde se est colocando el comando. La
tabla queda como sigue:

\ begin { t a b u l a r } [ t ] { cccc }
\ m u l t i c o l u m n { 2 } { c } { l e t r a s y smbolos } \ \
palabras
& o r a c i o n e s & p r r a f o s & subsecciones \ \
secciones & cap t u l o s & p a r t e s & documento
\ end { t a b u l a r }

y se forma como sigue:

letras y smbolos
palabras oraciones
secciones captulos

prrafos
partes

subsecciones
documento

Puedes usar el comando de \multicolumn tambin para modicar exclusivamente el contenido de una columna en un determinado rengln. Por ejemplo, si deseas que para esa
columna en ese rengln en lugar de estar centrado est justicado a la derecha, o que no
tenga separadores entre columnas. Puedes hacer esto para lograr, sin juntar columnas, casi
el mismo efecto que lograste uniendo dos columnas:

168

LATEX

\ begin { t a b u l a r } [ t ] { cccc }
\ m u l t i c o l u m n { 1 } { r } { l e t r a s y }&
\ m u l t i c o l u m n { 1 } { l } { smbolos } \ \
palabras
& o r a c i o n e s & p r r a f o s & subsecciones \ \
secciones & cap t u l o s & p a r t e s & documento
\ end { t a b u l a r }

El texto formado queda como se muestra a continuacin. Nota que, ahora s, desapareci el espacio de ms entre y y smbolos.
letras y smbolos
palabras oraciones
secciones captulos

prrafos
partes

subsecciones
documento

Tambin puedes aprovechar las multicolumnas para poner ttulos a la tabla o pies de
pgina:
Componentes de un documento de LaTeX
letras y smbolos
palabras oraciones
secciones captulos

prrafos
partes

subsecciones
documento

Se puede numerar a partir de subsecciones

En general puedes agregarle modicadores a las columnas para que el texto de esa columna tenga un tamao o tipo particular. Por ejemplo, para el ttulo de la tabla agregas al
principio del texto el modicador \ bf y para el ltimo rengln cambias el tamao del carcter a \ footnotesize. Estos cambios se aplican nicamente a esa columna y en ese rengln.
Asimismo, puedes saltar lneas en blanco entre renglones, simplemente agregando cambios
de lnea ( \\ ) al nal del rengln.
Actividad 6.21 Repite la tabla que construiste y modifcala para agregarle el ttulo y el
ltimo rengln.

6.7.2.

Separacin de renglones y columnas


Como mencionamos al decir qu puede ir en {<cols>}, dijimos que puedes tener una o
dos lneas verticales que separan a las columnas. Tambin puedes tener lneas horizontales
que separen a los renglones. Veamos la siguiente tabla que incluye separadores de columna
y de rengln.

169

6.7 Tablas

Ambiente
Reporte

Nombre
report

Artculo

article

Descripcin
Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizars para la
entrega de tareas, elaboracin de pequeos manuales, etc.
Permite escribir en dos columnas fcilmente.

que fue producida por el siguiente cdigo:


\ begin { t a b u l a r } [ t ] { | l | l | p { 8cm } | }
\ hline
Ambiente& Nombre& D e s c r i p c i n \ \
\ hline
Reporte& r e p o r t &Se u t i l i z a para cosas menos f o r m a l e s
que un l i b r o o un a r t c u l o . No
t i e n e cap t u l o s , s i n o que agrupa
a p a r t i r de secciones . \ \
\ hline
A r t c u l o& a r t i c l e &Es , t a l vez , e l ambiente que ms seguido
u t i l i z a r s para l a e n t r e g a
de t a r e a s , e l a b o r a c i n de pequeos
manuales , e t c . Permite e s c r i b i r en dos
columnas f c i l m e n t e . \ \
\ hline
\ end { t a b u l a r }

Observa que antes de cada \ hline , excepto el primero, debe haber un cambio de rengln.
En cambio, despus del \ hline no es necesario un cambio de rengln. Como ya vimos, puedes modicar el tipo y/o tamao de cualquiera de los contenidos de una columna en un
determinado rengln. Por ejemplo, se acostumbra que los ttulos vayan en negritas. Tambin deseas lneas dobles horizontales entre los ttulos y el contenido de la tabla. Juguemos
un poco con eso. Para no ocupar tanto espacio nada ms mostraremos el rengln o renglones que estemos modicando. Lo primero que haremos es separar a los encabezados de
columnas con lneas dobles y ponerlos en negritas, de la siguiente manera:
\ hline \ hline
\ b f Ambiente& \ Large \ t e x t b f { Nombre } & \ sc D e s c r i p c i n \ \
\ hline \ hline

Integrados estos cambios, la tabla se ve como sigue:

170

LATEX

Ambiente

Nombre

D ESCRIPCIN

Reporte

report

Artculo

article

Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que
agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizarn para la entrega de tareas, elaboracin de
pequeos manuales, etc. Permite escribir en dos
columnas fcilmente.

Supongamos que le agregas dos renglones ms, pero que por el momento no tienes
decidido qu escribir en la descripcin:
A c e t a t o s&seminar \ \ \ h l i n e
Cartas& l e t t e r \ \ \ h l i n e

Y veamos cmo se ve la tabla:


Ambiente

Nombre

D ESCRIPCIN

Reporte

report

Artculo

article

Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que
agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizars para la entrega de tareas, elaboracin de
pequeos manuales, etc. Te permite escribir en
dos columnas fcilmente.

Acetatos
Cartas

seminar
letter

Nota que falta la lnea vertical al nal. Esto es porque no especicaste nada para la
tercera columna. Cuando tienes lneas verticales para separar columnas, debes completar
todas las columnas en cada rengln. Los renglones agregados debieron tener la siguiente
forma:
A c e t a t o s &seminar & \ \ \ h l i n e
Cartas & l e t t e r & \ \ \ h l i n e

Veamos cmo queda la tabla, que se muestra a continuacin.

171

6.7 Tablas

Ambiente
Reporte

Nombre

Artculo

article

Acetatos
Cartas

seminar
letter

report

D ESCRIPCIN
Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que
agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizars para la entrega de tareas, elaboracin de
pequeos manuales, etc. Te permite escribir en
dos columnas fcilmente.

Supongamos ahora que quieres agregarle a la tabla un ttulo, que quede dentro de la
tabla en el primer rengln. Para eso puedes utilizar nuevamente el comando \multicolumn.
Debes tener cuidado si es que las columnas originales tienen separacin por columnas,
porque debes especicar explcitamente las nuevas separaciones. Quieres el ttulo centrado,
pero de ancho mayor que el resto de los renglones. Para lograrlo pones un rengln en blanco
antes y despus. Veamos cmo funciona en la tabla que estamos usando como ejemplo:
\ multicolumn { 3 } { | c | } { } \ \
\ m u l t i c o l u m n { 3 } { | c | } { \ Large \ t e x t b f { Clases de documentos
en \ t e x t n o r m a l { \ LaTeX { } } } } \ \
\ multicolumn { 3 } { | c | } { } \ \ \ h l i n e

Clases de documentos en LATEX


Ambiente
Reporte

Nombre

Artculo

article

report

D ESCRIPCIN
Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que
agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizarn para la entrega de tareas, elaboracin de
pequeos manuales, etc. Permite escribir en dos
columnas fcilmente.

De los ejemplos anteriores, es claro que cuando colocas carcteres entre las columnas,
dejar renglones en blanco no es trivial.
Al igual que cuando no tienes lneas entre las columnas, puedes utilizar \multicolumn
para quitar las lneas de una determinada columna en un cierto rengln. La manera como
se asocian las separaciones de columnas son:
La primera columna tiene asociadas la lnea a su izquierda y a su derecha.

172

LATEX

A partir de la segunda columna, cada columna debe redenir su lnea derecha.


Actividad 6.22 Codica la siguiente tabla, que es una nueva versin de la tabla anterior.
Ten cuidado con las lneas que separan las columnas. Observa que puedes trabajar a partir
de la tabla ya codicada.

Clases de documentos en LATEX

Tema:
Ambiente
Reporte

Nombre

Artculo

article

report

D ESCRIPCIN
Se utiliza para cosas menos formales que un libro o un artculo. No tiene captulos, sino que
agrupa a partir de secciones.
Es, tal vez, el ambiente que ms seguido utilizars para la entrega de tareas, elaboracin de
pequeos manuales, etc. Te permite escribir en
dos columnas fcilmente.

** La lista no es exhaustiva

6.7.3.

Lneas incompletas verticales y horizontales


Veamos la tabla que se encuentra a continuacin a la izquierda. Entre el segundo y tercer
rengln no quieres una lnea completa, sino nicamente una que cubra la segunda y tercera
columna. Esto se consigue con el comando \cline{ci-cf}, donde ci es el nmero de la
columna inicial y cf es el nmero de la columna nal. A su lado se muestra la codicacin
de la tabla, donde puedes ver en la cuarta lnea de la codicacin el uso del comando
\ cline{23}, que indica que la lnea parcial empieza en la columna 2 y termina en la 3.
Vericador de Paridad
Sigma
Q
0
1
F
PAR PAR NON 1
NON NON PAR 0

\ begin { t a b u l a r } { | c | c | c | | c | }
\ hline
\ m u l t i c o l u m n { 4 } { | c | } { \ b f V e r i f i c a d o r \ de \
Paridad } \ \ \ h l i n e \ h l i n e
&\ m u l t i c o l u m n { 2 } { c | | } { \ b f Sigma }
& \ \ \ c l i n e {2 3}
\ bf Q & 0 & 1 & F \ \ \ hline
PAR & PAR & NON & 1 \ \ \ h l i n e
NON & NON & PAR & 0 \ \ \ h l i n e
\ end { t a b u l a r }

Tienes tambin el comando \vline que introduce una lnea de separacin de columna,

173

6.7 Tablas

que cubre toda la columna. Se codic como se muestra a la derecha de la tabla formada.

Esta es
Para mostrar la divisin

una prueba
articial

\ begin { t a b u l a r } { | c | l | }
\ hline
Esta es & una prueba \ \
\ hline
Para m o s t r a r \ v l i n e \
la
d i v i s i n & a r t i f i c i a l \ \ \
\ hline
\ end { t a b u l a r }

Como se puede ver, en la cuarta lnea del cdigo aparece, a mitad de la columna, el
comando \vline. Va seguido de la secuencia \ que obliga a dejar un espacio en blanco
entre el comando y lo que sigue. Tambin hay que recordar que el formato del cdigo no
inuye en el de la tabla, por lo que puedes partir renglones arbitrariamente en el cdigo.

6.7.4.

Espacio entre los renglones


Para terminar con esta seccin hablaremos un poco de cmo estirar el espacio entre
renglones de una tabla, forzando a que las separaciones de columna se mantengan. Esto
es deseable cuando quieres que haya ms separacin entre renglones que la normal, pero
no tanto espacio como lo da un rengln en blanco. Puedes modicar la distancia dada
por el cambio del rengln colocando un argumento a continuacin de \\ con el formato
[< num > < medida >]. Veamos un ejemplo, en el que agregamos 4 y 10 puntos al
cambio de rengln. El cdigo se encuentra a la derecha y la tabla formada a la izquierda.

Esta es
Para mostrar la divisin

una prueba
articial

\ begin { t a b u l a r } { | c | l | }
\ hline
Esta es & una prueba \ \ [ 4 p t ]
\ hline
Para m o s t r a r \ v l i n e \
la
d i v i s i n &
a r t i f i c i a l \ \ [ 1 0 pt ]
\ hline
\ end { t a b u l a r }

Observa que las lneas verticales que separan a las columnas se extienden para cubrir
toda la columna.
< num > puede ser negativo tambin, forzando a que haya un retroceso. El cdigo
se encuentra a la derecha de la tabla formada:

174

LATEX

Esta es

una prueba

Para mostrar la divisin

articial

Ac mostramos el efecto de subir la raya

\ begin { t a b u l a r } { | c | l | }
\ hline
Esta es & una prueba \ \ [ 6 p t ]
\ hline
Para m o s t r a r \ v l i n e \
la
d i v i s i n
& a r t i f i c i a l \ \ [ 1 0 pt ]
\ hline
\ m u l t i c o l u m n { 2 } { | l | } { Ac
mostramos \ v l i n e \
e l e f e c t o de s u b i r
l a raya } \ \ [ 6 p t ]
\ hline
\ end { t a b u l a r }

Actividad 6.23 Codica la siguiente tabla:

Ao
1971

Bonetera Cientca, S. A.
Precio
bajo alto
Comentarios
97-245
Mal ao.

72

245-245

73

245-2001

Poco comercio debido a


un invierno crudo.
Ningn gnus fue buen
gnus este ao.

6.8. Frmulas matemticas y smbolos especiales


Hasta ahora has escrito texto que si bien te permite escribir, por ejemplo, una novela,
no te sirve de mucho para cuando quieres escribir texto un poco ms especializado. En
estas notas han aparecido muchos carcteres especiales. En general, deseas poder escribir
carcteres especiales y, en particular, frmulas matemticas.
Para algunos carcteres especiales, como pudieran ser las vocales acentuadas del espaol, las diresis en la u o la tilde en la n, hemos logrado que Emacs se comporte como
mquina de escribir y haga que el apstrofo (), la tilde (~) y las comillas (") se comporten
lo que se conoce como smbolos sordos, esto es, que no escuchen hasta que se teclee
el siguiente carcter o bien est congurado el teclado para que la combinacin de tecla
con Alt produzca los carcteres acentuados . Sin embargo, pudiera ser que no estuviera

175

6.8 Matemticas en LATEX

Emacs habilitado de esta manera. En general, LATEX provee mecanismos para que se impriman una gran cantidad de smbolos que no aparecen en el ingls, pero que se usan en
idiomas como el francs, el espaol y el alemn. Casi todos empiezan con una diagonal
inversa \ y siguen con el cdigo especial dado a ese carcter. LATEX los llama smbolos.
Veamos a continuacin una lista de los ms usados:
Tabla 6.6

Acentos

\{o}
\={o} o
\t{oo} o o

\~{o}
\H{o} o
\b{o} o

\v{o} o
\d{o} o.
\"{o}

\c{o} o
\^{o}
\u{o} o

\{o}
\.{o}
\{\i}

En todas estas combinaciones puede aparecer cualquier carcter alfabtico. En el caso


de que lo que siga a la \ sea un smbolo especial, no es necesario poner al argumento entre

llaves: \~a y \^d d.


Los smbolos que siguen no tienen argumentos, sino que se sustituyen tal cual se especican.
Tabla 6.7

Smbolos no ingleses

\ae
\OE
!

\oe
\O
\o

\aa
\l

\ss

\AA
\L

\AE
?

Se tienen algunos smbolos de puntuacin que resultan tiles. Se incluyen ac tambin


los smbolos que tienen algn signicado especial en LATEX.
Tabla 6.8

Smbolos de puntuacin y especiales

\dag
\ddag
\%
%

\S

\pounds
\&
&

c
\copyright

\#
#
\_ \&
_ &&verb+{ }+

\P
\$ $
{}

Finalmente, cuando se trate de que un smbolo aparezca tal cual, sin que sea interpretado por LATEX (por ejemplo, la diagonal inversa \) simplemente usas el comando
\verb+texto+ y todo el texto que aparece entre los smbolos + no ser interpretado y
aparecer en la pgina tal cual lo tecleaste2 .
2

Usando este comando es como se han escrito algunos de los comandos en todo este texto.

176

LATEX

Actividad 6.24 Crea un archivo nuevo copiando el prembulo que hemos visto hasta ahora.
Actividad 6.25 Construye una tabla de cinco columnas en las que veas el resultado de
aplicar seis de los tipos de acentos a las cinco vocales.

6.8.1.

Frmulas matemticas
El tipo de texto que hemos escrito hasta ahora es lo que LATEX denomina texto LR
(left to right) y que consiste fundamentalmente de prrafos que se acomodan en la hoja
como vienen. Cuando quieres escribir frmulas matemticas, stas contienen smbolos que
obligan al compilador a realizar un formato tambin vertical, no nada ms en el rengln
correspondiente. Para lograrlo debers introducir un ambiente matemtico. Tienes dos
tipos de ambientes matemticos:
i. En la lnea, donde lo que buscas es poder intercalar una frmula o un carcter (i =
2 3 ). Esto se logra, de cualquiera de las siguientes maneras:
Se escribe:
=2

Se forma:
i = 2 3

\(\ alpha_i=2\cdot\beta^3\)

i = 2 3

\begin{math}\alpha_i=2\cdot\beta^3\end{math}

i = 2 3

ii. En un recuadro que contiene a la frmula matemtica. Introduces tambin un ambiente que dejar espacio en blanco entre el prrafo anterior y el siguiente. Dentro de
ese prrafo puedes escribir las frmulas. Para mostrar esta modalidad, se mostrar del
lado izquierdo el texto fuente y del derecho el texto formado:
\ [ \ alpha =2\ c d o t \ beta ^ 3 \ ]

i = 2 3

\ begin { d i s p l a y m a t h }
\ a l p h a _ i =2\ c d o t \ beta ^3
\ end { d i s p l a y m a t h }

i = 2 3

La diferencia fundamental entre el modo de despliegue (prrafo) y el de lnea es el


tamao de los trminos. Mientras que en el modo de lnea se ajusta el tamao a la altura
normal de una lnea, en el modo de prrafo ocupa tanto espacio vertical como requiera.
Compara estos dos modos en el siguiente esquema.
\(2\ frac {n}{n +1\}\)

n
2 n+1

\[2\ frac {n}{n+1}\]

n
n+1

177

6.8 Matemticas en LATEX

Cuando ests en modo matemtico, ya sea de lnea o de recuadro, los espacios en blanco
nicamente tendrn sentido para separar comandos. No aparecern en las frmulas que
escribas como tales, a menos que utilices un blanco precedido por la diagonal inversa. El
texto que escribas se formar con un tipo parecido al de las itlicas, y si escribes varias
palabras, aparecern sin los espacios. Compara el modo matemtico con el tipo itlico en
los siguientes renglones.
\( Esta\ es\ una\ prueba\)
{\ it Esta es una prueba}

Esta es una prueba


Esta es una prueba

Nota que el lugar que ocupa cada carcter es ligeramente mayor en el modo matemtico.
Revisemos ahora cules son los componentes principales de las frmulas matemticas.

Exponentes
Una de las acciones ms comunes que quieres realizar es la de poner exponentes. Esto
se logra fcilmente si donde quieres deseas un exponente colocas el smbolo ^ seguido de
un slo smbolo, para que ese smbolo aparezca como exponente; o bien seguido de varios
smbolos, todos ellos entre llaves. No se permiten secuencias de ms de una combinacin
de ^ con el exponente. Siguen algunos ejemplos:
$a^m b^n c^{n+m}$
$x^{y^2}$
$x^{2y}$
$x^2y$

am bn cn+m
2
xy
2y
x
x2 y

En el segundo ejemplo nos vimos forzados a encerrar el segundo exponente entre llaves
para que no se infringiera la regla de que hubiera ms de uno seguido. De esta manera, el
exponente de x es, simplemente, otra expresin con exponente.
Como puedes observar en todos estos ejemplos, las llaves sirven para indicar dnde
empieza y termina el exponente. Es claro, por ejemplo en el ltimo caso, que en ausencia
de llaves LATEX considerar nicamente al primer carcter que sigue a ^.
Actividad 6.26 Codica en LATEX las siguientes frmulas:
3x2 + 4xy + 2y 2 = 0
b + (b2 4ac)1/2 /(2a)
an! bm! c(n+m)!
(x y)2 (x2 y 2 )(x + y)2

178

LATEX

Subndices
Funcionan de la misma manera que los exponentes, excepto que se usa el smbolo _ de
subrayado en lugar del ^. Las mismas reglas aplican para subndices que para exponentes.
Siguen algunos ejemplos:
$a_m b_n c_{n+m}$

am bn cn+m

$x_{y_2}$

x y2

$x_{2y}$

x2y

$x_2y$

x2 y

Actividad 6.27 Codica en LATEX las siguientes expresiones:


Pi log2 Pi
(xi1 yi1 ) + (x2i2 yi22 ) + (x3i3 yi33 )
(x21 + y12 )1/2
(Xmax Xmin )2 /(Ymax Ymin )2

6.9. Emacs y LATEX


En este momento ya conoces una buena cantidad de herramientas LATEX, has incursionado incluso en matemticas en LATEX. ste es un buen momento para que revises qu puede
hacer Emacs por ti. Mejor dicho, qu puede hacer AUCTEX, el modo mayor para editar
LATEX en Emacs por ti.
En la seccin 6.12.1, en la pgina 238, explicamos con detalle qu comandos de AUCTEX
ejecutan las secuencias C-c Ce y otras que hemos mencionado en este captulo. Tambin agregamos informacin sobre el modo para ingresar smbolos matemticos de manera
rpida y un buen nmero de detalles ms.
AUCTEX, desgraciadamente, no es parte estndar de todas las distribuciones de Emacs.
Por ello, en la seccin 6.12.1 te explicamos cmo obtener, instalar y congurar AUCTEX.

Letras griegas
Para que se imprima una letra griega haces preceder el nombre de la misma (en ingls)
por la diagonal inversa. En la tabla 6.9 se muestran las letras griegas disponibles:

179

6.9 Emacs y LATEX


Tabla 6.9

Smbolos griegos

Minsculas
\alpha

\theta

\tau

\beta

\vartheta

\pi

\upsilon

\gamma

\iota

\varpi

\phi

\delta

\kappa

\rho

\varphi

\epsilon

\lambda

\varrho

\chi

\varepsilon

\mu

\sigma

\psi

\zeta

\nu

\varsigma

\eta

\xi

\omega

Maysculas
\Gamma

\Lambda

\Sigma

\Psi

\Delta

\Xi

\Upsilon

\Omega

\Theta

\Pi

\Phi

Puedes ver que no para todas las letras griegas hay la versin en mayscula. Si no
aparece en esta lista es porque no la hay. Tambin existe, para algunas de ellas, la versin
para variable.
Actividad 6.28 Haz una tabla que contenga nicamente las letras griegas para las cuales
hay maysculas, y aqullas para las cuales hay versin en var. En la primera columna de
la tabla deber aparecer el nombre de la letra en minscula; en la segunda columna
deber imprimirse el smbolo; en la tercera columna, si es que hay, el smbolo para la
mayscula; y en la cuarta columna, si es que hay, el smbolo para la variable.

Smbolos con echas


En matemticas, y en computacin en general, se usan muy frecuentemente distintos
tipos de echas. Presentamos algunos en la tabla 6.10.

180
Tabla 6.10

LATEX
Smbolos con echas
\ leftarrow
\Longleftarrow
\Rightarrow
\ longleftrightarrow
\uparrow
\Downarrow
\mapsto
\hookrightarrow
\leftharpoondown
\leadsto
\swarrow



"
;





\ longleftarrow
\ rightarrow
\Longrightarrow
\ Leftrightarrow
\Uparrow
\updownarrow
\longmapsto

\Leftarrow
\longrightarrow
\ leftrightarrow
\ Longleftrightarrow
\downarrow
\Updownarrow
\hookleftarrow

\leftharpoonup

\rightharpoonup

#



\rightharpoondown
\nearrow
\nwarrow

\ rightleftharpoons
\searrow



!



Operadores
En la tabla 6.11 te mostramos smbolos comnmente usados en matemticas como
operadores y smbolos relacionales.
Tabla 6.11 Operadores y smbolos relacionales

\ bigtriangleup 
\times

\otimes
\ triangleleft
$

\sqcup
\ star
&
\ bigcirc


\rhd
\setminus
\
\cdot

\amalg
)
\equiv

.
\succ
\preceq
0
\pm

\cap

\oplus

\mp
\ominus

\diamond
\cup

\uplus

\bigtriangledown !

\oslash
$
\ triangleright %
\vee

\ circ

\dagger

\unlhd

\wr
(
\leq

\models
|=
\sim

\succeq
1

\sqcap

\ div

\ast
\odot
\lhd
\wedge
\ bullet
\ddagger
\unrhd
\geq
\prec
\perp
\simeq

%


Contina en la siguiente pgina

181

6.9 Emacs y LATEX


Tabla 6.11 Operadores y smbolos relacionales
\mid
\asymp
\supset
\subseteq
\Join
\neq
\sqsupseteq
\ in
\propto

|
5

1
<=
>

\ ll
\ parallel
\approx
\supseteq
\sqsubset
\smile
\doteq
\ ni
\vdash

Contina de la pgina anterior

3
6

<
'
.
=
@
B

\gg
\subset
\bowtie
\cong
\sqsupset
\sqsubseteq
\frown
\ notin
\dashv

%$

=
=
=
(

/
C

Actividad 6.29 Codica en LATEX las siguientes frmulas:


fX (yi )i log[fX (yi )i ]
(k)

6 X Yi

62 fX dX

mk (tij ) = i(k tij + k )


Actividad 6.30 Codica en LATEX las siguientes frmulas:
p 1 p q
(p q) (p q)
6 X Yj 62 6 X Yi 62 , Yi C
d(xi , yi ) = xi yj

Smbolos varios
Notars que a pesar de que hemos dado ya muchsimos smbolos matemticos, todava
nos faltan algunos que ya conoces como el para todo. En la tabla 6.12 ponemos algunos
smbolos ms que te van a ser de utilidad.

182
Tabla 6.12

LATEX
Smbolos varios
\aleph

\prime

\ forall

\ infty


\imath
\jmath j
\ ell
+
\wp

\Re
O
\Im
Q
\mho 0

\emptyset

\ exists

\Box

\hbar

\nabla
\surd

\top
\bot

\|
\angle

\neg

\ at
*
\ natural
\sharp
1
\backslash \
\ partial

2
\Diamond
3
\ triangle

\ clubsuit

\diamondsuit
\ heartsuit

\spadesuit

Actividad 6.31 Codica en LATEX las siguientes guras (pista: utiliza una tabla tabular
para acomodar las guras):
6

Nombres de funciones comunes


LATEX proporciona varios nombres de funciones comunes para que las escribas de manera especial, y no simplemente como cadenas. stas se presentan en la tabla 6.13.
Tabla 6.13 Nombres de funciones comunes
\arccos arc cos

\cos

ker
\ arcsin arcsin
\ lg
lg
\arctan arctan
\ lim
lm
\arg
arg

\limsup

\ker

\cosh
\ ln
\cot
\log
\coth

cos
lm sup
cosh
ln
cot
log
coth

\csc csc

\exp

\min mn

\sinh

\deg deg

\gcd

Pr
\det det
\sec sec
\dim dim

\sup

\Pr

\hom
\tan
\ inf

exp
sinh
gcd
sup
hom
tan
nf

Contina en la siguiente pgina

183

6.9 Emacs y LATEX


Tabla 6.13 Nombres de funciones comunes
\ liminf

lm inf

\max

Contina de la pgina anterior

max

a mod b

a \mod b

\ sin

sin

\pmod{b}

\tanh

tanh

(mod b)

Nota que como estamos trabajando en espaol (paquete babel) aquellas abreviaturas
que lo requieren llevan acento.

Fracciones
En el modo matemtico tienes dos maneras de escribir fracciones. La primera de ellas
es con la diagonal, como en
$3/4$
$1/(n+1)$

3/4
1/(n + 1)

Tambin se puede usar el comando \frac{numerador}{denominador} que escribe la fraccin de la siguiente forma:
$\ frac {3}{4} $

3
4

\[\ frac {3}{4}\]

3
4

$\ frac {1}{ n+1}$

1
n+1

\[\ frac {1}{ n+1}\]

1
n+1

Si \ frac usas en el modo matemtico en lnea, LATEX va a tratar de ajustar la frmula al


alto de un rengln, mientras que si usas el modo matemtico de recuadro, ocupar tanto
espacio vertical como requiera.
Actividad 6.32 Codica en LATEX las siguientes frmulas:
zn = xn yn = xn
fX (x) log

xn + xn1
xn xn1
=
2
2

2Xmax /M
i
c (x)

Races
La raz de una frmula o expresin se logra con el comando \ sqrt y ponindole como
argumento entre llaves a la expresin que quieres cubra la raz.
\ frac {x+y}{1+\sqrt {\ frac {y}{z+1}}}

x+y

y
1 + z+1

184

LATEX

Puedes tambin poner valor en el radical, agregando ese valor entre corchetes como
primer argumento de \ sqrt :
\ frac {x+y}{1+\sqrt[n ]{\ frac {y}{z+1}}}

x+y

y
1 + n z+1
Actividad 6.33 Codica en LATEX las siguientes frmulas:

2
b b2 a c
2a

1
1
3 () = ( 2
)

( + 1)2

Smbolos agrandables
Tenemos en matemticas muchos smbolos, como el de la integral o las series, que
deben tomar el tamao dado por todo lo que est a su derecha. Como vimos en el ejercicio
anterior, la raz cuadrada, por ejemplo, crece al tamao que toma su argumento. Esto lo
hace automticamente. Los smbolos en la tabla 6.14 son con los que cuenta LATEX para
el modo matemtico. El tamao aumenta nicamente cuando aparece en el modo en que
acomoda a la frmula en un prrafo, no en una lnea.
Tabla 6.14 Smbolos agrandables
\sum
\prod
\coprod
\ int
\ oint





\bigcap
\bigcup
\bigsqcup
\bigvee
\bigwedge







\bigodot
\bigotimes
\bigoplus
\biguplus






Cuando pones subndice o exponente a cualquiera de estos smbolos, LATEX los acomodar de tal manera que se vean bien. Por ejemplo,
\ [ \ sum_{ \ i n f t y } ^ \ i n f t y f _ {X | Y } ( x _ i | y _ j ) \ ]

fX|Y (xi |yj )

185

6.9 Emacs y LATEX


\ [ \ i n t _ 0 ^n f ( x ) ^ 2 g ( y ) ^ 2 \ ]

f (x)2 g(y)2

Mientras que si los pones en modo de lnea, aparecern como sigue:



$\sum_{\infty}^\ infty f_{X|Y}(x_i | y_j)$ se forma
fX|Y (xi |yj )
n
$\int_0^n f (x)^2g(y)^2$
se forma a 0 f (x)2 g(y)2 .
Otra manera de agrandar algunos de los smbolos, sobre todo aquellos que forman parejas como los parntesis, los corchetes o las llaves, es aclarando que vas a tener un
delimitador izquierdo y uno derecho para un determinado pedazo de frmula, usando los
comandos \ left y \ right , y colocando inmediatamente a continuacin el smbolo que se va
a usar. En el ejemplo que dimos para las races, los parntesis no crecieron al tamao de la
frmula que parentizan. Para lograrlo haces lo siguiente:
\ [ \ Sigma_3 ( \ c h i ) = \ s q r t { \ l e f t ( \ f r a c { 1 } { \ kappa ^2} \ f r a c { 1 }
{ ( \ kappa + 1 ) ^ 2 } \ r i g h t ) \ c h i ^{ \ kappa } } \ ]


3 () =

1
1

2 ( + 1)2

Puedes querer nicamente el smbolo de la izquierda o el de la derecha. En ese caso,


como smbolo a agrandar usas un punto (.). Veamos un ejemplo:
\ [ P ( x ) = \ l e f t \ { \ f r a c { x^2+y ^ 2 } { \ s q r t { ( x^2y ^ 2 ) ^ 2 } } \ r i g h t . \ ]

x2 + y 2

P (x) =

(x2 y 2 )2

Actividad 6.34 Codica en LATEX las siguientes frmulas:


  t

Ey
Lx,yk (s) ()ds
0

yn =

N


ai xni +

i=0

D(k) =

M 

i=1

M


bi yni

i=1
(k)

bi
(

(x yi )2 fX (x)dx

bi1 k)

Equivalente a \ left y \ right tenemos manera de pedir distintos tamaos de delimitadores


con las siguientes parejas, listadas de menor a mayor. El comando se hace seguir por un
nico smbolo.

186

LATEX
\ bigl
\ Bigl
\ biggl
\ Biggl

\ bigr
\ Bigr
\ biggr
\ Biggr

Por ejemplo, la siguiente frmula


\ [ \ B i g g l \ { \ b i g g l [ \ B i g l ( \ b i g l | prueba \ b i g r | \ B i g r ) \ b i g g r ] \ B i g g r \ } \ ]

se forma de la siguiente manera:






prueba
La lista de los smbolos que puedes usar como delimitadores y que se agrandan se
encuentra en la tabla 6.15.
Tabla 6.15 Delimitadores

\uparrow

\Uparrow

\downarrow

\Downarrow

\{

\}

\updownarrow

\Updownarrow

\ loor

\ roor

\ lceil

\ rceil

\ langle

\rangle

\backslash

\|

\rmoustache

"

\lmoustache

\lgroup

\arrowvert

\Arrowvert

\rgroup

\bracevert

Actividad 6.35 Codica en LATEX la siguiente frmula:


)
 &  '
(1
.
(m/k)/Um/kV
1<mn

1k<m

Puntos suspensivos (elipses)


Cuando en modo matemtico (o de texto) deseas poner puntos suspensivos, el teclearlo
directamente en LATEX como tres puntos seguidos no da el efecto deseado, ya que acerca
mucho entre s a los puntos. Por ello cuentas con dos maneras de poner puntos suspensivos:

187

6.9 Emacs y LATEX


\ [ \ t e x t { v a l o r e s para } x_1 , \ l d o t s , x_n \ ]

valores para x1 , . . . , xn
donde los puntos suspensivos se colocan alineados con la parte inferior de la lnea ( \ ldots );
o bien, alineados con la parte central de la lnea ( \cdots):
\ [ 1 + \ f r a c { 1 } { x ^2}+\ f r a c { 1 } { x ^4}+\ cdots +\ f r a c { 1 } { x ^{2^ n } } \ ]

1
1
1
+ 4 + + 2n
2
x
x
x
donde los puntos suspensivos se alinean con el operador para darle continuidad. Tambin
.
.
cuentas con puntos suspensivos verticales, \vdots:(..) y diagonales, \ddots ( . . ).
1+

Actividad 6.36 Codica en LATEX las siguientes frmulas:


F () = ad d + ad1 d1 + + a1 1 + a0 0







n
f () = cd
+ cd1
+ + c0
dn
d1n
n

Cambios de tipos y tamaos de letras


En el modo para matemticas no van a funcionar los comandos que cambian el tipo o
tamao de letra. Tampoco vas a poder utilizar las letras acentuadas o los smbolos que no
son del idioma ingls. Para intercalar un smbolo de stos en un ambiente matemtico lo
debes colocar como argumento de un comando \mbox. Veamos un ejemplo:
(qo, a)

\ begin { d i s p l a y m a t h }
\ d e l t a ( q \ mbox { \ b { o } } , a )
\ end { d i s p l a y m a t h }

En el modo matemtico tampoco van a funcionar las negritas u otros cambios en el tipo
de letra. El modo matemtico tiene sus propios tipos, que se muestran en la tabla 6.16.
Tabla 6.16 Tipos de letras en modo matemtico
$\mathcal{ABCDEF...}$

ABCDEF...
$\mathit{ it \acute{a}licas \cdot 2^{ ft }\ Psi \log [\ psi ]} $

ita licas 2 ft log[]


$\mathrm{romanas \cdot 2^{ft}\Psi \log [\ psi ]} $

romanas 2ft log[]


Contina en la siguiente pgina

188
Tabla 6.16

LATEX
Tipos de letras en modo matemtico

Contina de la pgina anterior

$\mathbf{negritas \cdot 2^{ ft }\ Psi \log [\ psi ]} $

negritas 2ft log[]


$\mathsf{sans\ serif \cdot 2^{ ft }\ Psi \log [\ psi ]} $

sans serif 2ft log[]


$\mathtt{m\acute{a}quina\ de\ escribir \cdot 2^{ ft }\ Psi \log [\ psi ]} $

m
aquina de escribir 2ft log[]
$\mathbb{BLACKBOARD CON BORDES DOBLES}$

BLACKBOARD CON BORDES DOBLES


Debes notar que todos estos tipos de letra mantienen al texto en modo matemtico.
Tambin es importante repetir que para separar palabras debes teclear un espacio \ ,
pues si no el modo matemtico no respeta espacios en blanco.
El primer y ltimo tipo ( \mathcal y mathbb nicamente los puedes usar con maysculas.
Cuando pides negritas en modo matemtico con \mathbf hay smbolos que no se imprimen en negritas. Observa que en el cuarto ejemplo, los smbolos correspondientes a
log[] no salieron obscurecidos. Para que salgan obscurecidos debes usar el comando
\ boldsymbol { . . .

que logra poner en negritas tambin a los smbolos matemticos. Mostramos ambas opciones juntas para que se note la diferencia:
\ [ \ mathbf { n e g r i t a s \ c d o t 2 ^ { f t } \ P s i \ l o g [ \ p s i ] } \ ]

negritas 2ft log[]


\ [ \ mathbf { n e g r i t a s \ c d o t 2 ^ { f t } \ boldsymbol { \ P s i \ l o g [ \ p s i ] } } \ ]

negritas 2ft log[]


Otra manera de lograr que todo el texto matemtico se escriba en negritas es mediante
el comando de cambio de estado \boldmath ( \unboldmath), que a partir del momento en que
aparece prende (apaga) las negritas en modo matemtico. Veamos un ejemplo:
\ hspace { 4em } \ boldmath \ ( a+b \ Box c \ )
\ unboldmath \ qquad \ ( a+b ) \ Box c \ )

a + b2c

a + b2c

Cabe hacer la aclaracin que estos comandos los tienes que poner antes de que entres
al modo matemtico, para que tengan efecto.
Actividad 6.37 Codica en LATEX la siguiente frmula, cuidando el tipo de letra y las
negritas:
Sea x <= y x N, y y x

189

6.9 Emacs y LATEX

Insertar texto en modo matemtico


Es necesario muchas veces introducir en un recuadro o lnea matemtica texto que
quieres aparezca en modo normal. Nota que esto no es lo mismo que hicimos cuando cambiamos el tipo de letra para los smbolos matemticos. Para ello se puede usar el comando
\ text {...} poniendo entre llaves el texto que deseas aparezca. Tambin puedes utilizar, en
general, cualquiera de los comandos \ text xx que vimos al inicio de esta seccin para modicar tipo de texto (donde xx es uno de bf, sf, tt, etc.).
Este comando preserva los espacios entre palabras:
\ [ x = \ f r a c {b \pm \ s q r t { b^24ac } } { 2 a } \ \
\ t e x t { Da l a s o l u c i n de e c u a c i n cuadr t i c a } \ ]

x=

b2 4ac
Da la solucin de ecuacin cuadrtica
2a

Tablas de frmulas
Hay dos maneras de organizar varias frmulas en una tabla. La primera de ellas es
con un tabular y colocando en cada celda el modo matemtico en lnea ($ \(... $\) ). La
otra manera es declarando un ambiente de lnea o recuadro y colocando all un arreglo
matemtico, \begin{array }...\ end{array}. Es importante insistir en que un array slo puede
estar en un ambiente matemtico. Las declaraciones de columnas y renglones las haces
exactamente igual que con tabular , excepto que el contenido es interpretado como frmulas.
La excepcin es cuando para describir la columna diste p{<num><mdda>}, pues en ese caso
automticamente esa columna quedar en modo texto.
Este mecanismo se utiliza tambin para imprimir matrices o, en general, tablas que en
su mayora van a contener frmulas matemticas.
\ [ \ begin { a r r a y } { l l c l }
a_ {11}& a_ { 1 2 } & \ l d o t s &a_ { 1m } \ \
a_ {21}& a_ { 2 2 } & \ l d o t s &\ l d o t s \ \
\ c d o t s &\ c d o t s &\ l d o t s &\ l d o t s \ \
a_ { n1}&a_ { n2 } & \ c d o t s
&a_ {nm}
\ end { a r r a y } \ ]

a11
a21

an1

a12
a22

an2

...
...
...

a1m
...
...
anm

Siempre que tienes una frmula que ocupa ms de un rengln, puedes ponerle algn carcter a la izquierda y otro a la derecha que crezcan tanto como la frmula en cuestin. Esto
lo haces marcando la frmula con \ left y \ right a su izquierda y derecha respectivamente,
y poniendo el smbolo que quieras. Por ejemplo, la matriz anterior podra quedar:

190

LATEX

\ [ \ l e f t [ \ begin { a r r a y } { l l c l }
a_ {11}& a_ { 1 2 } & \ l d o t s &a_ { 1m } \ \
a_ {21}& a_ { 2 2 } & \ l d o t s &\ l d o t s \ \
\ c d o t s &\ c d o t s &\ l d o t s &\ l d o t s \ \
a_ { n1}&a_ { n2 } & \ c d o t s&a_ {nm}
\ end { a r r a y } \ r i g h t ] \ ]

a11 a12 . . . a1m

a
21 a22 . . . . . .

... ...

an1 an2 anm

Si deseas omitir ya sea el smbolo de la izquierda o el de la derecha, pones un punto (.)


en lugar del carcter. No tienen porqu ser carcteres correspondientes al inicio y al nal.
En general, se usan aquellos que lo son, pero no es forzoso:
\ [ \ l e f t \ | \ begin { a r r a y } { l l c l }
a_ {11}& a_ { 1 2 } & \ l d o t s &a_ { 1m } \ \
a_ {21}& a_ { 2 2 } & \ l d o t s &\ l d o t s \ \
\ c d o t s &\ c d o t s &\ l d o t s &\ l d o t s \ \
a_ { n1}&a_ { n2 } & \ c d o t s&a_ {nm}
\ end { a r r a y } \ r i g h t \ } \ ]

0
0
0
0
0
0
0
0
0
0
0

a11 a12 . . . a1m

a
a
... ...
21

22

an1 an2

... ...

a
nm

Tambin puedes tener un array en el modo lnea,


$\begin{array }[ t ]{ l }a+b\\ab\end{array}$,

que queda a + b . Debes notar que usa tantos renglones como necesite, corrigiendo el
ab
siguiente rengln para que no se encime.
Las lneas entre columnas y entre los renglones se utilizan exactamente igual que en
el caso de las tablas no numricas ( tabular ). Tambin habrs notado que la descripcin de
las columnas se hace tambin de la misma manera que en un tabular . Tambin se pueden
redenir las columnas.
Actividad 6.38 Codica en LATEX la siguiente tabla:
(a + b)2 = a2 + 2ab + b2
Suma de cuadrados
Diferencia de cuadrados
a2 b2 = (a + b)(a b)
(a + b)n = an + 2an1 b + + bn Expansin binomial

Matrices y combinaciones
Si bien puedes armar matrices usando arrays, LATEX provee comandos especiales para
ello. Por ejemplo, es muy comn que quieras denir una funcin por casos como la que
sigue:

191

6.9 Emacs y LATEX

Prj


0
=
r!(1)(rj)/2

si r j es impar,
si r j es par.

\ [ P_ { rj }=
\ begin { cases }
0&\ t e x t { s i r j es impar } , \ \
r ! ( 1 ) ^ { ( rj ) / 2 }
&\ t e x t { s i r j es par } .
\ end { cases }
\]

Si esto lo hicieras con un array, lo hara como sigue:

3
Prj =

0
si r j es impar,
r!(1)(rj)/2 si r j es par.

\ [ P_ { rj } = \ l e f t \ {
\ begin { a r r a y } { l l }
0&\ t e x t { s i r j es impar } , \ \
r ! ( 1 ) ^ { ( rj ) / 2 }
&\ t e x t { s i r j es par } .
\ end { a r r a y }
\ right .
\]

que puedes corroborar en la parte izquierda que forma exactamente la misma ecuacin. Por
ello, el ambiente de casos es, simplemente, un atajo para codicar este tipo de tablas.
Otro atajo comn es el que se usa para matrices. LATEX dene varios ambientes especcos para matrices, dependiendo de los delimitadores que quieras tener:
\ [ \ begin { m a t r i x }
a&b \ \
c&d
\ end { m a t r i x } \ ]

a b
c d

\ [ \ begin { b m a t r i x }
i&j \ \
k& l
\ end { b m a t r i x } \ ]

\ [ \ begin { V m a t r i x }
q& r \ \
s& t
\ end { V m a t r i x } \ ]

0
0
0q r0
0
0
0s t 0

i j
k l

\ [ \ begin { p m a t r i x }
e& f \ \
g&h
\ end { p m a t r i x } \ ]
\ [ \ begin { v m a t r i x }
m&n \ \
o&p
\ end { v m a t r i x }

e f
g h



m n 


 o p

Como puedes ver, lo que te ahorras al usar estos ambientes es la especicacin de los
delimitadores y de las columnas de cada matriz.

Actividad 6.39 Codica cada una de las matrices anteriores usando array y delimitadores.

192

LATEX

Actividad 6.40 Codica la siguiente frmula:




6.9.1.

n!
r!(n r)!

Anotaciones en los smbolos


Es frecuente que quieras anotar a tus variables con distintos smbolos, que van desde
prima hasta vectores. Tambin pudieses hacerlo abajo de la variable o expresin. Veamos
algunos ejemplos:
\overset{\ rightarrow }{ a}
\underset{i =1}{\cup}

i=1

Como puedes notar, aun cuando estemos en modo de lnea, acomoda el texto que le
indiques donde le indiques. El primer parmetro LATEX lo escribe con un tamao menor y
lo coloca encima (over) o debajo (under) del segundo argumento. El segundo argumento
nicamente puede ser un smbolo. El primer argumento, como ya vimos, puede ser cualquier cosa. Para aquellos smbolos que son muy comunes, tenemos denidos comandos
que colocan determinado carcter. stos se encuentran en la tabla 6.17.
Tabla 6.17 Acentos en modo matemtico

\hat{a}
\check{a}
\breve{a}

a
`
a

\acute{a}
\grave{a}

3a

\bar{a}
\vec{a}

a
a

\dot{a}
\ddot{a}

\ tilde {a}

Muchas veces quieres poner una echa, raya, llave, encima de toda una expresin que
tiene ms de un smbolo. Para ello tenemos los siguientes smbolos que se extienden para
cubrir a ms de un smbolo:
\ [ \ o v e r l i n e { a+b+c } = \ u n d e r l i n e { a+b+c } \ ]

a+b+c=a+b+c
\ [ \ overbrace { a+b+c } = \ underbrace { a+b+c } \ ]

" 45 !
a+b+c=a
b + 4c
5 +!"
\ [ \ o v e r r i g h t a r r o w { a+b+c } = \ u n d e r r i g h t a r r o w { a+b+c } \ ]

a+b+c=a+b+c

193

6.9 Emacs y LATEX


\ [ \ o v e r l e f t a r r o w { a+b+c } = \ u n d e r l e f t a r r o w { a+b+c } \ ]

a+b+c=a+b+c

\ [ \ o v e r l e f t r i g h t a r r o w { a+b+c } = \ u n d e r l e f t r i g h t a r r o w { a+b+c } \ ]

a+b+c=a+b+c

Por supuesto que puedes anidar todos estos comandos y combinarlos de la manera que
desees.

Actividad 6.41 Codica en LATEX la siguiente expresin:

B
AB =


AB

6.9.2.

si A B
si B A
si A y B son ajenos
por la ley de De Morgan

Arreglos de frmulas
Seguramente ests pensando en escribir frmulas (o ecuaciones) en modo prrafo. Hasta ahora has utilizado para ello el ambiente displaymath. Sin embargo, si deseas numerar las
ecuaciones o algo por el estilo, debes usar el ambiente equation.
\ begin { e q u a t i o n } \ l a b e l { eq : dia3 1}
R= \ f r a c { 1 } {M} \ sum_ { k =1}^M R_k
\ end { e q u a t i o n }

R=

M
1 
Rk
M k=1

(6.1)

Nota que el nmero de la ecuacin aparece en el extremo derecho de la lnea donde se


encuentra la misma. Esto se puede cambiar, as como la forma de numeracin3 . El contador
de ecuaciones se va incrementando progresivamente dentro del captulo.
Si quieres colocar varias frmulas alineadas, un array tiene el problema de que no importa si est en modo lnea o prrafo, nos dar modo lnea para cada rengln del arreglo.

Consulta alguno de los manuales de LATEX que se mencionan en la bibliografa si as lo deseas.

194

LATEX
\ [ \ begin { a r r a y } [ t ] { l l }
x_1 = \ sum_ { k =1}^ n a_ky ^ k

x1 =

&\ t e x t { p r i m e r v a l o r } \ \ [ 1 0 p t ]

x2 =

x_2 = \ sum_ { k =1}^ n b_ky ^ k

n
k=1

ak y k primer valor

n

k=1 bk y

segundo valor

&\ t e x t { segundo v a l o r }
\ end { a r r a y }
\]

Si quieres varias lneas, pero cada una de ellas en modo prrafo, tienes que usar el
ambiente de arreglos de ecuaciones \eqnarray.
\ begin { eqnarray }
x_1 = \ sum_ { k =1}^ n a_ky ^ k

x1 =

n


ak y k

Primer valor

(6.2)

bk y k segundo valor

(6.3)

k=1

&\ t e x t { Primer v a l o r } \ \
x_2 = \ sum_ { k =1}^ n b_ky ^ k
&\ t e x t { segundo v a l o r }
\ end { eqnarray }

x2 =

n

k=1

Nota que el modo matemtico se introduce junto con el ambiente eqnarray, lo mismo que
sucede con equation. Si deseas eliminar el nmero de la(s) ecuacin(es) usa los ambientes
eqnarray y equation respectivamente:
\ begin { eqnarray }
x_1 = \ sum_ { k =1}^ n a_ky ^ k

x1 =

&\ t e x t { Primer v a l o r } \ \

\ end { eqnarray }

ak y k

Primer valor

k=1

x_2 = \ sum_ { k =1}^ n b_ky ^ k


&\ t e x t { segundo v a l o r }

n


x2 =

n


bk y k segundo valor

k=1

Las ecuaciones que aparecen dentro de ambientes sin numeracin no incrementan el


contador de ecuaciones.
Sucede a veces que no cabe una ecuacin en una sola lnea, por lo que tienes que
repartirla en varios renglones. Esto lo logras con el ambiente split dentro de un ambiente
equation. Este comando es muy til cuando, por ejemplo, quieres mostrar procesos por los
que pasa una expresin. Nota que de esta manera se asigna un nico nmero a la ecuacin,
en atencin a que es una sola.

195

6.9 Emacs y LATEX


\ begin { e q u a t i o n }
\ begin { s p l i t }
\ begin { b m a t r i x }
\ Theta_1 \ \
\ Theta_2
\ end { b m a t r i x }
&+\ f r a c { 1 } { \ s q r t { 2 } }
\ begin { b m a t r i x }
1&1\\
1&1
\ end { b m a t r i x }
\ begin { b m a t r i x }
\ alpha \ \
\ alpha
\ end { b m a t r i x } \ \ [ 1 0 p t ]
&\ begin { b m a t r i x }
\ s q r t { 2 } \ alpha \ \
0
\ end { b m a t r i x }
\ end { s p l i t }
\ end { e q u a t i o n }


 
 
1 1 1
1

+
2
1
1

2


2
0

(6.4)

Puedes conseguir un efecto similar, pero asignando un nmero a cada rengln, si usamos el arreglo de ecuaciones, como se muestra a continuacin del ambiente split , que
comentamos en la segunda versin. En los ambientes de matrices, ecuaciones y arreglos
te ahorras especicar nmero de columnas y tipo de columnas, ya que estos ambientes los
toman de los elementos que aparecen en las mismas.
\ begin { eqnarray }
% \ begin { s p l i t }
\ begin { b m a t r i x }
\ Theta_1 \ \
\ Theta_2
\ end { b m a t r i x }
&+\ f r a c { 1 } { \ s q r t { 2 } }
\ begin { b m a t r i x }
1&1\\
1&1
\ end { b m a t r i x }
\ begin { b m a t r i x }
\ alpha \ \
\ alpha
\ end { b m a t r i x } \ \ [ 1 0 p t ]
&\ begin { b m a t r i x }
\ s q r t { 2 } \ alpha \ \
0
\ end { b m a t r i x }
% \ end { s p l i t }
\ end { eqnarray }

 

 
1
1 1

+ 12
2
1 1


2
0

(6.5)


(6.6)

196

LATEX

Existen otros ambientes ms para matemticas. Si los quieres revisar, consulta alguno
de los libros de LATEX.

Espacios en frmulas matemticas


En el modo de matemticas es muchas veces necesario acomodar de manera especca
algunos smbolos, movindolos hacia la izquierda o hacia la derecha. En la tabla 6.18 vemos los distintos tipos de espacios que puedes tener. Estn divididos entre positivos (hacia
la derecha) y negativos (de retroceso).
Tabla 6.18 Comandos de espacio en modo matemtico

Espacio positivo
Abr

Completo

Ejemplo

\mspace{1mu}

xx

\,

\thinspace

x \, x

\:

\medspace

\;

\thickspace

x \; x

\enskip

x\enskip x

\quad

x\quad x

\qquad

x\qquad x

mu

x\medspace x

Normal
xx
xx
xx
xx
x x
x x
x
x

xx
xx
xx
xx
xx
xx

Espacio negativo
Abr
\!

Completo

Ejemplo

xx
\negmedspace x\negmedspace x xx
\negthickspace x\negthickspace x xx
\negthinspace

x \! x

Normal
xx
xx
xx

Es necesario aclarar que estos espacios se pueden utilizar tambin fuera del entorno
matemtico, en el modo de texto, excepto por \mspace{} que se usa nicamente en modo
matemtico.
Actividad 6.42 Codica en LATEX la siguiente ecuacin:
1
N

N 1

2
i=0 i
GT C = 


N 1 2 N1
i=0 i

(6.7)

197

6.10 Imgenes y guras

Actividad 6.43 Codica en LATEX la siguiente ecuacin:


sn
sn
sn
sn

<= sn1
<= sn1
= sn1
= sn1

= sn2
<= sn2
<= sn2
= sn2

M1
M2
M3
M4

= 0.4
= 0.9
= 1.5
= 2.0

(6.8)
(6.9)
(6.10)
(6.11)

Actividad 6.44 Codica en LATEX la siguiente ecuacin:


8
98
9
98
9
8
00 01 1 1
x01 x01
1 1 1
=
2 1 1 10 11 1 1
x10 x11
8
9
00 + 01 + 10 + 11 00 01 + 10 11
=
00 + 01 10 11 00 01 10 + 11
=

(6.12)

00 0,0 + 01 0,1 + 10 1,0 + 11 1,1

Marcos alrededor de expresiones


El comando \box{ ... } sirve para enmarcar una expresin. Veamos un ejemplo:
\ [ \ begin { p m a t r i x }
\ e n s k i p \ boxed { a}& b &c \ \
d &\ boxed { e}& f \ \
g&h &\ boxed { i } \ e n s k i p \
\ end { p m a t r i x }
\]

d
g

b
e
h

f
i

Con esto damos por terminada la parte correspondiente a frmulas matemticas. Por
supuesto que esto no agota el material relevante, pues por cuestiones de tiempo dejamos
fuera muchsimas caractersticas y posibilidades que tiene LATEX. Sin embargo, creemos
que con esta introduccin, podrs seguir adelante de manera independiente, de existir el
inters en ti.

6.10. Imgenes y guras


6.10.1.

Tablas, guras, etc.


Habrs notado a lo largo de este libro que aparecen guras o tablas que se van numerando. Ms an, la numeracin de las tablas, por ejemplo, es independiente de la de las

198

LATEX

grcas o, en general, guras que queramos incluir. Esto se hace mediante lo que LATEX
llama otantes. Les llama as porque le puedes indicar al compilador que las acomode no
forzosamente donde aparecen, sino en la primera pgina en la que no ocasionen que se deje
espacio en blanco innecesario. Por supuesto que tambin le puedes indicar que las coloque
exactamente donde aparecen, sin importar el armado de las pginas que las preceden, o
haciendo t el armado a pie.
Las otantes que vamos a revisar ac son nicamente dos:
Figuras ( gure )
Tablas ( table )
Ambas otantes tienen los mismos argumentos, que tienen que ver fundamentalmente
con dnde se desea que se les acomode; ambas proveen un espacio con la posibilidad de
ponerles un ttulo ( \caption)4 . Denen un ambiente donde los cambios de tipo de letra o
tamao sern efectivos nicamente dentro de ese ambiente. En general, el ambiente table
se usa para material que se presenta en forma de tabla o lista, mientras que el de gure se
usa para material grco. La sintaxis de estos ambientes es la siguiente:
Para tablas (o cuadros):
Para guras:
\ begin { f i g u r e } [ posicionador ]
Contenido
\ c a p t i o n { Ttulo de la gura }
\ end { f i g u r e }

\ begin { t a b l e } [ posicionador ]
Contenido
\ c a p t i o n { Ttulo de la tabla }
\ end { t a b l e }

Si el contenido de la gura o tabla va antes de \caption, entonces el ttulo aparecer


abajo de la gura. Si va despus, esto es que \caption sea el primer rengln despus de que
empieza la gura o tabla, el ttulo ir arriba. La posicin de la gura o tabla puede ser:
Tabla 6.19 Posiciones posibles para los otantes

letra

signicado

top: Lo coloca en la parte superior de la primera pgina disponible.

bottom: Lo coloca en la parte inferior de la primera pgina donde quepa.

page: Lo coloca en una pgina de otantes, la primera que pueda.

here: Lo coloca, si es que puede, en el punto donde aparece.

Here: Incondicionalmente donde aparece. Si es necesario, porque la gura no quepa en esa pgina, deja pgina en blanco y lo coloca en la
siguiente pgina.
Contina en la siguiente pgina

Tambin hay la posibilidad de marcarlas con una etiqueta para poder hacer referencias a ellas, pero dado
lo poco del tiempo no entraremos en eso en esta ocasin.

199

6.10 Imgenes y guras


Tabla 6.19 Posiciones posibles para los otantes

letra
!

Contina de la pgina anterior

signicado
Try harder: Intenta de manera ms rme acomodar la gura o tabla donde se especica con los posicionadores que siguen a ! .

Para acomodar una gura o tabla procedes a dar tus preferencias, que son combinaciones de las primeras tres letras. LATEX tratar de acomodar la gura, colocndola en la misma
pgina o posponindola, procurando dejar poco espacio en blanco. Si no se especica, el
valor por omisin es tbp. LATEX podra no acomodar las guras como le indicas porque tiene
parmetros que le indican, por ejemplo, cuntas guras pueden ir en una misma pgina o
qu porcentaje del total de la pgina pueden ocupar. No entraremos en estos detalles por
falta de tiempo. En la mayora de los casos, y sobre todo en un principio, puedes trabajar
con los valores por omisin, excepto posiblemente para el posicionamiento. Te recomendamos, en general, poner H y si no se forma bonito, proceder a acomodar la gura o tabla
a pie. Veamos algunos ejemplos sencillos, con el cdigo de LATEX que los produce.

Tabla 6.20 Conversin de grados Farenheit a Centgrados

Fahr
32
40
80

Cent
0
4.5
27

\ begin { t a b l e } [ ! h ]
\ c a p t i o n { Conversin de F a r e n h e i t
a Centgrados }
\ begin { t a b u l a r } [ t ] { | r | r | }
\ hline
\ b f Fahr & \ b f Cent \ \ \ h l i n e
32 & 0 \ \
40 & 4 . 5 \ \
80 & 2 7 \ \ \ h l i n e
\ end { t a b u l a r }
\ end { t a b l e }

Puedes cambiar varios aspectos de esta tabla. Si, como ya dijimos, quieres que la acomode en la parte superior de una pgina, conseguiras que coloque primero el texto que
dimos como cdigo y despus la tabla misma. Sin embargo, es poco recomendable dar
una nica posicin como opcin, porque entonces si LATEX no puede acomodar a la tabla
o gura en la siguiente pgina, lo ms seguro es que ya no la coloque en ningn lugar
y la perdamos. Observa cmo la tabla 6.21 que ests colocando inmediatamente despus
de estas lneas, queda acomodada de manera aparentemente arbitraria (est acomodada
utilizando slo la mitad del ancho de la pgina).

200
Tabla 6.21

LATEX
Conversin de Farenheit a Centgrados

Fahr
32
40
80

Cent
0
4.5
27

La tabla 6.21 fue generada con el siguiente


encabezado: \begin{table }[ H]. Las lneas
\ begin { c e n t e r }
...
\ end { c e n t e r }

se pueden usar para centrar cualquier prrafo,


lnea, gura o tabla.
Cuando dejas que LATEX acomode a la tabla o gura donde mejor pueda en ausencia
de H deber haber un rengln en blanco antes y despus de la tabla, para evitar que se
encimen o mezclen renglones que pusimos en prrafos separados.
En una otante de tabla puede colocar uno o ms array, cuidando nada ms de declarar
un ambiente matemtico adentro.
Actividad 6.45 Codica en LATEX la tabla 6.22 en la siguiente pgina. Pon el posicionamiento para que aparezca exactamente donde se tecle.
Tabla 6.22 Representaciones numricas

Decimal
1
2
3
5
7
8
15
16

Binario
1
10
11
101
111
1000
1111
10000

Octal
1
2
3
5
7
10
17
20

Hexadecimal
1
2
3
5
7
8
F
10

Todo lo que dijimos de las tablas se aplica a las guras. El contador de tablas es independiente del de guras. LATEX provee un mecanismo sencillo para incluir imgenes o
guras generadas desde fuera y que estn codicadas en postscript o imgenes .png. Esto se hace con el comando \includegraphics {...} que toma como argumento un archivo en
el que se encuentre la imagen o gura que se desea incluir. En el archivo dummy.ps se
encuentra una gura (hecha en xg ) que deseamos incorporar en nuestro documento. Para
hacerlo, tenemos que incluir el uso del paquete graphics en el prembulo del documento:

6.10 Imgenes y guras

201

\usepackage{graphics}. Este paquete cuenta con los mecanismos para poder manipular la -

gura:
Figura 6.1 Grco introducido con includegraphics

que fue incluida con el siguiente cdigo:


\ begin { f i g u r e } [ H ]
\ label { fig :1}
\ c a p t i o n { Gr f i c o i n t r o d u c i d o con \ t e x t t t { i n c l u d e g r a p h i c s } }
\ i n c l u d e g r a p h i c s [ w i d t h = . . 5 \ t e x t w i d t h ] { l a t e x / dummy}
\ end { f i g u r e }

El paquete graphics contiene adems comandos que permiten girar y escalar una imagen,
prrafo, tabla, smbolo, etc. Tienes dos maneras de escalar un objeto: de manera relativa,
diciendo el factor de escala, como se muestra en la gura 6.3a ( \scalebox{.25}); o indicando
la proporcin en la escala horizontal entre llaves y con la escala vertical entre corchetes:
\scalebox{.2}[.3], como en 6.3b ( \scalebox {.25}[.5] ). Tambin puedes dar medidas
absolutas, como en la gura 6.3c ( \resizebox{8cm}{2cm}) o bien, utilizar una escala relativa,
donde omitimos el factor vertical, y se asumir el mismo que el horizontal, por ejemplo 6.3d
( \resizebox{2cm}{!}). En la escala absoluta se deben dar las dos medidas. Cualquiera de ellas
puede ser sustituida por ! .

202
Figura 6.2

LATEX
Escalando objetos con graphics.

(a) Misma horizontal y vertical

(c) Escala absoluta

(b) Distinta horizontal que


vertical

(d) Escala relativa

Otras dos posibilidades que tienes con objetos es la de rotarlos o espejearlos. En la gura 6.3 puedes ver rotaciones de 45 grados 6.4a ( \rotatebox{45}), de 180 6.4b ( \rotatebox{180})
y una gura y su reejo 6.4c ( \ reectbox ). En cada una de ellas se marca la lnea base como
una lnea punteada, ya que algunas de las guras (como la rotada) fueron subidas para
que no quedara desproporcionada la gura.
Se puede observar tambin que estas guras pueden aparecer mezcladas con el texto,

sin necesidad de incluir en una gura o tabla, donde lo nico que se hizo
como aqu
fue insertar \ reectbox {\ scalebox {.1}{\ includegraphics{dummy.ps}}} entre las palabras aqu
y sin.
Es importante insistir en que estas operaciones de escalar, rotar y reejar las puedes
aplicar a cualquier objeto: texto, frmulas matemticas (siempre y cuando estn en modo
matemtico .. o \(.. \) ), tablas completas, guras, etc.

203

6.10 Imgenes y guras

Figura 6.3 Rotaciones y reejos con graphics


(a) Rotacin de 45

(b) Rotacin de 180

(c) Figura y su reejo

Si por ejemplo quieres el reejo de algo pero a lo largo del eje horizontal, lo puedes
conseguir con el cdigo que sigue
\ scalebox { 2 } { r e f l e j o h o r i z o n t a l \ r o t a t e b o x {180}{ %
\ reflectbox { reflejo horizontal } } }

y que produce

reejo horizontalreejo horizontal


Debes notar que lo que pasa al texto abajo de la lnea base es la rotada, ya que toma
la esquina inferior izquierda como punto de rotacin.
Actividad 6.46 Codica en LATEX lo siguiente:

204

q0
q1

q0
q0

q1
q1

q1
q1

0
q0

q0
q1

q0

Entrada
Edo 0
1

E
nt
ra
d
1 a

Comparacin de tamaos

E
do

Tabla 6.23

LATEX

Actividad 6.47 Codica en LATEX la siguiente expresin:

= b2 4ac = b2 4ac

Actividad 6.48 Importa a un archivo de LATEX que use el paquete graphics alguna de las
grcas que elaboraste con xg (la del rbol genealgico, por ejemplo). La debes tener
guardada en tu cuenta, por lo que si no la exportaste, abre otra ventana y ejecuta xg para
exportarla en postscript.

6.10.2.

Cortando guras
Puedes mostrar nicamente parte de una gura utilizando el modo \includegraphics del
comando (agregando un asterisco al nombre del comando) y dndole parmetros opcionales
entre corchetes. La primera pareja le indica la posicin de la esquina inferior izquierda y la
segunda pareja la posicin de la esquina superior derecha. Puedes observar el resultado en
la gura 6.4.

Figura 6.4

Tomando pedazos de guras


i n c l u d e g r a p h i c s [100 pt ,130 p t ] [ 2 2 0 pt ,260 p t ] \ { dummy . ps \ }

205

6.10 Imgenes y guras

En la gura 6.4 colocamos un marco alrededor del recorte para hacerlo ms claro.
Ese marco no aparece como resultado del comando.

6.10.3.

Colores
En el contexto de generar archivos pdf, utilizaremos para colorear dos paquetes, color y
tikz. Aunque el primero es claro su objetivo, el segundo, tikz, es un paquete de LATEX mucho
muy poderoso para gracacin y que incluye un sistema de colores adems compila tanto
con pdatex como con latex . Est incluido dentro del paquete pgf aunque aporta una
interfaz ms sencilla que la que soporta pgf. Es tan grande y poderoso que est dividido en
varios paquetes para que elijas nicamente aquellos que va a usar. En la tabla 6.24 damos
una lista de los que vamos a requerir, por lo pronto, para generar colores. Cabe aclarar
que para utilizar tikz es necesario cargar tambin algunos paquetes que nos sirven como
soporte, que listamos tambin a continuacin5 .

Tabla 6.24 Paquetes de pgf para colores y dibujos

Nombre

Uso

tikz

ste es el paquete ms importante de pgf, ya


que da una interfaz sencilla de usar para gracar. Incluye tambin un sistema para colores
que permite combinar los colores principales.
\usepackage{xkeyval} Permite asociar nombres de parmetros del
paquete con los valores correspondientes. Se
requiere tambin para otros paquetes.
usepackage{pifont}
Se encarga del manejo de bajo nivel para las
grcas. Lo requiere el paquete tikz.
\usepackage{color}
Proporciona una interfaz para poder crear
nuevos colores y un sistema para hacerlo.

xkeyval

pifont
color

Descripcin

\usepackage{tikz}

Veamos entonces algunas manipulaciones que involucran color 6 . Por ejemplo, si quieres cambiar el color de lo que estamos haciendo tenemos el comando
\ c o l o r { red }

y desde ese momento en adelante, en el rango del ambiente en el que est, todo se
escribir en rojo. Los colores bsicos con los que contamos se encuentran en la tabla 6.25.
.
5

Todos estos paquetes pueden obtenerse gratuitamente de la direccin


http://www.tex.ac.uk/tex-archive/help/Catalogue/catalogue.html
que es una excelente fuente de paquetes junto con su documentacin
6
Si tienes una impresora en blanco y negro, esto aparecer en distintos tonos de grises, pero en la pantalla
lo vers tal cual

206
Tabla 6.25

LATEX
Colores bsicos con los que se cuenta

Cdigo

Resultado

\ color {black}black

black
white
red
yellow
cyan
blue
green
magenta

\colorbox{gray }{\ color {white}white}


\ color {red}red
\ color {yellow}yellow
\ color {cyan}cyan
\ color {blue}blue
\ color {green}green
\ color {magenta}magenta

y adems tenemos los siguientes tonos de grises predenidos:


\ color {black}black
\ color {darkgray}darkgray
\ color {gray}gray
\ color { lightgray } lightgray
\ color {white}white

black
darkgray
gray
lightgray
white

Como colocamos todo en un tabular , el efecto del cambio de color es nicamente dentro
de la celda en que est escrito.
Tenemos la posibilidad de cambiar nicamente el texto deseado con el siguiente cdigo:
Vamos cambiar de \ t e x t c o l o r { red } { r o j o }
a c o l o r \ t e x t c o l o r { cyan } { a z u l }

Vamos cambiar de rojo a


color azul

El paquete color tambin nos ofrece la posibilidad de conformar cajas con el fondo de
ciertos colores para realzar algunos textos:
\ c o l o r b o x { red } { \ t e x t c o l o r { b l u e }{ %
Esta es una prueba } }

Esta es una prueba

Actividad 6.49 Teclea en un archivo fuente de LATEX donde uses el paquete color y graphics,
las lneas correspondientes a color y ve en la pantalla cmo quedan (desafortunadamente
la impresin no muestra el color, sino nicamente distintos niveles de grises, pero en la
pantalla s lo puedes apreciar).

207

6.10 Imgenes y guras

6.10.4.

Dibujando objetos geomtricos


Hay varios paquetes que te permiten dibujar objetos geomtricos como lneas, crculos,
arcos, etc. Utilizaremos ac TikZ el subpaquete shapes y arrows , que nos ofrece una gran
versatilidad. No veremos ac ms que algunos objetos, ya que este paquete es sumamente
extenso.
Para poder usar comandos de tikz tenemos que estar dentro de un ambiente de este
paquete. tikz tiene dos tipos de ambiente, el de lnea y el de prrafo:
\ t ikz<[modicadores]>{<comandos>}
\ begin { t i k z p i c t u r e } <[modicadores]>
...
\ end { t i k z p i c t u r e }

Ambiente de lnea.
Ambiente de prrafo.

Los modicadores van entre corchetes y tienen que ver con aspectos generales de las
guras que deseamos construir. Ambos ambientes presuponen un tamao, ya sea de lneas
o de prrafo, dado en la unidad de medida que se especique. La unidad de medida por
omisin es en centmetros, pero se puede cambiar. Prcticamente todo lo que deseemos
dibujar va a tener implcitas coordenadas y longitudes, que estarn dadas implcitamente
en la unidad de medida.
Para denotar a estas unidades de medida, tikz utiliza vectores en el eje de las x, de las
ys y de las zs. Es conveniente asegurarnos con qu unidad de medida estamos trabajando.
La puedes denir en milmetros, pulgadas, centmetros o puntos. Preferimos trabajar con
puntos, ya que sta es una unidad que se usa en muchos otros lugares. Para establecer al
punto como unidad de medida en los comandos de tikz utilizamos el siguiente modicador:
\ t i k z [ x=1 pt , y=1 pt , z=1 p t ] { . . . }
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 pt , z=1 p t ]
...
\ end { t i k z p i c t u r e }

y a partir de ese momento y dentro del ambiente declarado, la unidad de medida ser 1
punto (1pt). Si se declara otro ambiente en otro lugar, habr que hacer lo mismo, o bien
trabajar en centmetros.

6.10.5.

Lneas
El comando que permite dibujar lneas es \draw y hay que darle como argumentos las
coordenadas de los puntos por los que quieres que pase. El formato ms simple del comando es el siguiente:

208

LATEX
\ draw ( <coord inicial> ) ( <siguiente coordenada> ) . . . ;

donde los puntos sucesivos indican que puedes poner tantas coordenadas como desees. Las
coordenadas se pueden dar como puntos relativos con la unidad de longitud del ambiente;
o bien puede ser algn objeto etiquetado7 ; tambin puede aparecer all una coordenada con
una unidad de medida especca. Si se trata de coordenadas, consiste de una pareja con
los elementos separados entre s por coma, donde el primer elemento de la pareja es el
desplazamiento sobre el eje x y el segundo sobre el eje y. Tambin es importante notar que
los comandos de tikz en su mayora terminan con punto y coma (;).
Es importante mencionar que el texto seguir inmediatamente despus del punto que el
comando considere que requiere. Veamos algunos ejemplos:
\ tikz [x=1pt,y=1pt]\draw(0,0) (20,30) (30,0)
. Nota cmo el rengln se acomoda
verticalmente para dar lugar al trazo y el texto contina a partir del nal del espacio ocupado. Si deseamos que el texto se acomode encima del dibujo, tenemos que hacerlo a pie
recorrindonos hacia arriba y hacia la izquierda con comandos de \vspace y \hspace.
\ vspace {30 p t } % E l mximo de l a segunda coordenada y e l cambio
% de l nea .
\ t i k z [ x=1 pt , y=1 p t ] { \ draw (0 ,0) (20 ,30) (30 ,0);}
\ hspace{30 p t} %
\ t i k z [ x=1 pt , y=1 p t ] { \ draw (0 ,0) (20 ,30) (30 ,0);} %
y l a s l neas se acomoda como se e s t observando

y las lneas se acomodan como se est observando.


Veamos ms ejemplos de algunas guras. Una manera de dejar espacio vertical para
acomodar algunas de las guras es con \vspace. Observa:
\ t i k z [ x=1 pt , y=1 p t ] { \ draw ( 0 , 0 ) ( 3 0 , 5 ) ( 2 0 , 1 0 ) (60 ,15) %
( 7 0 , 5 0 ) ( 5 0 , 1 0 0 ) ( 1 2 0 , 1 0 0 ) ; }
\ t i k z [ x=1 pt , y=1 p t ] { \ draw ( 1 4 0 , 4 0 ) ( 1 9 0 , 4 0 ) ( 1 9 0 , 8 0 )
( 1 4 0 , 8 0 ) ( 1 4 0 , 4 0 ) ; }

Puedes cambiar el ancho de la lnea tambin con un modicador, line width y el tamao de la
lnea se puede dar en cualquier unidad de medida:
7

Veremos ms adelante cmo etiquetar objetos para usarlos en un dibujo.

6.10 Imgenes y guras

209

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ draw [ l i n e w i d t h =2 p t ] ( 0 , 0 ) ( 3 0 , 2 0 ) ;
\ draw [ l i n e w i d t h =.13 i n ] (30 ,20) ( 5 0 , 0 ) ;
\ draw [ l i n e w i d t h =.15cm ] (50 ,0) ( 7 0 , 2 0 ) ;
\ draw (70 ,20) ( 9 0 , 0 ) ;
\ draw [ l i n e w i d t h =1 p t ] (90 ,0) ( 1 1 0 , 2 0 ) ;
\ end { t i k z p i c t u r e }

Tambin se puede dar el ancho de lnea para todo un ambiente, ponindolo de modicador de
ambiente:

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 pt , %


l i n e w i d t h =2 p t ]
\ draw ( 0 , 0 ) ( 3 0 , 2 0 ) (30 ,20) %
( 5 0 , 0 ) (50 ,0) (70 ,20) %
(70 ,20) ( 9 0 , 0 ) (90 ,0) %
( 1 1 0 , 2 0 ) ;
\ end { t i k z p i c t u r e }

El comando \draw es fundamental en tikz ya que servir tambin para acomodar objetos y
dibujar guras. Por ejemplo, para dibujar un rectngulo combinamos \draw con esa forma:

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ draw ( 0 , 0 ) r e c t a n g l e ( 1 4 0 , 1 2 0 ) ;
\ end { t i k z p i c t u r e }

Siempre que introduces un ambiente tikz, debes pensar que reservas un espacio rectangular dado
por lo que dibujaste. Ese espacio logra contener todos los objetos que hayas acomodado o dibujado
en ese ambiente. El (0,0) es la esquina inferior izquierda (aunque esto lo puedes modicar) y la
esquina superior derecha est dada por lo que hayas hecho dentro del ambiente.

Actividad 6.50 Escribe el cdigo necesario para que se dibuje lo que sigue (el tamao relativo es
lo que importa).

210

LATEX

Como ya mencionamos, tikz provee varias guras geomtricas con las que puedes trabajar usando la biblioteca shapes de este paquete. Y como las guras son cierto tipo de objetos, puedes
acomodarlos tambin en la retcula mediante draw. Adems del rectngulo, contamos con crculos
(circle), diamantes (diamond) y elipses (ellipse). El formato para cada una de estas guras es el
siguiente: una vez que se ubica el punto donde se va a colocar la gura mediante draw, cada una
de las guras tiene sus propios parmetros. Quisiramos antes mencionar un modicador ms que
altera la forma de los puntos de quiebre para redondearlos y que es rounded corners. Observa el
efecto que tiene en el rectngulo que hicimos arriba:

\ begin { t i k z p i c t u r e } %[x=1 pt , y=1 p t ]


\ draw [ x=1 pt , y=1 pt , rounded c o r n e r s ]
(0 ,0) rectangle (140 ,120);
\ end { t i k z p i c t u r e }

Puedes jugar con qu tan redondeadas estn las esquinas, agregndole el redondeo en trminos
de una unidad de medida a continuacin del signo =. La medida se reere a la distancia de lo que
sera la esquina sin redondear a la redondeada, medido verticalmente.

rounded
corners

rounded corners rounded corners rounded corners


=4pt
=8pt
=16pt

que se consigui con el siguiente cdigo:

6.10 Imgenes y guras

211

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ draw [ rounded c o r n e r s ] ( 0 , 6 0 ) r e c t a n g l e ( 4 0 , 1 2 0 ) ;
\ draw [ rounded c o r n e r s =4 p t ] ( 8 0 , 6 0 ) r e c t a n g l e ( 1 2 0 , 1 2 0 ) ;
\ draw [ rounded c o r n e r s =8 p t ] ( 1 6 0 , 6 0 ) r e c t a n g l e ( 2 0 0 , 1 2 0 ) ;
\ draw [ rounded c o r n e r s =16 p t ] ( 2 4 0 , 6 0 ) r e c t a n g l e ( 2 8 0 , 1 2 0 ) ;
\ end { t i k z p i c t u r e }

Otros de los modicadores que puedes poner a \draw son el color de las mismas blue, red,
yellow, cyan, green, magenta ; el tipo de lnea [ loosely |densely]{solid |dotted|dashed} . Estos
ltimos parmetros no llevan signo = o identicador cuando aparecen en el contexto de un comando
\draw y puedes usarlos con guras, lneas o arcos. Hay que mencionar tambin que el redondeo de
esquinas puede aplicarse nicamente a un segmento de la trayectoria pintada, si se coloca antes de
las coordenadas a partir de la cual debe aparecer. Veamos un pequeo ejemplo:

\ begin { t i k z p i c t u r e } [ x=1 pt , y =1.5 p t ]


\ draw ( 0 , 0 ) [ blue , rounded c o r n e r s =10 p t ]
( 3 0 , 5 0 ) ( 8 0 , 2 5 )
[ sharp c o r n e r s ] ( 7 5 , 75)
( 0 , 0 ) ;
\ end { t i k z p i c t u r e }

Como es muy comn querer terminar en la coordenada en la que se empez (cerrar un polgono),
tikz proporciona la meta-coordenada cycle que, donde aparezca, regresa la primer punto dado en la
trayectoria, como por ejemplo en el siguiente dibujo, en que ambas veces regresa la coordenada
(0,0) .

\ begin { t i k z p i c t u r e } [ x=1 pt , y =1.5 p t ]


\ draw ( 0 , 0 ) [ blue , rounded c o r n e r s =10 p t ]
( 3 0 , 5 0 ) ( 8 0 , 2 5 )
[ sharp c o r n e r s ] ( 7 5 , 75)
c y c l e ( 2 7 , 1 2 ) ( 3 5 , 8 0 ) c y c l e ;
\ end { t i k z p i c t u r e }

En la tabla 6.26, <dim> se reere siempre a una cantidad de medida, como mm, cm, in, pt,
em, ex, mientras que <num> es un nmero que puede o no ser un entero, y en algunos casos puede
ser negativo. Estos modicadores pueden aparecer en el ambiente o en el comando.

212
Tabla 6.26

LATEX
Modicadores para el trazo de lneas y guras
Parmetro

Descripcin

Por omisin

color=<color>

Especica el color en que se va a pintar


la lnea. Puede aparecer directamente el
color nada ms.

color: black

Unidades para cada uno de los ejes.


Son opcionales cualquier subconjunto
de ellos.

dim: 1cm

Especica el grosor de las lneas que se


dibujan (ver tabla 6.27.

dim: 1pt

pattern= patrn

Rellena la gura o el polgono con ese


patrn8 .

estilo: solid

pattern color=<color>

Decide el color de los trazos que componen al patrn.

black

Indica si los cambios de direccin se hacen redondeados o no, y si s con cunto


redondeo.

sharp corners

Indica que la gura deber ser slida,


rellenada. Si se indica el color, el relleno deber ser de ese < color > ver
gura 6.5 donde se ejemplica esta opcin .

no

Da el tipo o estilo de lineas que se van a


dibujar (ver tabla 6.27).

solid

x=<dim>
y=<dim>
z=<dim>
line width=<dim>
very thick
thick
very thin
thin

rounded corners
rounded corners= dim
sharp corners
ll
ll = < color >

dashed
loosely dashed
densely dashed
dotted
loosely dotted
densely dotted
solid

Para ver los tipos de patrones disponibles, consultar el manual de TikZ.

213

6.10 Imgenes y guras


Tabla 6.27 Opciones de grosor y estilos de lneas

very thin

loosely dotted

dotted

densely dotted

thin

loosely dotted

dotted

densely dotted

normal

loosely dotted

dotted

densely dotted

thick

loosely dotted

dotted

densely dotted

very thick

loosely dotted

dotted

densely dotted

very thin

loosely dashed

dashed

densely dashed

thin

loosely dashed

dashed

densely dashed

normal

loosely dashed

dashed

densely dashed

thick

loosely dashed

dashed

densely dashed

very thick

loosely dashed

dashed

densely dashed

Figura 6.5 Ejemplo de opciones para dibujar


\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ draw [ f i l l ] ( 0 , 0 ) [ blue , rounded c o r n e r s =10 p t ]
( 3 0 , 5 0 ) ( 8 0 , 2 5 ) [ sharp c o r n e r s ]
( 7 5 , 75) c y c l e ( 2 7 , 1 2 )
( 3 5 , 8 0 ) c y c l e ;
\ end { t i k z p i c t u r e }

Pasemos ya a ver las distintas guras que puedes dibujar con el comando \draw. Las mostramos
en la tabla 6.28.

214

LATEX

Tabla 6.28 Ejemplos de guras en TikZ


Comando

Figura

\ tikz [x=1pt,y=1pt]{\draw(25,10) ellipse (20pt and 10pt);}

Como puedes observar, la coordenada dada a continuacin de \draw da el centro


de la elipse, mientras que la primera dimensin da el dimetro horizontal y la
segunda el vertical.
\ tikz [x=1pt,y=1pt]{\draw (25,10) circle (12.5pt );}

En este caso, tambin la primera coordenada nos da el centro del crculo, mientras que la dimensin nos da el dimetro.
\ tikz [x=1pt,y=1pt]{\draw (25,10) arc (90:0:25pt );}

Igual que antes, la primera coordenada te da el centro del crculo completo,


aunque nicamente vayas a pintar un arco. Los tres nmeros entre parntesis
tienen el siguiente signicado: puedes ver al circulo en el eje coordenado con
el centro en (0,0); el primer numero da el ngulo en el que empieza el arco; el
segundo da el ngulo en el que termina, movindose siempre en el sentido de
las manecillas del reloj; el tercer numero da el radio del crculo del que el arco
forma parte.
\ tikz [x=1pt,y=1pt]{\draw (5,0) .. controls (15,15) and (30,15) .. (40,0);}

Esta construccin te permite dibujar curvas que no son forzosamente arcos de


crculos. Las coordenadas de control representan puntos para dibujar el bezier:
entre el origen y el primer punto la recta que los une es tangente a la curva;
similarmente para el segundo punto.
Adems de las variaciones en la forma y el tipo de lnea, tambin puedes pedir que la lnea sea
doble, como lo ejemplicamos en la tabla 6.29.
Tabla 6.29 Lneas dobles
\draw[very thick ,double](0,0) (50,0);
\draw[thin,double](0,0) (50,0);
\draw[very thick ,double distance=2pt](0,0) (50,0);
\draw[thin,double distance=2pt](0,0) (50,0);

Realmente el nmero de variaciones sobre estos cuatro simples comandos es muy grande, as
que te recomendamos consultar el manual de TikZ para poder usar todas ellas.

215

6.10 Imgenes y guras

En el caso de las lneas y los polgonos, puedes tener el ltimo segmento tome o no la forma
de echa. Los tipos de echas que tenemos disponibles se encuentran en las tablas 6.30 y se consiguen poniendo como modicador de la lnea el tipo de echa que deseas. Vienen en el paquete de
biblioteca de echas de TikZ que se invoca con la siguiente lnea en el prembulo del documento.
\ u s e t i k z l i b r a r y { arrows }

Algunas puntas de echas vienen por omisin en TikZ. Los estilos del cuerpo de la echa
pueden ser cualesquiera de los listados anteriormente, por lo que los ejemplos los daremos con lnea
slida para ejemplicar nada ms las puntas. Los distintos tipos de puntas de echas se encuentran
en la tabla 6.30.
Tabla 6.30

Tipos de puntas de echas en TikZ


\draw [arrows=>] (0,0) (50,0);
\draw [arrows=>>] (0,0) (50,0);
\draw [arrows=|>] (0,0) (50,0);
\draw [arrows=|diamond] (0,0) (50,0);
\draw [arrows=latex] (0,0) (50,0);
\draw [arrows=angle 45] (0,0) (50,0);
\draw [arrows=angle 60] (0,0) (50,0);
\draw [arrows=angle 90] (0,0) (50,0);

Como puedes observar hay bastante juego con el tipo de echa y el origen del segmento. Para
ms informacin, consulta el manual de TikZ.
Otro aspecto bonito de TikZ es que puedes dar distintos patrones para el relleno de guras. Esto
se logra cargando el paquete de biblioteca patterns en el prembulo del documento.
\ u s e t i k z l i b r a r y { patterns }

En el manual de TikZ viene una lista de patrones interesantes que puedes desear usar.
En las tablas 6.31 y 6.32 daremos ejemplos de distintos objetos geomtricos que puedes pintar
con TikZ. Es importante que recuerdes que las coordenadas que se dan suponen que el comando
inicia en (0,0), y a partir de ah se calcula la posicin del dibujo. Sin embargo, el acomodo de las
guras se hizo con mecanismos que se darn a continuacin. Asimismo se hicieron algunos trucos
para que la altura del rengln fuera la adecuada para cada gura. Debers tomar en cuenta la seccin
que sigue donde ensearemos a acomodar de mejor manera las guras.

216
Tabla 6.31

LATEX
Figuras geomtricas que se pueden lograr en TikZ

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 pt , l i n e w i d t h =3 p t] %


\ useasboundingbox ( 0 , 0 ) r e c t a n g l e
(140 ,60);
\ draw[ l a t e x , rounded c o r n e r s] %
(100 ,50) (0 ,20) ( 5 0 , 0 ) ;
\ end { t i k z p i c t u r e }

\ begin { t i k z p i c t u r e } [ x=1 pt , y=3 p t ]


\ useasboundingbox ( 0 , 0 )
rectangle (170 ,70);
\ draw [ t h i c k ] ( 0 , 6 0 ) ( 7 0 , 1 0 )
(70 ,60) (0 ,10)
cycle ;
\ draw [ t h i c k , f i l l =red ] ( 9 0 , 6 0 )
(160 ,10) (160 ,60)
(90 ,10) cycle ;
\ end { t i k z p i c t u r e }

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox ( 0 , 0 ) r e c t a n g l e ( 1 7 0 , 7 0 ) ;
\ draw [ f i l l ] ( 1 0 , 1 0 ) r e c t a n g l e ( 8 0 , 6 0 ) ;
\ draw [ f i l l = w h i t e ] ( 2 0 , 2 0 ) r e c t a n g l e ( 4 0 , 4 0 ) ;
\ end { t i k z p i c t u r e }

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 10) r e c t a n g l e ( 1 4 0 , 6 0 ) ;
\ draw [ v e r y t h i c k ] ( 3 0 , 3 0 ) c i r c l e (20 p t ) ;
\ draw [ v e r y t h i c k , red ] ( 1 0 0 , 3 0 ) c i r c l e (20 p t ) ;
\ end { t i k z p i c t u r e }
Contina en la pgina siguiente

6.10 Imgenes y guras


Tabla 6.31 Figuras geomtricas que se pueden lograr en TikZ

217
Contina de la pgina anterior

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox ( 0 , 0 )
rectangle (140 ,70);
\ draw [ v e r y t h i c k ] ( 2 0 , 3 8 ) ( 1 0 , 0 )
(50 ,0) arc (0:76:40 pt ) ;
\ draw [ f i l l ] ( 1 0 0 , 3 8 ) ( 9 0 , 0 )
(130 ,0) arc (0:76:40 pt ) ;
\ end { t i k z p i c t u r e }
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 0 , 0 )
rectangle (140 ,70);
\ draw [ v e r y t h i c k , red ] ( 7 0 , 3 0 )
e l l i p s e (50 p t and 20 p t ) ;
\ end { t i k z p i c t u r e }

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox ( 0 , 0 )
rectangle (140 ,70);
\ draw [ v e r y t h i c k , s t e p =5mm, red ,
pattern= f i v e p o i n t stars ,
p a t t e r n c o l o r =red ] \
( 7 0 , 3 0 ) e l l i p s e (50 p t and 20 p t ) ;
\ end { t i k z p i c t u r e }

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 50)
rectangle (170 ,100);
\ draw ( 8 0 , 6 0 ) a r c ( 5 0 : 9 0 : 1 0 0 p t ) ;
\ draw [ f i l l ] ( 1 6 0 , 6 0 )
arc (50:90:100 pt ) ;
\ draw [ v e r y t h i n , l o o s e l y dashed ]
( 1 6 0 , 6 0 ) (95 , 50)
(140 , 50) (95 , 50)
( 9 5 , 8 3 ) ;
\ end { t i k z p i c t u r e }

Otro aspecto que es frecuente que quieras tener en un documento es la gracacin de funciones.
TikZ proporciona algunas funciones tpicas que puedes querer gracar, como lo son la parbola, el
crculo, seno y coseno. Para otras funciones se tendrn que preparar las tablas en un archivo aparte,

218

LATEX
pero se pueden gracar. Veamos primero estas cuatro en la tabla 6.32.

Tabla 6.32

Gracacin de funciones comunes en TikZ


\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 0 , 0 )
rectangle (140 ,70);
\ draw [ t h i c k ] ( 4 5 , 5 0 )
arc (60:360:20 pt ) ;
\ draw [ t h i c k , f i l l ] ( 1 1 5 , 5 0 )
arc (60:360:20 pt ) ;
\ end { t i k z p i c t u r e }
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 0 , 0 )
rectangle (100 ,50);
\ draw ( 0 , 0 )
p a r a b o l a [ p a r a b o l a h e i g h t =30 p t ]
(30 ,0);
\ draw ( 5 0 , 3 0 )
p a r a b o l a [ p a r a b o l a h e i g h t =30 p t ]
(90 ,30);
\ end { t i k z p i c t u r e }

Puedes obtener pedazos de parbola si das como segunda coordenada algo que no sea la
imagen del punto de origen, o bien con modicadores:
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 0 , 0 )
rectangle (140 ,60);
\ draw ( 0 , 0 ) p a r a b o l a ( 3 0 , 4 5 ) ;
\ draw ( 5 0 , 0 )
p a r a b o l a [ bend a t end ]
(80 ,45);
\ draw ( 1 0 0 , 0 )
p a r a b o l a bend
(122.5 ,52.25) (130 ,45);
\ end { t i k z p i c t u r e }
Contina en la siguiente pgina

219

6.10 Imgenes y guras


Tabla 6.32 Gracacin de funciones comunes en TikZ

Contina de la pgina anterior

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 30)
rectangle (140 ,40);
\ draw ( 0 , 0 ) s i n ( 2 0 , 2 0 )
s i n (60 , 20)
cos ( 8 0 , 0 )
sin (100 ,20);
\ end { t i k z p i c t u r e }

Tanto el seno como el coseno nicamente estn denidos para el intervalo


(0, 2 ), por lo que es necesario combinar ambas funciones para pintar la trayectoria completa
Otro mecanismo tambin muy importante para gracar funciones es el de poder darle una lista
de puntos y que vaya marcndolos con algn smbolo. Para marcar los puntos con smbolos requieres de la biblioteca plotmarks mediante el comando
\ u s e t i k z l i b r a r y { plotmarks }

Una vez cargada la biblioteca de marcas, puedes elegir entre las que se encuentran en la tabla 6.33.
Tabla 6.33 Smbolos para marcar curvas que se gracan
Marca

Identicacin

Descripcin

mark=

guiones

mark=|

barras verticales

mark=o

crculos huecos

mark=asterisk

asteriscos

mark=star

estrellas
Contina en la pgina siguiente

220
Tabla 6.33

LATEX
Smbolos para marcar curvas que se gracan
Marca

Contina de la pgina anterior

Identicacin

Descripcin

mark=oplus

crculos con suma

mark=oplus

crculos con suma

mark=otimes

crculos con producto

mark=otimes

crculos con producto

mark=square

cuadrado

mark=square

cuadrado slido

mark=triangle

tringulo

mark=triangle

tringulo slido

mark=diamond

diamante

mark=diamond

diamante slido

mark=pentagon

pentgono

mark=pentagon

pentgono slido

Para gracar funciones usamos tambin el comando \draw con modicadores y parmetros.

6.10 Imgenes y guras

221

Figura 6.6 Gracacin de funciones arbitrarias


\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox (0 , 2) r e c t a n g l e ( 2 0 0 , 2 0 0 ) ;
\ draw ( 0 , 0 ) p l o t [ mark=x , smooth ]
c o o r d i n a t e s{ %
(30 ,5)
(60 ,20)
(90 ,45)
(120 ,80)
(150 ,125)
(180 ,180)
(200 ,220)};
\ draw [ red ] ( 0 , 0 ) p l o t [ mark=o , smooth ]
coordinates {(30 ,1)
(60 ,8)
(90 ,27)
(120 ,64)
(150 ,125)
(166 ,220)
};
\ end { t i k z p i c t u r e }

Marcas un punto inicial y a continuacin dices que quieres gracar una funcin ( plot ). A esta
ltima opcin le aplicas modicadores, como el smbolo para las marcas, posiblemente si quieres o
no la curva suave (smooth) y el color de las marcas, que puede no ser el mismo que el de la curva.
Sin embargo, las grcas que pintamos en la gura 6.6 son realmente muy pobres. Quisiramos poder dibujar los ejes cartesianos y colocar indicaciones respecto a los valores en estos ejes.
Tenemos dos formas de hacerlo.
Usando el comando \draw con el argumento grid , cuya sintaxis es:
\draw <esq. inf. izquierda> grid [ <modicadores> ] <esq. sup. derecha>;
La parte del [ < intervalo > ] corresponde a que tan cerrada quieres la rejilla para las coordenadas. Sin embargo, con esta opcin no tenemos todava los ejes o las anotaciones en los
mismos. Veamos cmo queda en la gura 6.7.
Sin embargo, con esta opcin debemos poner los ejes y las marcas a pie. Los ejes no es ningn
problema pues lo hacemos simplemente utilizando \draw, como se muestra en la gura 6.8.
La otra forma de pintar la retcula es a pie . Afortunadamente, como el pintar las lneas se
trata de una tarea repetitiva, puedes usar la construccin \foreach que proporciona TikZ. Esta
es una construccin muy poderosa que funciona como sustitucin de macros, por lo que se
puede introducir en casi cualquier enunciado. Daremos el ejemplo en la gura 6.9 y despus
analizaremos su formato.

222

LATEX

Figura 6.7

Impresin de la retcula

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 2)
rectangle (200 ,250);
\ draw [ d o t t e d ] ( 0 , 0 )
g r i d [ x s t e p =15 , y s t e p = 1 2 . 5 ]
(210 ,225);
\ draw ( 0 , 0 )
...
...
\ end { t i k z p i c t u r e }

Figura 6.8 Colocacin de los ejes

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 2)
rectangle (200 ,220);
\ draw [ d o t t e d ] ( 0 , 0 )
g r i d [ x s t e p =15 , y s t e p = 1 2 . 5 ) ]
(210 ,225);
\ draw [ v e r y t h i c k , l a t e x ]
( 0 , 0 ) ( 0 , 2 2 5 ) ; %e j e y
\ draw [ v e r y t h i c k , l a t e x ]
( 0 , 0 ) ( 2 1 0 , 0 ) ; %e j e x
\ draw ( 0 , 0 )
p l o t [ mark=x , smooth ]
...
...
\ end { t i k z p i c t u r e }

223

6.10 Imgenes y guras


El enunciado \foreach tiene las siguientes partes:

Las variables del foreach que van separadas entre s por una diagonal y que consisten de diagonal inversa y un identicador. Se recomienda que los identicadores consistan nicamente
de letras, porque a veces, dependiendo del contexto, al sustituirse pueden dar problemas inesperados. En los dos ejemplos anteriores, la lista de variables consiste de una variable a las que
llamamos \x y y en el primero y segundo for , respectivamente.
Una lista de valores que deben tomar las variables. Cada elemento de la lista consiste de un
valor por cada variable enunciada, separados los elementos entre s por comas y los valores de
un mismo elemento por diagonales. Esta lista va entre llaves.
Por ltimo tenemos una lista de enunciados donde pueden o no aparecer las variables del for .

Figura 6.9

Segunda forma de pintar la retcula

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox (0 , 2)
rectangle (200 ,220);
\ foreach \ x i n {15 ,30 ,45 ,60 ,75 ,
90 ,105 ,120 ,135 ,
150 ,165 ,180 ,195 ,
210} {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ]
( \ x , 0 ) ( \ x , 2 2 5 ) ;
}
\ foreach \ y i n {12.5 ,25 ,37.5 ,50 ,
62.5 ,75 ,87.5 ,100 ,
112.5 ,125 ,137.5 ,
150 ,162.5 ,175 ,
187.5 ,200 ,212.5 ,
225} {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ]
( 0 , \ y ) ( 2 1 0 , \ y ) ;
}
\ draw ( 0 , 0 )
...
...
\ end { t i k z p i c t u r e }

Ambos ejemplos tienen una sola variable y las lneas que se pintan estn a intervalos constantes.
En general, cuando se dan estas dos condiciones puedes reemplazar a parte o toda la lista por una
lista donde se ineren los puntos que faltan y que tiene la siguiente forma:
primer valor

, segundo valor
, . . . , ltimo valor

224

LATEX
Los dos \foreach que tenemos los podramos haber escrito de las formas que se muestran en el
listado 6.1.

Cdigo 6.1

Formas de hacer retculas


\ f o r e a c h \ x i n {1 5 , 3 0 , 4 5 ,60 ,75 ,90 ,105 ,120 ,135 ,
150 ,165 ,180 ,195 ,210} {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ] ( \ x , 0 ) ( \ x , 2 2 5 ) ;
}
\ foreach \ y in {12.5 ,25 ,37.5 ,50 ,62.5 ,75 ,87.5 ,100 ,
112.5 ,125 ,137.5 ,150 ,162.5 ,175 ,
187.5 ,200 ,212.5 ,225} {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ] ( 0 , \ y ) ( 2 1 0 , \ y ) ;
}
\ foreach \ x in { 1 5 , 3 0 , . . . , 2 1 0 } {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ] ( \ x , 0 ) ( \ x , 2 2 5 ) ;
}
\ foreach \ y in { %
12.5 ,25 ,37.5 ,... ,225} {
\ draw [ l i n e w i d t h =.3 pt , d o t t e d ] ( 0 , \ y ) ( 2 1 0 , \ y ) ;
}

Aunque aparentemente el colocar los nmeros sobre los ejes parece sencillo, no sabemos cmo colocar objetos cuando trabajamos con TikZ, y no se logra simplemente con un \draw cuyo
objetivo es pintar lneas. En la siguiente seccin resolveremos este problema. Antes de abandonar
esta seccin quisiramos hacerte notar que hay otra forma de alimentarle coordenadas a \draw y
que es mediante un archivo con las mismas, que pudo ser generado por una utilera de linux. Para
el lector interesado le recomendamos que vea el manual de TikZ. Terminamos esta seccin con un
divertimento en la gura 6.10 que usa nicamente los conceptos que hemos dado hasta ahora.
Figura 6.10

Divertimento con slo trazo de lneas

Los comandos de TikZ que logran el dibujo anterior se encuentran en el listado 6.2.

6.10 Imgenes y guras


Cdigo 6.2

Dibujos arbitrarios
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 3 0 , 3 0 ) r e c t a n g l e ( 3 5 0 , 1 8 0 ) ;
% ojos
\ foreach \ x / \ y i n { %
50/160 ,100/160 , 140/90 ,190/90 ,310/100 ,280/150} { %
\ draw ( \ x , \ y ) c i r c l e (12 p t ) ;
\ draw [ f i l l ] ( \ x , \ y ) c i r c l e ( 3 p t ) ;
}
% cejas
\ f o r e a c h \ x / \ y / \ xx / \ yy / \ a / \ b / \ aa / \ bb i n { %
30/170/70/170/40/140/50/130 ,
80/170/120/170/40/140/50/130 ,
120/100/160/100/40/140/50/130 ,
170/100/210/100/40/140/50/130 ,
280/170/295/135/20/0/40/0 ,
310/120/325/85/20/0/40/0} {
\ draw ( \ x , \ y ) . . c o n t r o l s + ( \ a : 2 0 p t ) and + ( \ b : 2 0 p t ) . .
( \ xx , \ yy ) ;
\ draw ( \ x , \ y ) . . c o n t r o l s + ( \ aa : 3 0 p t ) and + ( \ bb : 3 0 p t ) . .
( \ xx , \ yy ) ;
}
% nariz
\ foreach \ x / \ y i n {0/75 ,90/0} { %
\ p g f p u t a t { \ p g f x y ( \ x , \ y )}{ %
\ draw [ rounded c o r n e r s ] ( 7 5 , 8 0 ) ( 7 0 , 6 5 ) ( 6 5 , 6 0 )
( 7 0 , 5 5 ) ( 8 0 , 5 5 ) ;
\ f o r e a c h \ xx i n { 7 0 , 7 4 } { %
\ draw [ f i l l ] ( \ xx , 6 0 ) c i r c l e ( 1 p t ) ;
}
% boca
\ draw ( 4 0 , 4 5 ) . . c o n t r o l s +(320:20 p t ) and +(220:20 p t ) . .
(110 ,45);
\ draw ( 4 0 , 4 5 ) . . c o n t r o l s +(320:30 p t ) and +(220:30 p t ) . .
(110 ,45);
} %\p g f p u t a t
} %f o r e a c h

225
(1/2)

226
Cdigo 6.2

LATEX
Dibujos arbitrarios

(2/2)

% Tercera cara
\ p g f p u t a t { \ p g f x y ( 40 ,50)}{ %
\ draw [ rounded c o r n e r s ] ( 3 3 0 , 7 0 ) ( 3 1 0 , 6 5 )
( 3 0 5 , 6 0 ) ( 3 1 0 , 5 0 ) ;
\ foreach \ x / \ y in {310/58 ,312/52}
\ draw [ f i l l ] ( \ x , \ y ) c i r c l e ( 1 p t ) ;
% boca
\ draw ( 2 7 0 , 7 0 ) . . c o n t r o l s + ( 0 : 3 0 p t ) and +(80:30 p t ) . .
(310 ,0);
\ draw ( 2 7 0 , 7 0 ) . . c o n t r o l s +(340:10 p t ) and +(70:10 p t ) . .
(309 ,0);
} %p g f p u t a t
\ end { t i k z p i c t u r e }

El nico comando nuevo en el listado anterior es el de pgfputat que lo que hace es tomar las
coordenadas dentro de su alcance (entre las llaves) relativas al primer parmetro ( \pgfxy(x,y) ).
Actividad 6.51 Escribe los comandos necesarios en TikZ para dibujar lo siguiente:

6.10.6.

Acomodando objetos
El poder pintar una retcula de la supercie que usamos para dibujar suele ser til no nada ms
para gracar funciones, sino tambin para dibujar y colocar objetos. En general, asociamos objetos
que pueden ser letreros, dibujos, puntos, etc. a nodos. Un nodo tiene las siguientes caractersticas:
Ocupa una cierta posicin, dada por una pareja (x,y).
Tiene alguna forma que puede ser circle , rectangle, diamond, ellipse .
Puede tener un identicador asociado.
Puede dibujarse o no su contorno con cualquier tipo de lnea.
Puede rellenarse o no con distintos patrones y en colores diversos.
El formato general para colocar un nodo es el siguiente:
\ node ( etiqueta
) [ modif icadores
]

a t ( posici
on
) { contenido
} ;

227

6.10 Imgenes y guras

Por ejemplo, puedes marcar algunas posiciones en el espacio en el que gracas las funciones
para colocar all una descripcin de las mismas.
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
\ useasboundingbox ( 0 , 0 ) r e c t a n g l e ( 2 0 0 , 2 2 0 ) ;
% r e t cula
\ foreach \ x i n {15 ,30 ,45 ,60 ,75 ,90 ,
......
f (x) = x3
% nodos
\ node ( x2 ) % e t i q u e t a
[ i n n e r sep=0 pt , o u t e r sep=0 p t ]
% modif .
a t ( 9 5 , 5 0 ) % dnde
{ } ; % contenido
\ node ( l e t x 2 )
[ r e c t a n g l e , draw , f i l l = w h i t e ]
f (x) = x2
a t ( 4 0 , 1 0 0 ) { f (x) = x2 } ;
\ draw[ l a t e x ] ( l e t x 2 ) ( x2 ) ;
% l nea e n t r e dos nodos
\ node ( x3 )
[ i n n e r sep=0 pt , o u t e r sep=0 p t ]
at (161 ,175) { } ;
\ node ( l e t x 3 )
[ red , r e c t a n g l e , draw , f i l l = w h i t e ]
a t ( 8 0 , 2 0 0 ) { f (x) = x3 } ;
\ draw[ l a t e x , red ] ( l e t x 3 ) ( x3 ) ;
\ end { t i k z p i c t u r e }

Puedes pensar en acomodar los nodos con un \foreach. Aunque en este caso slo son en realidad
dos objetos (tres lneas que se repiten casi dos veces), puedes parametrizar de la siguiente
manera:
......
e \ f o r e a c h \ e t i q/ %
\ xe / \ ye / \ l e t r / \ x l / \ y l / \ c o n t / \ c l o r
i n { x2 / 9 5 / 5 0 / l e t r x 2 / 4 0 /
100/f (x) = x2 / black ,
x3 / 1 6 1 / 1 7 5 / l e t x 3 /
8 0 / 2 0 0 / f (x) = x3 / red } {
\ node ( \ e t i q) %
[ i n n e r sep=0 pt , o u t e r sep=0 p t ]
a t ( \ xe , \ ye ) { } ;
\ node ( \ l e t r ) %
[ \ c l o r , diamond , draw , f i l l = w h i t e ]
at ( \ xl , \ y l )
{ \ cont } ;
\ draw[ l a t e x , \ c l o r ]
( \ l e t r ) ( \ e t i q ) ;
}
......

f (x) = x3

f (x) = x2

228

LATEX
Explicamos ahora algunos de los modicadores.
La forma (shape) puede ser cualquiera de las que se encuentran en la biblioteca shapes de
TikZ, que se carga mediante el comando
\ u s e t i k z l i b r a r y { shapes }

colocado en el prembulo del documento. En este caso, en el ejemplo no parametrizado utilizamos rectangle, mientras que en el parametrizado utilizamos diamond. La forma por omisin
es rectangle.
En algunos casos no deseas separacin entre la posicin del nodo y su exterior. Esta separacin
se da por omisin alrededor del texto contenido en el nodo, aun cuando no haya texto. Por eso
tienes que aclarar que la separacin entre el texto y el borde (inner sep) y la separacin entre
el borde y el entorno (outer sep) es de cero puntos. Este modicador lo utilizamos para marcar
que quieres colocarte exactamente sobre la lnea de la funcin. Hay otra manera de hacer esto,
que veremos un poco ms adelante.
La opcin de dibujar o no contorno est dada por draw, que indica que s se haga. La opcin
por omisin es no pintar contorno.
Ya vimos la opcin de rellenar el nodo ( ll ). Para darle un color al relleno y un patrn se
hace exactamente igual que con el comando \draw. El valor por omisin es transparente, por
lo que deja ver lo que sea que se haya pintado abajo; para que no se viera la retcula abajo
de nuestras etiquetas es que rellenamos de blanco.
Por ltimo, el contenido de un nodo puede ser cualquier cosa, entre otros, un arreglo, un
dibujo, otra retcula, ecuaciones (como lo hicimos nosotros). sta es una de las caractersticas
principales por las que nos gusta usar TikZ: te permite trasplantar el podero y lo no de LATEX
a cualquier dibujo o grca.
Para colocar los nmeros a lo largo de los ejes haremos uso de la construccin \foreach y del
enunciado \node.
f (x) = x3

200

\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]


\ useasboundingbox ( 0 , 0 )
rectangle (200 ,220);
...
\ foreach \ x i n {15 ,30 ,45 ,60 ,
...
\ foreach \ x / \ e t i q i n { %
30/1 ,60/2 ,90/3 ,120/4 ,
150/5 ,180/6 ,210/7} {
\ node a t ( \ x , 5 ) { \ t i n y \ e t i q } ;
}
\ foreach \ y i n { %
25 ,50 ,... ,200} {
\ node [ l e f t ] a t ( 0 , \ y ) { \ t i n y \ y } ;
} ......
\ end { t i k z p i c t u r e }

175

150

125

100

f (x) = x2

75

50

25

229

6.10 Imgenes y guras

Al acomodar los nmeros en el eje x tienes que utilizar posicin y etiqueta, pues stas no
coinciden. En el eje de las y, en cambio, como coinciden la posicin y la etiqueta, puedes utilizar la
misma variable para ambas.
Al colocar las etiquetas en el eje de las y utilizamos un nuevo modicador en el nodo nota
que no utilizamos nombre para el nodo pues no es necesario que acomoda al contenido del nodo
respecto a la posicin del mismo. En este caso deseamos que los nmeros se alineen a la derecha,
por lo que indicamos que el contenido se extienda hacia la izquierda (left). Tenemos las siguientes
posibilidades para este modicador:

above

anchor=north

above left

anchor=north west

above right

anchor=north east

left

anchor=west

right

anchor=east

below

anchor=south

below left

anchor=south west

below right

anchor=south east

En los modicadores a la izquierda en la tabla puedes agregar un desplazamiento, usando por


ejemplo left =2pt.
Tambin puedes usar el \foreach para repetir guras . Por ejemplo, si deseas dibujar una grca, puedes colocar nodos y despus unirlos con lneas, como se puede apreciar en la gura 6.11 que
se hizo con el cdigo del listado 6.3.
Figura 6.11 Dibujo de una grca en LATEX

1
a

0
1

230
Cdigo 6.3

LATEX
Dibujo de una grca
\ begin { t i k z p i c t u r e } [ x=1 pt , y=1 p t ]
% C o l o c a c i n de l o s nodos
\ f o r e a c h \ name / \ e t i q / \ x / \ y i n {
a / a/10/40 ,b / b/110/40 ,
c / c /10/120 ,d / d/110/120} {
\ node [ c i r c l e , draw ] ( \ name ) a t ( \ x , \ y ) { \ e t i q } ;
}
% d i b u j o de l o s arcos r e c t o s
\ f o r e a c h \ f f r / \ t t o / \ e t i q / \ pos i n {
a / b / 0 / above , b / d / 1 / r i g h t ,
d / c / 0 / above , c / a / 0 / l e f t } {
\ draw[ angle 6 0 ] ( \ f f r ) node [ \ pos ] { \ e t i q } ( \ t t o ) ;
}
% d i b u j o de l o s arcos curveados
\ f o r e a c h \ f f r / \ t t o / \ e t i q / \ pos / \ s a l e / \ e n t r a i n {
b / a / 1 / above / 2 7 0 / 2 7 0 ,
d/b/0/ right /0/0}
{
\ draw[ angle 6 0 ] ( \ f f r ) . . c o n t r o l s + ( \ s a l e : 4 0 p t )
and + ( \ e n t r a : 4 0 p t ) . . node [ \ pos ] { \ e t i q } ( \ t t o ) ;
}
\ end { t i k z p i c t u r e }

De entre lo que no revisamos antes est el signo de + al frente de las coordenadas de controls .
Esto se reere a que el ngulo, que corresponde a la primera coordenada, sea tomado en relacin
al centro del nodo al que se reere; la segunda coordenada indica la distancia del centro del nodo a
la parte ms alta de la curva (un bezier). Tambin es nueva la colocacin de etiquetas, que se hace
tambin colocando un nodo sobre la trayectoria, antes del destino de la lnea.
Este tipo de dibujos pueden alcanzar muchsima complejidad en TikZ, por lo que no seguimos
con el tema. Recomendamos nuevamente al lector interesado que consulte el manual de TikZ.
Actividad 6.52 Codica los dibujos de la gura 6.12 en LATEX.
Actividad 6.53 Haz el cdigo necesario para dibujar una cara similar a la que se us en esta
seccin.
Con esto damos por terminada la parte de dibujar con LATEX. Sobre todo en el paquete TikZ
hay una casi innidad de posibilidades. Nos falt, por ejemplo, cmo dibujar rboles o grcas de
manera ms directa, pero se supone que este material lo que debe hacer es abrirles el apetito y no
emparcharlos, as que por lo pronto ac dejamos este tema.

231

6.11 Referencias e ndices

Figura 6.12 Actividad 6.52

Yo

Ellos

6.11. Referencias e ndices


Un documento cientco o, en general, un documento profesional como un artculo, un libro, un
reporte, requiere, adems del contenido, una serie de elementos estticos y de ayuda muy importantes para el lector de la obra. Estos elementos incluyen: tipos de letras, sus tamaos, la numeracin de
los captulos, secciones, frmulas, cuadros o tablas, as como una serie de elementos (opcionales)
como tablas de contenido, de guras, ndices. Al conjunto de estos elementos se les conoce como
tipografa.
La tipografa de una obra, en general, la ja y atiende el editor, sobre todo en cuanto a cuestiones
estticas. Los ndices y la bibliografa o referencias son, necesariamente, provistas por el autor. En
muchos de los casos, tendrs que actuar como ambos: autor y editor de tus trabajos.
LATEX es ideal para ayudarte en la denicin de la tipografa, incluyendo los elementos opcionales. En este captulo hemos revisado ya prcticamente todo lo que necesitas para realizar documentos complejos, por lo que nos resta aclarar cmo realizar algunos de los elementos opcionales
que mencionamos en el prrafo anterior.

6.11.1.

Referencias bibliogrcas
Como ya discutimos, la presencia de referencias bibliogrcas en tus trabajos te permite incursionar en ms temas que consideres interesantes. Esto signica que las referencias deben ser
precisas y dirigir al lector de tu obra con el menor esfuerzo posible.

232

LATEX
Hay varias formas de darle formato a las bibliografas; de hecho, en la mayora de los casos te
encontrars siguiendo las reglas que para tal efecto dicte la editorial. Por tanto, una de las tareas ms
importantes cuando envas un libro, artculo o cualquier otro trabajo escrito para su publicacin, es
generar la lista de referencias bibliogrcas siguiendo dichas reglas.

En la prehistoria de la computadora
En la pre-historia de las computadoras, es decir hace una veintena de aos, tenamos que componer a mano la lista de bibliografas. Por ejemplo, tenamos que teclear esto:
\ begin { t h e b i b l i o g r a p h y } { algunae n t r a d a }
\ b i b i t e m [ e t i q u e t a 1 ] { l l a v e 1 } I n f o r m a c i n sobre l a e n t r a d a b i b l i o g r f i c a
\ b i b i t e m [ e t i q u e t a 2 ] { l l a v e 2 } I n f o r m a c i n sobre l a e n t r a d a b i b l i o g r f i c a
. . .
\ end { t h e b i b l i o g r a p h y }

Para citar esas referencias usamos el comando \ cite y usamos la llave apropiada, por ejemplo,
\ cite { llave1 } .

Algunos de los problemas con esta forma tradicional de ingresar bibliografa en nuestros trabajos son:
1. Es muy difcil mantener la consistencia en las citas, particularmente en un documento con
contribuciones de varios autores. Entre las dicultades ms comunes, encontramos, ewntre
otros, variaciones en el uso de abreviaturas o nombres completos, el uso de itlicas o comillas
para los ttulos.
2. Si ya tienes una lista bibliogrca ordenada de acuerdo a cierto estilo, por ejemplo alfabtico por autor y ao, es extremadamente difcil de convertir a otro estilo, por ejemplo usando
nmeros de acuerdo al orden de cita.
3. Es virtualmente imposible mantener una gran base de referencias bibliogrcas que pueda ser
reutilizada en distintos documentos.

BIBTEX
A continuacin describiremos una posible forma de resolver el problema de las listas de bibliografas. Est basado en LATEX y su programa hermano BIBTEX. Es importante hacer notar que
BIBTEX ha estado en circulacin por muchos aos y, por lo tanto, existen muchos estilos que hoy
podramos llamar estndar y que estn a nuestra disposicin, por lo que es muy fcil encontrar el
estilo adecuado para tu trabajo.
La estructura bsica de una entrada BIBTEX tienes tres partes bsicas:
(a) El tipo de la entrada (book, article, inproceedings y otros). Ntese que el tipo siempre va en
ingls.
(b) Una llave elegida por el usuario que identica la publicacin. Esta llave es la que debe usarse
como parmetro para el comando \ cite .
(c) Una serie de campos separados entre s por comas, donde cada campo consiste de un identicador de campo y sus datos entre comillas o llaves, por ejemplo:

6.11 Referencias e ndices

233

a u t h o r =" F u l a n i t o Labrador " ,


j o u r n a l = " Las b i c i c l e t a s " ,
t i t l e = { Los paseos por l a ciudad } ,

Existen varios esquemas para asociar convenientemente las llaves con sus respectivas entradas
en la base. Un esquema popular es el conocido como Harvard, donde tomamos el apellido del
autor (en minsculas) y el ao de la publicacin y los combinamos para crear la llave usando dos
puntos. Por ejemplo, smith:1987. BIBTEX lee las entradas del archivo de bibliografas, con extensin
.bib, y al formato que se le dar a las entradas lo controla un archivo de estilo, con extensin .bst.
Por razones de espacio, no discutiremos en este trabajo los comandos que pueden usarse en los
archivos de estilo, adems de que, como ya hemos mencionado, hay muchos estilos ya denidos
por personas o por organizaciones, por ejemplo por la Sociedad Matemtica Americana (AMS, por
sus siglas en ingls), por la Association for Computing Machinery (ACM), revistas de prestigio,
casas editoriales. A continuacin describimos algunos estilos muy usados y que no estn asociados
a ninguna asociacin o casa editorial. Es importante notar que no necesitas obtener una copia de los
archivos de estilo (.bst) de los que usamos aqu como ejemplos, ya que se incluyen con todas las
distribuciones de LATEX.
plain El estilo estndar de BIBTEX. Las entradas son ordenadas alfabticamente con etiquetas numricas.
unsrt Similar al anterior, pero las entradas son impresas en el orden en que fueron citadas en el
documento. Utiliza etiquetas numricas.
alpha Similar a plain, pero las etiquetas de las entradas son formadas a partir del nombre del autor
y del ao de publicacin.
abbrv Similar a plain, pero las entradas son ms compactas, dado que los nombres de pila, los
meses y los nombres de las revistas son abreviados.
acm Usado para las publicaciones de la Association for Computing Machinery. Tiene el nombre
del autor (apellido y luego nombre) en maysculas pequeas y usa nmeros como etiquetas.
Ahora te vamos a mostrar el efecto de usar BIBTEX en un documento y luego te mostraremos qu
fcil es cambiar el estilo y los dramticos cambios que generan estos cambios en la salida. Nuestros
archivos fuente sern: ejemplo.tex, nuestro documento LATEX y bejemplo.bib, nuestra base
de datos de bibliografas. En las guras 6.13 y 6.15 puedes ver estos documentos.

Figura 6.13

Ejemplo de LATEX usando BIBTEX


\ documentclass { a r t i c l e }
\ usepackage [ l a t i n 1 ] { i n p u t e n c }
\ p a g e s t y l e { empty }
\ begin { document }
\ s e c t i o n { Ejemplo de c i t a s }

(1/2)

234

LATEX

Figura 6.13 Ejemplo de LATEX usando BIBTEX

(2/2)

I n i c i a m o s con l a c i t a de un l i b r o ~ \ c i t e { nonaka95 : _knowl_creat_compan }


y una t e s i s d o c t o r a l a c o n t i n u a c i n ~ \ c i t e { van96 : _impac_kbs } .
Tambin q u i e r e s c i t a r un a r t c u l o e s c r i t o por un n i c o
a u t o r ~ \ c i t e { boehm88 } y luego o t r o donde hay ms de un
a u t o r ~ \ c i t e { boehm89 : _theor_w } . Tambin q u i e r e s i n t e n t a r , por
supuesto , hacer una c i t a a unos proceedings de una
c o n f e r e n c i a ~ \ c i t e { 0 1 : _progr_web_high_level_languag } y para t e r m i n a r
vamos a hacer una c i t a m l t i p l e , donde l a p r i m e r e n t r a d a es a un
a r t c u l o p u b l i c a d o en e l Web~ \ c i t e { wadlerhow , boehm89 : _theor_w } .
\ bibliographystyle { plain }
\ b i b l i o g r a p h y { bejemplo }
\ end { document }

Lo primero que debes entender es cmo funcionan LATEX y BIBTEX juntos: primero corres el
comando latex con el archivo fuente como argumento (gura 6.14); despus corres el comando
bibtex con el mismo argumento y luego debers ejecutar latex dos veces para que LATEX pueda
resolver todas las referencias. El resultado, puedes apreciarlo en la gura 6.16, donde lo hemos
puesto usando tanto el estilo plain como el estilo acm.
Figura 6.14

Salida de LATEX al ejecutarlo por primera vez sobre el archivo usando BIBTEX
% l a t e x ejemplo
T h i s i s TeX , V e r s i o n 3.14159 (Web2C 7 . 4 . 5 )
LaTeX Warning : C i t a t i o n nonaka95 : _knowl_creat_compan on page 1
u n d e f i n e d on i n p u t l i n e 6 .
LaTeX Warning : C i t a t i o n van96 : _impac_kbs on page 1 u n d e f i n e d
on i n p u t l i n e 7 .
LaTeX Warning : C i t a t i o n boehm88 on page 1 u n d e f i n e d on i n p u t
l i n e 10.
LaTeX Warning : C i t a t i o n boehm89 : _theor_w on page 1 u n d e f i n e d
on i n p u t l i n e 1 1 .
LaTeX Warning : C i t a t i o n 0 1 : _progr_web_high_level_languag on
page 1 u n d e f i n e d on i n p u t l i n e 1 3 .
LaTeX Warning : C i t a t i o n wadlerhow on page 1 u n d e f i n e d on
i n p u t l i n e 15.
LaTeX Warning : C i t a t i o n boehm89 : _theor_w on page 1 u n d e f i n e d
on i n p u t l i n e 1 5 .
No f i l e ejemplo . b b l .

6.11 Referencias e ndices

Figura 6.15 Ejemplo de una base de datos BIBTEX


@Book{ nonaka95 : _knowl_creat_compan ,
author =
{ Nonaka , I . and Takeuchi , H . } ,
title =
{ The KnowledgeC r e a t i n g Company } ,
publisher =
{ Oxford Univ Press } ,
year =
1995 ,
address =
{New York } }
@PhdThesis { van96 : _impac_kbs ,
author =
{ Van Wegen , B } ,
title =
{ Impacts o f KBS on c o s t and s t r u c t u r e o f
p r o u d u c t i o n processes } ,
school =
{ U n i v e r s e i t van Amsterdan } ,
year =
1996}
@ A r t i c l e { boehm88 ,
author =
{ Boehm , B . } ,
title =
{ A s p i r a l model o f s o f t w a r e development and
enhancement } ,
journal =
{ IEEE Computers } ,
year =
1988 ,
pages =
{61 62}}
@ A r t i c l e { boehm89 : _theor_w ,
author =
{ Boehm , B . and Ross , R . } ,
title =
{ TheoryW s o f t w a r e p r o j e c t management : p r i n c i p l e s
and examples } ,
journal =
{ IEEE Trans . Softw . Eng . } ,
year =
1989 ,
volume =
15 ,
number =
7,
pages =
{902 916}}
@Proceedings { 0 1 : _progr_web_high_level_languag ,
title =
{ Programming t h e Web w i t h HighL e v e l Languages } ,
year =
2001 ,
volume =
2028 ,
series =
{ L e c t u r e Notes i n Computer Science } ,
month =
{ April } ,
o r g a n i z a t i o n = {10 t h European Symposium on Programming ,
ESOP 2001} ,
publisher =
{ Springer Verlag } }
@misc { wadlerhow ,
a u t h o r = " P h i l i p Wadler " ,
t i t l e = {How t o Add Laziness t o a S t r i c t Language W i t h o u t
Even Being Odd } ,
u r l = " c i t e s e e r . n j . nec . com/ 1 0 2 1 7 2 . h t m l " }

235

236

LATEX

Figura 6.16 Ejemplo usando los estilos BIBTEX: acm (arriba) y plain (abajo)

Ejemplo de citas

Iniciamos con la cita de un libro [4] y una tesis doctoral a continuaci


on [5].
Tambi
en queremos citar un artculo escrito por un u
nico autor [2] y luego
otro donde hay m
as de un autor [3]. Tambi
en queremos intentar, por supuesto,
hacer una cita a unos proceedings de una conferencia [1] y para terminar vamos
a hacer una cita m
ultiple, donde la primer entrada es a un artculo publicado
en el Web [6, 3].

References
[1] 10th European Symposium on Programming, ESOP 2001. Programming the
Web with High-Level Languages, volume 2028 of Lecture Notes in Computer
Science. Springer Verlag, April 2001.
[2] B. Boehm. A spiral model of software development and enhancement. IEEE
Computers, pages 6162, 1988.
[3] B. Boehm and R. Ross. Theory-w software project management: principles
and examples. IEEE Trans. Softw. Eng., 15(7):902916, 1989.
[4] I. Nonaka and H. Takeuchi. The Knowledge-Creating Company.
Univ Press, New York, 1995.

Oxford

[5] B Van Wegen. Impacts of KBS on cost and structure of prouduction processes. PhD thesis, Universeit van Amsterdan, 1996.
[6] Philip Wadler. How to add laziness to a strict language without even being
odd.

Ejemplo de citas

Iniciamos con la cita de un libro [4] y una tesis doctoral a continuaci


on [5].
Tambi
en queremos citar un artculo escrito por un u
nico autor [2] y luego
otro donde hay m
as de un autor [3]. Tambi
en queremos intentar, por supuesto,
hacer una cita a unos proceedings de una conferencia [1] y para terminar vamos
a hacer una cita m
ultiple, donde la primer entrada es a un artculo publicado
en el Web [6, 3].

References
[1] 10th European Symposium on Programming, ESOP 2001. Programming the Web with High-Level Languages (April 2001), vol. 2028 of Lecture
Notes in Computer Science, Springer Verlag.
[2] Boehm, B. A spiral model of software development and enhancement. IEEE
Computers (1988), 6162.
[3] Boehm, B., and Ross, R. Theory-w software project management: principles and examples. IEEE Trans. Softw. Eng. 15, 7 (1989), 902916.
[4] Nonaka, I., and Takeuchi, H. The Knowledge-Creating Company. Oxford Univ Press, New York, 1995.
[5] Van Wegen, B. Impacts of KBS on cost and structure of prouduction
processes. PhD thesis, Universeit van Amsterdan, 1996.
[6] Wadler, P. How to add laziness to a strict language without even being
odd.

237

6.12 Emacs

6.11.2.

ndices
Para encontrar un tema de inters en un documento grande, el lector tiene dos alternativas, usar
la tabla de contenidos o el ndice. En general, el ndice es la forma de acceso ms comn a un
documento tcnico y, por tanto, una parte esencial del documento.
Al igual que las referencias bibliogrcas, para generar un ndice requerimos de la combinacin
de LATEX y otro programa externo llamado MakeIndex. En tu documento LATEX debes usar el comando \index para indicar una nueva entrada en el ndice del documento. Cuando ejecutes latex en tu
documento, se crea un nuevo archivo con extensin .idx en el que aparecen las entradas seleccionadas por \index y las pginas en que stas aparecen. Despus de esto, cuando ejecutes el comando
makeindex, al igual que como suceda con bibtex, leer un archivo de estilo (con extensin .ist) y
crear el archivo con extensin .ind que tiene la versin con formato del ndice de tu documento.
Crear un buen ndice no es una tarea sencilla y discutir el tema escapa de los alcances de este
documento. Sin embargo, te podemos recomendar crear el ndice conforme avances en el desarrollo
de tu documento. Debes tomar en cuenta a quin va dirigido el documento, qu es importante y
organizar el ndice de manera tal que el lector pueda encontrar fcilmente lo que busca.
El comando \index soporta hasta tres niveles de entradas en el ndice. Para acceder a los sub
y subsub niveles, el argumento de \index debe contener la entrada principal y las sub-entradas
separadas por el carcter !. Por ejemplo:

Pgina 3: \index{funciones ! par&\a&metros ! paso de}


Pgina 4: \index{funciones ! recursivas}
Pgina 5: \index{cerradura ! funcional}
Pgina 6: \index{cerradura ! con ambientes}
Pgina 10: \index{paradigma}
Pgina 11: \index{paradigma ! tipos de}

6.12. Emacs
Como ya sabes, editar un archivo LATEX es simplemente editar un archivo de texto con comandos
especiales que interpreta el comando latex o pdatex . En este sentido, con lo revisado de Emacs en
la seccin 4.3, puedes editar cmodamente tus documentos LATEX.
Sin embargo y como una muestra ms de la versatilidad y podero de Emacs, te mostraremos
algunos paquetes que extienden Emacs y lo convierten en un poderoso editor especializado para
LATEX.

238

6.12.1.

LATEX

AUCTEX
AUCTEX es un ambiente integrado para editar archivos LATEX y TEX e incluye una gran cantidad
de herramientas que iremos revisando a lo largo de esta seccin.
Una pregunta que es sano hacernos es qu puede hacer AUCTEX que no podamos hacer slo
con la ayuda de Emacs? Varias cosas: te permite ejecutar TEX/LATEX y dems comandos y herramientas relacionados con el proceso de documentos, como visores de DVI, Postscript o PDF. En
particular, la habilidad de ejecutar LATEX desde AUCTEX es interesante porque te permite navegar
los errores y te ofrece documentacin sobre cada tipo de error.
AUCTEX tambin nos ayuda a indentar nuestro cdigo fuente y tiene un par de herramientas para ver una vista preliminar, un esquema de tu documento. Adems, al estar ntimamente relacionado
con Emacs, AUCTEX ofrece una gran cantidad de macros y funciones auxiliares que te permiten
insertar comandos y editar tus documentos rpida y fcilmente.

Instalando AUCTEX
$ smart
AUCTEX es un programa escrito en Emacs-Lisp y es parte estndar de varias distribuciones
mayores de Emacs, incluyendo XEmacs. Desgraciadamente AUCTEX no viene con Emacs por omiinstall
emacs-auctex sin; sin embargo existen paquetes pre-compilados para la mayora de las distribuciones de Linux.

En caso de que no encuentres paquetes para tu distribucin de Linux, no hay nada de qu


preocuparse, pues ya sabes lo fcil que es instalar paquetes en Emacs (ver la seccin 4.3.18). En la
siguiente direccin puedes obtener la versin ms reciente de AUCTEX:
http://www.gnu.org/software/auctex/.
Para indicarle a Emacs que vas a utilizar AUCTEX, debes poner lo siguiente en tu /.emacs:
( r e q u i r e texs i t e )
( require tex )
( require latex )

Sangras y formato
AUCTEX puede indentar tu cdigo automticamente conforme lo escribes. Si presionas C-j
en lugar de Enter funcionar exactamente igual. Si presionas tab la lnea actual es indentada
y el cursor permanece donde est. Incluso el comando format-paragraph de Emacs, Mq , es
re-implementado por AUCTEX para que haga lo correcto con tu documento LATEX. Finalmente, la
funcin LaTeX-ll-buffer (que puedes ejecutar con Mx ) indenta todo tu documento, lo cul es
particularmente til cuando alguien te mand un documento sin formato.
En LATEX es comn tener documentos que ocupen ms de un archivo; por ejemplo, para libros
y tesis es comn utilizar un archivo por cada captulo o seccin. AUCTEX es capaz de entender
documentos que ocupan varios archivos y ayudarte en su edicin y manejo, para lo cual debes poner
en tu /.emacs lo siguiente:
( s e t q TeXautosave t )

239

6.12 Emacs
( s e t q TeXparses e l f t )
( setqd e f a u l t TeXmaster n i l )

Edicin de documentos
AUCTEX estudia el comando \documentclass de tu documento y en funcin de eso te ayuda a completar comandos de LATEX, lo cual tiene dos aplicaciones importantes y que a la postre
agradecers innitamente.
1. Te permite completar comandos parcialmente escritos. Por ejemplo, puedes escribir \renewc
y presionar Mtab (TeX-complete-symbol) y AUCTEX hace el resto, es decir, completar el
comando \renewcommand por ti. Si ms de un comando casa con el prejo, entonces AUCTEX
te ofrece una lista de los posibles comandos para que escojas.
2. Te ayuda a insertar ambientes, esto es pares de la forma \begin \end.
Un nmero importante de macros acompaan a AUCTEX y estn aqu para ayudarte a editar
rpidamente. Las ms importantes son las siguientes:
Tabla 6.34

Emacs: comandos de AUCTEX


Comando
LaTeX-environment

Descripcin
Inserta un par de la forma \begin \end.

C-c C-e
LaTeX-section

Inserta uno de \chapter, \section, . . .

C-c C-s
TeX-font
C-c C-f seguido de

Insertan uno de \textrm{} , \ textit {} , \ textbf {} ,


...

C-r , C-i , C-b , . . .


LaTeX-insert-item
MEnter
TeX-insert-macro
( C-c enter )

Inserta un nuevo item en un ambiente. Esto es til


en todo tipo de listas, AUCTEX propone el formato adecuado.
Con este comando puedes insertar un macro en tu
documento y AUCTEX te preguntar por los argumentos del mismo.

AUCTEX provee varios comandos ms, pero en la mayora de los documentos LATEX estndar,
con los que listamos arriba puedes avanzar rpidamente en la edicin. Ms adelante veremos algunos
comandos y utileras para hacer matemticas en un modo especial que AUCTEX provee para tal
efecto.
Para lograr que AUCTEX te pregunte por los ttulos de las secciones, captulos y otras subpartes del documento que insertas y te proponga nombres inteligentes para etiquetas, es conveniente

240

LATEX
agregar a tu /.emacs lo siguiente:
( s e t q LaTeXs e c t i o n hook
( LaTeXs e c t i o n heading
LaTeXs e c t i o n t i t l e
LaTeXs e c t i o n t o c
LaTeXs e c t i o n s e c t i o n
LaTeXs e c t i o n l a b e l )
)

Cmo ejecutar LATEX


AUCTEX provee un comando que, dependiendo del contexto en que se use, ofrece varias alternativas para ejecutar comandos sobre tu documento fuente.
El comando TeX-command-master ( C-c C-c ) o su hermano TeX-command-region ( C-c
C-r ) ejecuta LATEX en todo el documento o en la regin especicada, respectivamente.
Cuando ejecutamos LATEX de esta forma, la vista de Emacs se divide en dos y la salida de la
ejecucin se despliega en la segunda mitad para que puedas editar y ver el resultado de la ejecucin
simultneamente. Si LATEX encuentra errores, entonces puedes llamar a la funcin TeX-next-error
( C-c ) que mover el cursor al primer error y desplegar un texto explicativo junto con el mensaje
que arroj LATEX. Puedes repetir la ejecucin de este comando hasta que no encuentres ms errores.
Una vez que hayas concluido con el formato de tu documento exitosamente, puedes volver a invocar el comando TeX-command-master y te ofrecer una alternativa para visualizar el resultado.

Modo para matemticas


AUCTEX incluye un modo para facilitar la edicin de matemticas y, aunque sigue siendo el
mismo AUCTEX, se comporta tan distinto que lo tratamos por separado.
Ya te dijimos que TEX fue escrito por un matemtico? En caso de que no lo hayamos hecho,
s, TEX fue escrito por un matemtico e histricamente siempre ha ofrecido un soporte inigualable
para escribir matemticas. Fiel a esta tradicin, AUCTEX te ofrece un modo menor especial para
escribir smbolos matemticos rpidamente. Para entrar a este modo, debes teclear C-c , que
es el comando LaTeX-math-mode tambin se usa para salir del modo matemtico de AUCTEX.
Este modo menor agrega un comando, LaTeX-math-abbrev-prefx o simplemente y una vez
que llamas este comando (i.e. presionas ) AUCTEX leer un carcter del teclado y luego insertar
un smbolo matemtico asociado. La lista de asociacin entre carcteres y smbolos se encuentra
en la variable LaTeX-math-list y, por supuesto, puede congurarse. As, por ejemplo, estando en
modo matemtico la secuencia de teclas a inserta .
Nota: para nosotros, hispano parlantes, escribir acentos es muy importante y, en general, sirve
para poner acentos invertidos, lo cual diculta el acceso al modo matemtico de AUCTEX. Por lo
tanto tienes dos opciones, presionar dos veces y luego la letra deseada o bien cambiar el prejo
utilizado por AUCTEX.

241

6.12 Emacs

6.12.2.

RefTEX
RefTEX es un paquete para manejar etiquetas, referencias, citas e ndices desde Emacs en documentos TEX o LATEX. No es necesario usar AUCTEX y RefTEX juntos, pero hay pocas cosas que
combinan mejor, con la notable excepcin de tacos y cerveza.
RefTEX es otro programa escrito, al igual que AUCTEX, en Emacs-Lisp y es un producto de
software complejo y grande, pero te daremos una breve introduccin a su uso y te podemos garantizar que una vez que te acostumbres a RefTEX te preguntars cmo pudiste vivir sin l (nosotros nos
preguntamos eso con casi todos los productos de software, aplicaciones y paquetes que incluimos
en este libro, por ello es que ahora las promovemos incansablemente.)
Para cargar RefTEX en Emacs, agrega lo siguiente a tu /.emacs:
( require reftex )

Tabla de contenidos
La tabla de contenidos de un documento LATEX es algo muy importante y te puede dar una visin
global de la estructura de tu trabajo. Sin embargo, la tabla de contenidos existe hasta que compilas tu
documento fuente y exclusivamente en el documento generado como salida (DVI, PostScript, PDF,
etc.). Qu haras y cmo aprovecharas el poder tener una tabla de contenidos generada dentro de
tu editor? Qu haras con ella si adems esta tabla fuera navegable?
El comando reftex-toc ( C-c =) hace justo eso, te muestra secciones, etiquetas y entradas de
ndice denidos en tu documento y ms an, te permite saltar a cualquiera de estos puntos rpidamente.

Etiquetas y referencias
Crear etiquetas para los distintos elementos de tus documentos como guras, tablas y frmulas
es usualmente una tarea tediosa y poco graticante. La gente se ha inventado frmulas y tcnicas
para asignar etiquetas ordenadamente para despus recordarlas fcilmente y hacer referencia a stas
sin tener que buscar en todo el documento. Los resultados varan mucho, pero en general puedes
asegurar que es una mala idea y no funciona bien.
RefTEX te ayuda a crear etiquetas nicas y a encontrar la etiqueta adecuada cuando quieres
hacer una referencia rpidamente. RefTEX distingue entre etiquetas para distintos ambientes, conoce
todos los ambientes estndar (gure, equation, table) y puedes congurarlo para que entienda an
ms tipos de etiquetas cambiando el valor de la variable reftex-label-alist.
Crear etiquetas: El comando reftex-label ( C-c ( ) inserta una etiqueta en el punto. Cuando
usas este comando RefTEX realizar una de las siguientes acciones:
Derivar una etiqueta del contexto (por omisin usa una para seccin).
Pedir que le des una cadena descriptiva para la etiqueta (esto lo hace para guras y
tablas).

242

LATEX
Insertar una etiqueta simple hecha con un prejo y un nmero (para todos los dems
ambientes).
La variable reftex-insert-label-ags controla qu etiquetas son creadas y cmo.
Referir etiquetas: Para hacer una referencia usa el comando reftex-reference ( C-c ) ). Esto te
muestra una vista (outline) de tu documento con todas las etiquetas de un cierto tipo (gure,
equation, etc.) y algo de contexto para cada etiqueta para que puedas reconocerlas fcilmente.
Al seleccionar una etiqueta de esta vista, RefTEX inserta \ ref {LABEL} en el buffer original.

Citas
El comando reftex-citation ( C-c [ ) te permite especicar una expresin regular o patrn
para buscar en el archivo de base de datos de BIBTEX para el documento (tal y como se especica en
el comando \ bibliography ). Todas las entradas que concuerden con el patrn de bsqueda te sern
mostradas para que elijas la apropiada. La lista aparece con formato y ordenada.
Una vez que seleccionas una entrada, aparecer en tu documento fuente una referencia de la
forma \ cite {KEY}.

Soporte para la generacin de ndices


RefTEX tambin te ayuda a generar entradas para el ndice de tu documento. Ms an, te permite
incluso compilar las entradas existentes alfabticamente y te las presenta en un buffer para que
puedas editarlas.
Para crear una entrada de ndice utiliza reftex-index-selection-of-word ( C-c / ) y para desplegar y editar el ndice, reftex-display-index ( C-c > ).
RefTEX puede hacer muchas cosas ms, pero para efectos prcticos lo que hemos cubierto es
lo ms importante y til del programa y su uso. Estamos seguros te traer gratas sorpresas y un
incremento considerable de productividad cientca.

6.12.3.

Preview
El paquete preview-LATEX se distribuye como parte estndar de AUCTEX y extiende tanto a
Emacs como a LATEX. Esto es porque incluye un estilo para LATEX y cdigo en Emacs-Lisp para
aprovechar este estilo y ayudarte en la edicin de documentos.
Para los usuarios de TEX/LATEX siempre ha sido un problema serio la discusin sobre tener
editores que te muestren lo que ests escribiendo (por sus siglas en ingls, WYSIWYG), que como
ya sabes es algo que no sucede con LATEX. Sin embargo, la intencin del paquete preview para Emacs
no es exactamente sta.
Con preview se busca un balance entre elementos grcos y texto. Utiliza la salida grca para
ciertas construcciones (congurable); hace esto cuando se le solicita y lo hace ah mismo, dentro del
cdigo fuente. Cambiar entre la versin grca y el cdigo fuente es fcil y natural y puede hacerse
para cada imagen de manera independiente.

243

6.12 Emacs
Para activar preview debes poner lo siguiente en tu /.emacs:
( l o a d " previewl a t e x . e l " n i l t t )

Uso bsico de preview


Una vez activado y cuando ests editando un archivo de LATEX, puedes utilizar el comando
preview-document ( C-c C-p C-d ). En este momento se comenzarn a generar vistas preliminares para distintos objetos en tu documento. Nota importante: mientras se generan las vistas
preliminares, puedes navegar tu documento en el buffer; sin embargo no es recomendable que edites
algo porque el resultado de las vistas podra terminar en lugares errneos.
En caso de querer editar el buffer mientras se estn generando las vistas preliminares, te conviene detener todos los procesos ejecutndose en el fondo con el comando TeX-kill-job ( C-c C-k ).
Figura 6.17 Ejemplo de preview en la edicin de este captulo

Para ver/editar el cdigo LATEX para un objeto especco, que es probablemente ms til, puedes
ejecutar el comando preview-at-point ( C-c C-p C-p ) o bien presionar el botn del medio del
ratn sobre la vista previa. Ahora puedes editar el cdigo y generar una nueva vista preliminar con
C-c C-p C-p nuevamente.

Lenguajes de
marcado

Los lenguajes de marcado (markup languages) utilizan texto comn y corriente combinado con
informacin adicional que sirve para denir su semntica o su presentacin (a veces ambas). En
palabras sencillas: esta informacin adicional nos dice qu signica el texto o cmo se presenta
al usuario. La informacin adicional suele estar intercalada en el mismo texto utilizando marcas
especiales; de ah el nombre de lenguajes de marcado.
Los lenguajes de marcado tienen sus orgenes en la industria editorial, mucho antes de la creacin de computadoras digitales: cuando un manuscrito se preparaba para impresin, un especialista
(coloquialmente conocido como marcador) escriba en los mrgenes anotaciones especiales (marcas) que servan de gua a los que transcriban el texto en su forma nal ya lista para imprimirse.
Estas marcas eran un lenguaje de marcado primitivo (no haba necesariamente un estndar, ni tenan
una sintaxis formalmente denida), que serva para explicar la presentacin del texto: el tamao de
la fuente, el tipo, el estilo, etc.
Con la llegada de las computadoras, los lenguajes de marcado ganaron adems la capacidad de
obtener automticamente informacin semntica: por ejemplo, si en nuestro lenguaje de marcado
denimos la marca AUTOR: para que con ella identiquemos al autor del documento, es trivial
hacer un programa que automticamente obtenga el autor o autores de todos los documentos disponibles y haga una relacin entre ellos.
Aunque hay muchsimos lenguajes de marcado actualmente (TEX y PostScript son lenguajes
de marcado procedurales), de especial importancia es SGML, el Lenguaje de Marcado Estndar
Generalizado (Standard Generalized Markup Language). SGML es un meta lenguaje para denir
lenguajes de marcado, y de ah se derivan los dos lenguajes de marcado probablemente ms famosos
y usados en la actualidad: XML y HTML. Nos centraremos en estos ltimos durante el resto del
captulo.

246

Lenguajes de marcado

7.1. XML
SGML es un metalenguaje grande y complejo. Implementar un programa (o sistema de programas) que pueda lidiar con cualquier lenguaje denido con SGML tendr que ser igualmente grande
y complejo. La mayor parte de los programas que se utilizan para manejar lenguajes denidos con
SGML, en la prctica slo soportan un subconjunto de todas las opciones que ofrece.
En gran medida por este motivo, y las necesidades especiales que presentan las aplicaciones
que necesitan comunicarse por Internet (SGML precede por varios aos a Internet), fue que se cre
XML, el Lenguaje de Marcado Expandible (Expansible Markup Language). XML es un subconjunto simplicado de SGML, lo que hace el escribir programas que lo manejen mucho ms fcil, y
adems est pensado para compartir informacin, especialmente a travs de la red.
XML es inmensamente popular y existen muchsimos lenguajes denidos con XML que se usan
hoy en da; por nombrar slo algunos: RSS (para noticias), MathML (para representar frmulas
matemticas complejas), XHTML (el sucesor de facto de HTML), Scalable Vector Graphics (para
grcos escalares), MusicXML (para notacin musical) y miles ms. XML tambin es utilizado
por muchos programas para guardar sus archivos, especialmente en el mundo del software libre:
OpenOfce, AbiWord, Gnumeric y KOfcen usan XML para guardar sus documentos, por nombrar
unos cuantos.
Un documento XML presenta su informacin en una estructura jerrquica, que podemos ver como un rbol. Todo documento XML tiene un elemento raz, que a su vez puede tener ms elementos
y/o texto comn y corriente. Cada elemento a su vez puede tener ms elementos y/o texto y as
sucesivamente. Adems, cada elemento puede tener atributos. Veamos un ejemplo en el listado 7.1

Cdigo 7.1

Documento en XML
<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<libro >
<titulo >
E l i n g e n i o s o h i d a l g o don
Q u i j o t e de l a Mancha
</ t i t u l o >
< a u t o r > M i g u e l de C e r v a n t e s S a a v e d r a < / a u t o r >
< p a r t e numero ="1" >
< c a p i t u l o numero ="1" >
< resumen >
Que t r a t a de l a c o n d i c i&o a c u t e ; n y e j e r c i c i o
d e l famoso h i d a l g o don Q u i j o t e de l a Mancha
</ resumen >

(1/2)

247

7.1 XML
Cdigo 7.1

Documento en XML

(2/2)

<parrafo >
En un l u g a r de l a Mancha , de cuyo nombre no
q u i e r o a c o r d a r m e , no ha mucho t i e m p o que
v i v&i a c u t e ; a un h i d a l g o de l o s de l a n z a en
a s t i l l e r o , a d a r g a a n t i g u a , r o c&i a c u t e ; n f l a c o
y galgo corredor .
<parrafo >
...
</ c a p i t u l o >
...
</ p a r t e >
...
</ l i b r o >

La primera lnea es la declaracin XML, que sirver para denir qu versin del estndar estamos
usando (generalmente la 1.0) y el conjunto de carcteres en que est el documento (generalmente
UTF-8).
El ejemplo obviamente es de un libro: libro es el elemento raz, titulo, autor, parte, capitulo,
extracto y parrafo son elementos, mientras que numero es un atributo que poseen parte y capitulo. Como estamos deniendo un documento XML que utiliza el conjunto de carcteres UTF-8,
sera perfectamente legal denir a los elementos como ttulo, captuo, prrafo, pero no es lo que
suele acostumbrarse. De igual forma, podran utilizarse acentos (o ees o diresis), pero utilizamos
&oacute; en lugar de para explicar lo que son las entidades.
Las entidades son usadas para poder escribir carcteres en XML que de otra forma sera complicado hacerlo. Por ejemplo, el smbolo de menor que (<) no es vlido dentro de un documento
XML porque es el utilizado para denir cundo empieza una etiqueta de inicio o nal: entonces se
utiliza la entidad &lt; (por less than, en ingls). De igual forma, para usar el smbolo de ampersand (&) se utiliza la entidad &amp;. En todo documento XML estn denidas las siguientes cinco
entidades:
Entidad

Smbolo

&amp;
&gt;
&lt;
&apos;
&quot;

&
>
<
"

pero se pueden denir ms entidades y veremos cmo ms adelante. Adems, todo smbolo en UTF8 puede utilizarse usando su nmero identicador; por ejemplo, en lugar de &oacute; para la ,
podramos usar &#268;, porque 268 es el nmero que le corresponde a en UTF-8.
El documento de este ejemplo est bien formado; esto quiere decir que todos sus elementos
tienen etiquetas de inicio y nales (por ejemplo <parte> y < /parte>) estn bien anidados (todo

248

Lenguajes de marcado
elemento, excepto el raz, est completamente contenido dentro de otro) y los valores de los atributos
estn entre comillas (tambin podran estar entre comillas simples, como en 3).
Para que un documento XML sea correcto, debe estar bien formado; pero eso no es suciente;
adems, el documento debe ser vlido. Un documento XML vlido es aquel que cumple con un
esquema particular. Un esquema nos dice la estructura que debe seguir un documento XML; hay
varias formas de denir esquemas.
La forma ms vieja de denir esquemas viene de tiempos de SGML y se llama DTD, Denicin
de Tipo de Documento (Document Type Denition). El DTD para los XML de libros ser como se
ve en el ejemplo del listado 7.2.

Cdigo 7.2

DTD para archivo en XML


<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<!ENTITY i a c u t e "&#262;" >
<!ENTITY o a c u t e "&#268;" >
...
<!ELEMENT l i b r o ( t i t u l o , a u t o r + , p a r t e + ) >
<!ELEMENT t i t u l o ( #PCDATA) >
<!ELEMENT a u t o r ( #PCDATA) >
<!ELEMENT p a r t e ( c a p i t u l o + >)
<!ATTLIST p a r t e numero CDATA #REQUIRED >
<!ELEMENT c a p i t u l o ( resumen , p a r r a f o + ) >
<!ATTLIST c a p i t u l o numero CDATA #REQUIRED >
<!ELEMENT r e s u m e n ( #PCDATA ) >
<!ELEMENT p a r r a f o ( #PCDATA ) >

El DTD sencillamente nos dice qu puede contener cada elemento y qu atributos puede tener;
tambin puede denir las entidades vlidas en el documento. El elemento libro tiene un titulo, uno
o ms autores (autor+) y una o ms partes (part+). El DTD tambin nos dice si un atributo es
obligatorio (#REQUIRED) u opcional.
El problema con los DTDs es que son poco exibles y que no soportan varias caractersticas especcas de XML que SGML no tiene (como espacios de nombres). Sin embargo, para documentos
con estructuras sencillas, los DTDs cumplen razonablemente el trabajo.
Otra forma de denir esquemas es con XML Schema. Sin embargo, los esquemas de este estilo
son algo ms complejos que los DTDs; por razones de espacio no los veremos aqu.
Una gran ventaja que ofrece XML para manipular informacin, es que ya existen las herramientas necesarias para manejar los documentos, en casi cualquier lenguaje de programacin existente.
Comprobar que un documento XML est bien formado y sea vlido es muy sencillo, por lo que
el programador ya slo necesita encargarse de extraer y manipular la informacin contenida en el
documento. Para esto ltimo tambin ya existen las herramientas necesarias.

249

7.2 HTML

7.2. HTML
HTML naci casi al mismo tiempo que la World Wide Web, de la necesidad de poder presentar
informacin en la red de forma rpida y sencilla. SGML era muy complejo como para lo que se
requera y XML todava no se inventaba; as que HTML fue el resultado de querer resolver un
problema muy concreto de la forma ms sencilla posible. Se utiliz una estructura similar a la de un
lenguaje SGML, pero mucho menos estricto y con mucha tolerancia a fallos.
Eso, aunado a que al inicio no haba un estndar propiamente sino slo una serie de reglas no
muy claramente especicadas, hizo que HTML terminara siendo un lenguaje poco consistente y
demasiado permisivo en su manejo de errores (en general los navegadores desplegaban una pgina
no importaba cuntos errores tuviera el documento HTML).
Con la fundacin del Consorcio de la World Wide Web (World Wide Web Consortium), o W3C,
se empezaron a corregir muchos de los problemas que inicialmente tena HTML; aunque ahora el
estndar de XHTML es bastante estricto y formalmente denido, todava existen miles de pginas
en la red que siguen usando (o abusando) de las versiones iniciales de HTML.
El estndar actual es el de XHTML 1.0 y 1.1 y es en se en el que nos centraremos aqu.

7.2.1.

XHTML
XHTML es bsicamente una limpieza de HTML para que se comporte como un documento
XML bien formado y que sea vlido, utilizando uno de los tres DTDs que la W3C especica para
XHTML.
La W3C ofrece 3 DTD distintos para poder tener uno que ofrezca compatibilidad con versiones
anteriores de HTML; un DTD es el llamado estricto y es el que debera usarse para pginas nuevas
si se puede garantizar que quienes las vean tendrn navegadores razonablemente modernos que
puedan desplegarlas sin problemas. El segundo es el transicional y es un poco ms exible que el
estricto; es el que hay que usar si se quiere convertir paulatinamente pginas escritas antes de que
se deniera XHTML o para conservar compatibilidad para navegadores ya algo viejos. El tercero es
para utilizar marcos. Por razones de espacio aqu slo veremos XHTML estricto.
Un documento XHTML mnimo podra ser el que se ve en el listado 7.3.
Una vez ms, podramos utilizar directamente en lugar de &eacute;, porque el documento
utiliza el conjunto de carcteres UTF-8, pero usamos la entidad para recalcar que en XHTML casi
todas las letras acentuadas tienen denida una entidad, as como muchos smbolos de otros idiomas
(por ejemplo, &alpha; despliega ).
Dado que un documento en XHTML es un documento XML tambin, empieza con la declaracin XML. Despus viene el tipo de documento, donde le decimos que utilice la versin estricta del
estndar XHTML 1.0. El elemento raz de un documento XHTML es html y ste a su vez tiene los
elementos de cabeza (head) y cuerpo (body). En este ejemplo slo ponemos el ttulo de la pgina
en la cabeza y un encabezado de nivel 1 (h1) y un prrafo (p) en el cuerpo.

250
Cdigo 7.3

Lenguajes de marcado
Documento en XHTML
<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<!DOCTYPE h t m l PUBLIC " / /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN"
" h t t p : / / www. w3 . o r g / TR / x h t m l 1 /DTD/ xhtml1 s t r i c t . d t d " >
< h t m l xmlns =" h t t p : / / www. w3 . o r g / 1 9 9 9 / x h t m l " xml : l a n g =" en " >
<head >
< t i t l e >P&a a c u t e ; g i n a P e r s o n a l de F u l a n o de Tal < / t i t l e >
</ head >
<body >
<h1 >P&a a c u t e ; g i n a P e r s o n a l de F u l a n o de Tal < / h1 >
<p>
Hola , yo s o y F u l a n o de T a l y &e a c u t e ; s t a
e s mi p&a a c u t e ; g i n a p e r s o n a l .
</ p>
</ body >
</ html >

Todos los elementos denidos en XHTML cumplen una funcin semntica, no de presentacin.
Aunque por omisin ciertos elementos se despliegan con caractersticas especiales (por ejemplo,
los encabezados de nivel 1 tienen una fuente de mayor tamao que los de nivel 2), esto es slo por
convencin y tratando de emular cmo funcionaba HTML originalmente. XHTML realmente no
dice casi nada acerca de cmo debe verse un documento; la presentacin del mismo es independiente
de su contenido.
Para modicar la presentacin de un documento XHTML se utilizan hojas de estilo, que es lo
que veremos a continuacin.

7.3. CSS
Las Hojas de Estilo en Cascada (Cascading Style Sheets) es el medio a partir del cual se modica cmo se ve un documento XHTML; pero tambin se pueden utilizar para documentos XML
arbitrarios o para documentos HTML aunque no sean necesariamente XHTML.
Veamos cmo funcionan siguiendo el ejemplo en el listado 7.4.
Cdigo 7.4

Hoja de estilo en cascada


<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<!DOCTYPE h t m l PUBLIC " / /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN"
" h t t p : / / www. w3 . o r g / TR / x h t m l 1 /DTD/ xhtml1 s t r i c t . d t d " >
< h t m l xmlns =" h t t p : / / www. w3 . o r g / 1 9 9 9 / x h t m l " xml : l a n g =" en " >
<head >
< t i t l e > P r u e b a s de CSS < / t i t l e >
</ head >

(1/2)

253

7.3 CSS

Para que el documento XHTML use la hoja de estilo, se utiliza el elemento link en la cabeza del
mismo:

Cdigo 7.6

Documento en XHTML con link


<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<!DOCTYPE h t m l PUBLIC " / /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN"
" h t t p : / / www. w3 . o r g / TR / x h t m l 1 /DTD/ xhtml1 s t r i c t . d t d " >
< h t m l xmlns =" h t t p : / / www. w3 . o r g / 1 9 9 9 / x h t m l " xml : l a n g =" en " >
<head >
< t i t l e > P r u e b a s de CSS < / t i t l e >
< l i n k r e l =" s t y l e s h e e t " h r e f =" e x a m p l e . c s s " t y p e =" t e x t / c s s " / >
</ head >

Sin importar que tan bien o mal se vea la pgina, lo relevante es que su apariencia es completamente independiente de su contenido. El que lo primero sea ortogonal a lo segundo, permite a los
creadores del contenido concentrarse slo en la informacin y dejarle la presentacin a diseadores
grcos o a alguien que se encargue exclusivamente de eso (y as evitar que las pginas se vean
como en el ejemplo).
Las hojas de estilo tambin sirven para poder determinar cmo se representar una pgina en
distintos medios. Se puede utilizar una hoja de estilo para presentarla en un navegador normal;
otra especialmente hecha pensando en impresoras; una ms para lectores de pantalla (para usuarios
ciegos o con visin limitada).

7.3.1.

Javascript
JavaScript (que no tiene casi nada que ver con el lenguaje de programacin Java) es un lenguaje
de programacin que se usa principalmente dentro de un navegador. Dado que es posible acceder
al contenido de una pgina a travs de JavaScript, es una opcin muy sencilla para crear contenido
dinmico y darle la posibilidad al usuario de interactuar con la pgina sin necesidad de comunicarse
todo el tiempo con el servidor (porque el cdigo JavaScript se ejecuta en el cliente, en el navegador).
Todo el contenido de una pgina est disponible a travs del Modelo de Objeto del Documento (Document Object Model o DOM), que es bsicamente una representacin en memoria de la
jerarqua tipo rbol que tiene un documento HTML o XML.
Por ejemplo, si tenemos la pgina en el listado 7.7,

254
Cdigo 7.7

Lenguajes de marcado
Documento en XML
<? xml v e r s i o n = " 1 . 0 " e n c o d i n g ="UTF8"?>
<!DOCTYPE h t m l PUBLIC " / /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN"
" h t t p : / / www. w3 . o r g / TR / x h t m l 1 /DTD/ xhtml1 s t r i c t . d t d " >
< h t m l xmlns =" h t t p : / / www. w3 . o r g / 1 9 9 9 / x h t m l " xml : l a n g =" en " >
<head >
< t i t l e > JavaScript </ t i t l e >
< s c r i p t t y p e =" t e x t / j a v a s c r i p t " s r c =" j a v a s c r i p t . j s " / >
</ head >
<body >
<h1 > J a v a S c r i p t < / h1 >
< t a b l e i d =" myTable " >
<tr >
< t d >< s t r o n g > E l e m e n t o s < / s t r o n g > </ t d >
< t d >< s t r o n g >N&u a c u t e ; mero < / s t r o n g > </ t d >
</ t r >
</ t a b l e >
< i n p u t t y p e =" b u t t o n " v a l u e =" A g r e g a r r e n g l&o a c u t e ; n "
o n c l i c k =" addRow ( document ) ; " / >
< i n p u t t y p e =" b u t t o n " v a l u e =" B o r r a r r e n g l&o a c u t e ; n "
o n c l i c k =" delRow ( document ) ; " / >
</ body >
</ html >

y el archivo javascript.js tiene denidas las funciones del listado 7.8.


Cdigo 7.8

Documento en XML
f u n c t i o n addRow ( document )
{
var t a b l e
= document . g e t E l e m e n t B y I d ( myTable ) ;
v a r numRows = t a b l e . rows . l e n g t h ;
v a r newRow = t a b l e . i n s e r t R o w ( numRows ) ;
var c e l l 1
= newRow . i n s e r t C e l l ( 0 ) ;
var c e l l 2
= newRow . i n s e r t C e l l ( 1 ) ;
c e l l 1 . innerHTML = Nuevo Elemento ;
c e l l 2 . innerHTML = numRows ;
}
f u n c t i o n delRow ( document )
{
var t a b l e
= document . g e t E l e m e n t B y I d ( myTable ) ;
v a r numRows = t a b l e . rows . l e n g t h ;
i f ( numRows > 1 )
t a b l e . d e l e t e R o w ( numRows 1 ) ;
}

255

7.4 Emacs

Entonces cada vez que se haga click en el botn Agregar rengln, un nuevo rengln aparecer en
la tabla; y cada vez que se haga click en Borrar rengln, se le quitar un rengln a la tabla.
El primer botn de la pgina tiene denido (usando el atributo onclick) que cada vez que se le
haga click, se mande llamar a la funcin addRow con el parmetro document. En JavaScript, document
es una variable que representa a todo el documento HTML o XML. El segundo botn tiene denido
de forma anloga que se mande llamar la funcin delRow.
La funcin addRow hace lo siguiente: primero obtiene el objeto de la tabla usando la funcin
getElementById. sta es una funcin del DOM y nos permite obtener cualquier elemento, siempre y
cuando tengamos su identicador (en la pgina, al denir la tabla usamos el atributo id ).
Despus, obtiene cuntos renglones tiene la pgina e inserta un nuevo rengln al nal; los renglones se numeran a partir del 0, por lo que si hay n renglones estn numerados de 0 a n 1.
Despus aade dos celdas al rengln y dene el cdigo HTML de cada una de ellas.
La funcin delRow tambin obtiene el objeto de la tabla; si hay al menos dos renglones borra el
ltimo (esto es para no quedarnos con una tabla sin renglones).
Este ejemplo tan sencillo permite ver el poder que tiene JavaScript: nos permite modicar dinmicamente el documento HTML y XML, y de esta forma interactuar con el usuario sin necesidad
de comunicarnos con el servidor, porque todo ocurre del lado del cliente (el navegador).

7.4. Emacs
Emacs tiene soporte para manipular HTML, XML y XHTML, incluyendo validacin utilizando
el DTD. Si planeas utilizar XHTML, slo tienes que aadir lo siguiente al archivo /.emacs:
( addt o l i s t

a u t o mode a l i s t

( " \ \ . h t m l \ \ " . xmlmode ) )

Al abrir un documento con extensin .html, el modo XML se cargar automticamente. Para cargar
el DTD denido en el tipo de documento, slo hay que oprimir Cc Cp ; lo validas usando el
comando Cc Cv . Para denir el programa externo para validar puedes aadir lo siguiente al
archivo /.emacs:
( customs e t v a r i a b l e s
( sgmlxmlv a l i d a t e command " x m l l i n t v a l i d n o o u t %s %s " )
)

Aqu se utiliza el programa xmllint, pero se puede utilizar cualquier programa que valide un
documento XML contra su DTD.
Si ests editando un documento XML, con Cc Ce aades un elemento y Emacs se encargar de slo mostrar los elementos vlidos (de acuerdo al DTD). Con el comando Cc / cerrar
cualquier etiqueta de inicio que siga abierta.

Herramientas para
desarrollo

8.1. Control de versiones


El control de versiones es el manejo de cambios a la informacin. Desde siempre este manejo ha
sido crtico para los programadores, ya que buena parte del desarrollo de sistemas involucra realizar
pequeos cambios y, al siguiente da, deshacer dichos cambios. El control de versiones, sin embargo,
va ms all del mundo del desarrollo de software y tiene aplicacin en cualquier situacin donde se
utilicen computadoras para manejar informacin de amnera colectiva y que cambia constantemente.
Existen muchos sistemas de control de versiones, algunos propietarios y otros libres. Uno de
los primeros sistemas de control de versiones y, sin lugar a dudas, el ms utilizado es CVS.
Este libro, por ejemplo, fu escrito utilizando el sistema de control de versiones subversion, que
revisaremos en esta seccin.

8.1.1. subversion
subversion es un sistema de control de versiones abierto y libre. Esto signica que subversion
maneja archivos y directorios a travs del tiempo. Su forma de operar involucra un rbol de archivos
en un repositorio central. Este repositorio funciona como un servidor de archivos ordinario, excepto
que recuerda cada cambio que se realiza a los archivos y directorios. Esto te permite recuperar
versiones anteriores de los datos o examinar la historia de cmo stos fueron cambiando.
subversion puede acceder a sus repositorios a travs de redes, lo que le permite ser utilizado

8.1 Control de versiones

257

en distintas computadoras. En este sentido, la habilidad de tener varias personas modicando y


trabajando sobre el mismo conjunto de datos, desde sus respectivos lugares, mejora las posibilidades
de colaboracin. Cada miembro del equipo aporta al proyecto de manera directa, sin intermediarios
y, dado que todo est etiquetado por versiones, no se corre el riesgo de sacricar calidad al no tener
un ltro de calidad, ya que si algn cambio reciente es incorrecto, subversion permite echar atrs
los cambios realizados.
subversion es una arquitectura cliente-servidor. Dado que la instalacin y conguracin de servicios de red escapa el alcance de este libro, aqu hablaremos brevemente de los aspectos relativos
al cliente.

8.1 Clientes grcos para subversion

Existen varios clientes grcos para manejar tu copia local de subversion para KDE. Entre
los ms conocidos encontramos:
kdesvn Es una interfaz para subversion y, a diferencia de otras herramientas, utiliza directamente un API en C desarrollado por Rapid SVN, por lo que no revisa la salida del
cliente de subversion svn, sino que implementa un cliente de subversion.
ksvn Es una extensin para Konqueror que le permite manejar copias de trabajo de subversion.

8.1.2.

Introduccin a subversion
subversion, CVS y otros sistemas de control de versiones utilizan un modelo conocido como
copiar-modicar-intercalar. En este modelo, cada cliente de usuario contacta al repositorio central
y crea una copia de trabajo, que es un reejo de los archivos y directorios en el repositorio central.
Los usuarios trabajan en paralelo, modicando sus copias privadas y, nalmente, intercalan sus
copias en una versin nal nueva. El sistema de control usualmente asiste el proceso de intercalado,
pero al nal del da es un humano el encargado de que esto ocurra correctamente.
Existen otros modelos ms sencillos en el papel, pero con grandes desventajas a largo plazo. El
modelo de copiar-modicar-intercalar puede sonar un tanto catico, pero en la prctica funciona
muy bien. Incrementa la productividad, ya que los usuarios pueden trabajar en paralelo, sin esperar
a los otros. Cuando trabajan en los mismos archivos, en general, los cambios no se enciman y los
conictos son poco frecuentes y toma poco tiempo arreglarlos.
A continuacin te daremos una gua del ciclo usual de desarrollo cuando utilizas un sistema de
control de versiones.

Tu copia de trabajo
Usualmente comienzas a utilizar subversion haciendo una copia local del proyecto (checkout).
Esta copia contiene la ltima revisin de subversion, llamada HEAD.Obtienesd ls copia con una
lnea como sta:

258

Herramientas para desarrollo


% svn checkout http://svn.collab.net/repos/svn/trunk
Obviamente la liga cambia para reejar el repositorio de tu proyecto y existen diversos protocolos para especicarlo. Puede ser va http, como en el ejemplo, o va el sistema de archivos local
o a travs de ssh. En este ejemplo, extraemos el directorio trunk del proyecto, que generalmente
incluye todos los archivos y directorios, pero puedes seleccionar rutas ms detalladas para obtener
ciertas partes del proyecto.
Una vez que tienes una copia de trabajo, no tienes nada ms que esperar. Puedes comenzar a
modicar esos archivos y directorios e iniciar el ciclo tpico de trabajo.

Ciclo de trabajo con subversion


subversion tiene muchas caractersticas y opciones, pero en general te encontrars siguiendo el
siguiente ciclo de trabajo:
1. Actualiza tu copia de trabajo:
svn update
2. Realiza algunos cambios:
svn add
svn delete
svn copy
svn move
3. Revisa tus cambios:
svn status
svn diff
svn revert
4. Intercala los cambios de otros con tu copia:
svn update
svn resolved
5. Finalmente, compromete tus cambios al repositorio central. No olvides acompaarlos con un
comentario inteligente.
svn commit
En la tabla 8.1 explicamos qu hacen los comandos ms comunes de subversion:

259

8.2 Emacs
Tabla 8.1 subversion: comandos ms importantes
Comando

Descripcin

svn add

Usualmente agregas directorios y archivos a tu copia local, realizas tu trabajo


de edicin y eventualmente se los presentas a subversion con este comando.

svn update

Con este comando pones tu copia local al da y subversion te avisa de cambios,


uno por lnea. Cada lnea inicia con una letra que te indica algo:
A Un nuevo archivo en tu copia.
U Un archivo no sincronizado en tu copia, pero subversion lo actualiz en ella,
no te preocupes.
D Un archivo fue eliminado de tu copia.
G Una archivo no sincronizado en tu copia, porque t lo editaste en tu copia
local.
C Un archivo no sincronizado en tu copia, pero subversion no puede actualizarlo porque hay conictos que requieren tu intervencin.

svn delete

Si un archivo o directorio ya no sirve, as lo borras y avisas a subversion.

svn copy

Si el nombre de un archivo es desafortunado, con este comando puedes cambiar


el nombre del archivo sin perder su historia.

svn move

Con este comando puedes mover un archivo o directorio a otro lugar en tu copia
local y subversion se encarga de acompaarlo con su historia.

svn status

Te muestra todos los cambios realizados en tu copia local con respecto a la


revisin de la misma.

svn diff

Te muestra las diferencias textuales en uno o varios archivos con respecto a la


revisin de tu copia local.

svn revert

Te permite retroceder a otra versin de un mismo archivo o directorio. Usualmente utilizas este comando cuando quieres descartar los cambios que realizaste
en tu copia local.

svn update

Sincroniza tu copia local con la versin especicada (por omisin, la ms reciente o HEAD) del repositorio central. Este comando requiere que puedas conectarte al servidor de subversion.

svn resolved Una vez que has arreglado un conicto, con este comando se lo indicas a subversion.
svn commit

Una vez que terminas tu trabajo de edicin, has intercalado tus cambios y resuelto los conictos, con este comando le indicas a subversion que integre todos
tus cambios.
Cuando envas tus cambios tienes que acompaarlos de un mensaje que describa
tus cambios. Si lo haces en la lnea de comandos, tienes que agregar la bandera
-m seguida del mensaje entre comillas.

Como ya mencionamos, subversion ofrece una pltora de comandos y opciones ms, pero el
ciclo que hemos presentado es el ms comn.

260

Herramientas para desarrollo

8.2. Emacs
Ya mencionamos que Emacs es un editor para programadores hecho por programadores? En
esta seccin te demostramos por qu esto es cierto, ya que revisaremos uno de los ms sosticados
modos para programar en Java que existen, JDEE, que son siglas en ingls de Java Development
Environment for Emacs .

8.2.1.

JDEE
Aunque hacemos una cobertura parcial de JDEE, esta seccin supone que ests familiarizado
tanto con Emacs como con el lenguaje de programacin Java.
JDEE permite conectar a Emacs con aplicaciones para desarrollo de terceros, tales como las que
provee Sun Microsystems como parte de JDK. El resultado es un ambiente integrado de desarrollo,
tambin conocido como IDE, por sus siglas en ingls. Existen en el mercado muchos IDE comerciales para desarrollar en Java, como Netbeans o Eclipse; JDEE est a la altura de stos. Entre sus
caractersticas ms importantes se encuentran:
Editar cdigo con resaltado de sintaxis y sangras automticas.
Completar de manera automtica campos y mtodos de clases.
Compilar con brincos automticos de mensajes de error a la lnea de cdigo responsable.
Generar esqueletos de clases y mtodos de manera automtica.
Ejecutar aplicaciones java en un buffer de Emacs de manera interactiva.
Integrar un depurador con un buffer para comandos interactivos y desplegar de manera automtica el archivo/lnea mientras recorres el cdigo.
Posibilidad de navegar la documentacin de JDK utilizando el navegador de tu eleccin.
Navegar a travs del cdigo utilizando las herramientas etags de Emacs o bien las estructuras
de rbol provistas por otra extensin de Emacs, speedbar.

Instalando JDEE
$ smart
Antes de poder utilizar JDEE con Emacs debes instalar una serie de extensiones y aplicaciones.
Adems, por supuesto, debes contar en tu sistema con una implementacin de Java; aqu suponemos
install
sun-java5-jdk que ya est instalado JDK.

JDEE no es parte estndar de Emacs y utiliza otras herramientas que no lo son tampoco. Estas
herramientas son:
CEDET: en ingls, Collection of Emacs Development Enviromnent Tools, que es un proyecto que
incluye varios paquetes individuales:
EIEIO - capa CLOS para Emacs Lisp.

261

8.2 Emacs
Semantic - Infraestructura para parsear en Emacs.
Speedbar - Navegador de. . . cualquier cosa.
EDE - Manejador de archivos y generador de Makele.
COGRE - Connected Graph Editor.

Una vez que obtienes e instalas la ltima versin, debes agregar lo siguiente a tu /.emacs:
( l o a d f i l e " ~ / e l i s p / c e d e t / common / c e d e t . e l " )
( s e m a n t i c l o a d e n a b l e codeh e l p e r s )

ELIB: Es una biblioteca estndar para programar en Emacs Lisp. Tiene cdigo para:
Estructuras de datos (colas, pilas, rboles AVL y otras).
Funciones para manejo de cadenas no incluidas en Emacs estndar.
Funciones para manejo del mini-buffer no incluidas en Emacs estndar.
Rutinas para manejar listas de galletas (cookies) en un buffer.
Una vez que obtienes e instalas la ltima versin, debes agregar lo siguiente a tu /.emacs
para que JDEE lo encuentre:
( addt o l i s t

l o a d p a t h ( expandf i l e name " ~ / e l i s p / e l i b " ) )

JDEE: Finalmente estamos listos para JDEE, que sigue una ruta similar a las extensiones anteriores
y debes poner lo siguiente en tu /.emacs
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / j d e / l i s p " ) )
( require jde )

A partir de este momento cada vez que visites un archivo relacionado con un proyecto o programa Java, JDEE proveer sus controles para apoyarte en tu sesin de desarrollo.

Registro y seleccin de JDK


JDEE descansa en herramientas de desarrollo Java que funcionen en la lnea de comandos,
como las que ofrece Sun Microsystems como parte del Java 2 Software Development Kit (SDK),
tambin conocido como Java Development Kit (JDK). As que antes que puedas utilizar JDEE para
compilar, depurar o ejecutar aplicaciones, debes indicarle dnde viven las herramientas adecuadas.
Por omisin JDEE supone que el compilador, depurador y mquina virtual de java se llaman
javac, jdb y java respectivamente y que estn en un directorio de la variable de ambiente PATH. En
la mayora de los sistemas Linux modernos, las instalaciones de Java se localizan en sitios estndar,
por lo que JDEE debe funcionar perfectamente.
En caso de que tengas varias versiones de JDK instaladas y quieras registrarlas, tienes que
realizar los siguientes pasos:
1. M-x customize-variable;
2. teclea jde-jdk-registry;
3. haz click en el botn INS;

262

Herramientas para desarrollo


4. teclea el nmero de versin de JDK y la ruta al directorio donde est instalado;
5. repite este procedimiento para todas las versiones de JDK en tu sistema;
6. haz click en el botn State; y
7. a continuacin selecciona Save for Future Sessions.
A continuacin debes seleccionar un JDK:
1. M-x customize-variable;
2. teclea jde-jdk y vers un buffer con todos los JDK que registraste arriba;
3. haz click en el botn junto a la versin que deseas utilizar;
4. haz click en el botn State;
5. y a continuacin selecciona Save for Future Sessions;
6. selecciona el botn Finish para deshacerte del buffer.

Editando archivos fuente de Java


Para editar un archivo existente con cdigo Java, carga en un buffer de Emacs el archivo con
C-x C-f . Al hacer esto, Emacs asignar el modo jde-mode al buffer de edicin. Este modo
extiende los modos estndar de Emacs: java-mode y cc-mode, agregando una serie de comandos
para compilar, construir, ejecutar y depurar archivos fuente de Java.
Adems de esto, JDEE provee un soporte completo para generar documentacin en formato
HTML para las clases java, a partir de comentarios en el cdigo fuente.
Para insertar el esqueleto de un comentario javadoc para una clase o mtodo en tu programa
fuente, posiciona el punto en la primera lnea del mtodo o clase y ejecuta el comando: C-c C-v j
(jde-javadoc-autodoc-at-line). Por ejemplo, supongamos que tenemos una clase que luce as:
p u b l i c c l a s s MiClase
e x t e n d s M i S u p e r C l a s e i m p l e m e n t s Runnable , j a v a . i o . S e r i a l i z a b l e
{
...

y el punto est justo antes de la palabra reservada public. Cuando ejecutas C-c C-v j , JDEE
insertar lo siguiente:
/
D e s c r i b e c l a s s <code > MiClase < / code > h e r e .

@author <a h r e f =" m a i l t o : J u a n . D o e @ c i e n c i a s . unam . mx" > J u a n Doe < / a >


@version 1 . 0
/
p u b l i c c l a s s MiClase
e x t e n d s M i S u p e r C l a s e i m p l e m e n t s Runnable , j a v a . i o . S e r i a l i z a b l e
{
...

Para generar la documentacin del proyecto actual puedes abrir cualquier archivo fuente del
proyecto y ejecutar M-x jde-javadoc-make, lo que ejecuta el comando javadoc de JDK para
generar la documentacin.

263

8.2 Emacs

Abreviaturas
JDEE te permite utilizar abreviaturas para algunas palabras clave y estructuras de control de
java. A continuacin te mostramos como utilizarlas.
Cuando escribes una de las abreviaturas denidas, seguidas de un espacio en blanco, JDEE las
expande en el buffer, siempre y cuando el modo de abreviaturas est activado. Para activar/desactivar
este modo debes cambiar el valor de la variable jdeenableabbrevmode.
Esta extensin de JDEE est basada en abbrev-mode de Emacs, que es un sistema para generar
abreviaturas generales.
Dentro de las abreviaturas ms comunes encontrars las que tienen que ver con estructuras de
control, por ejemplo, if-then-else. Cuando escribes una de estas abreviaturas seguida de espacio,
JDEE la expande al esqueleto de la estructura de control correspondiente.
Por ejemplo, ife se expande a if () { } else { }. Aqu estn algunas ms de las abreviaturas
predenidas:
Tabla 8.2 JDEE: abreviaturas de estructuras de control
Abreviatura

Enunciado

if

if-then

ife

if-then-else

fori

for (int I=0;I<UL;I++)

foriter

for (Iterator i = c.iterator(); i.hasNext();)

main

main method

tryf

try nally

Completar expresiones, mtodos y campos


Emacs provee comandos para completar expresiones incompletas que funcionan para cualquier
expresin, pero slo si stas existen en un buffer abierto. JDEE provee comandos para completar
comandos y funciona en cualquier mtodo Java o nombre de campo que exista en el jde-globalclasspath.
JDEE ofrece distintos comandos para completar; todos ellos determinan un conjunto de posibilidades para el nombre del campo o mtodo incompleto en el punto. La diferencia entre ellos,
sin embargo, radica en cmo te presentan esas posibilidades. Los comandos se encuentran en la
tabla 8.3.
Por omisin, JDEE utiliza jde-complete-menu. Para seleccionar otra funcin debes asignar el
valor de la funcin deseada a la variable jdecompletefunction.
Adems de ayudarte a completar, JDEE tambin incluye un modo para lograr que la tecla Enter
cierre las llaves al nal de la lnea. Para habilitar este modo debes cambiar el valor de la variable
jde-electric-return-p.

264

Herramientas para desarrollo

Tabla 8.3 JDEE: formas para completar campos y mtodos


Comando

Descripcin

jde-complete

( Cc Cv c ) ste es el comando estndar de JDEE y le deja


la tarea de completar a otro de los comandos para completar.

jde-complete-in-line

( Cc Cv . ). Este comando utiliza la primera opcin que


encuentra para completar. Si hay ms de una opcin, te permite
recorrerlas, cada una de stas sustituye a la anterior en el buffer.

jde-complete-menu

Este comando despliega todas las posibilidades en un men e


introduce al buffer la que t selecciones.

jde-complete-minibuf

Este comando utiliza el mini-buffer para desplegar las posibilidades e introduce al buffer la que t selecciones.

Generacin de cdigo
JDEE provee mecanismos para generacin de cdigo. Los hay de dos tipos: wizards y basados
en patrones. Tambin ofrece comandos para expandir paquetes (jde-import-expand-imports).
Tabla 8.4 JDEE: enunciados import
Enlace

Descripcin

C-c C-v C-z

(jde-import-nd-and-import) genera un enunciado import para la clase


en el punto. Inserta el enunciado en la cabeza del buffer.

C-c C-v z

(jde-import-all) importa todas las clases que son requeridas en el buffer


actual.

Los comandos para importar te permiten convertir un enunciado como:


import java . io .

en los siguientes:
import java . io . BufferedReader ;
import java . io . InputStreamReader ;
import java . io . IOException ;

y viceversa (jde-import-collapse-imports). JDEE adems incluye el comando jde-import-organize


que acumula los enunciados import del buffer en dos bloques, uno que contiene todos los java y
javax y despus de una linea en blanco, todos los dems. Dentro de cada bloque ordena alfabticamente, por ejemplo:

265

8.2 Emacs

import
import
import
import

java . io . InputStreamReader ;
java . u t i l . Hashtable ;
j a v a x . s w i n g . JFrame ;
j a v a x . swing . J P a n e l ;

import jmath . LinearSystem ;


import jmath . Test ;

Finalmente, con jde-import-kill-extra-imports borras los import que no son necesarios.

Tabla 8.5

JDEE incluye adems una serie de generadores de cdigo o wizards, que se muestran en la
tabla 8.5.
JDEE: generadores de cdigo, wizards
Wizard

Descripcin

Sobrecarga de operadores

(jde-wiz-overrided-method). Un mtodo que sobrecarga otro


heredado por la clase donde est el punto.

Interfaz

(jde-wiz-implement-interface). Implementacin de una interfaz en la clase que contiene al punto.

Delegado

Mtodos que delegan tareas a una clase especca.

Clase abstracta

Implementacin de los mtodos heredados de una clase abstracta


por la clase que contiene al punto.

Get/Set

(jde-wiz-get-set-methods) Mtodos get y set para los campos


privados de la clase que contiene al punto.

Existen otras maneras de generar cdigo, como clases patrn vacas, pero stas no tienen un
nico comando asociado y debes ejecutarlas desde el men de JDE. Por ejemplo, para crear un
buffer con una clase pblica genrica de Java, puedes utilizar Files JDE New Class.

Compilando programas Java


Para compilar debes ejecutar C-c C-v C-c (jde-compile), lo que ejecutar el comando
javac en el buffer actual y el resultado aparecer en un nuevo buffer de compilacin.
Si ya exista un buffer de compilacin, el comando reutilizar el buffer; si no, crear uno nuevo.
Por omisin, si no existen errores en la compilacin, JDEE borra el buffer de compilacin dos (2)
segundos despus de terminada la compilacin.
El modo mayor de este buffer es compilation-mode, que te permite moverte rpidamente a la
fuente de cada error, simplemente haciendo click o presionando Enter en el buffer de compilacin.
JDEE utiliza una serie de variables para controlar la manera de compilar tu programa; para
cambiar la forma estndar debes utilizar la secuencia de mens y submens de JDEE: JDE
Options Compile.
Si utilizas JDE Build, entonces JDEE llamar un programa para construir tu aplicacin. Por

266

Herramientas para desarrollo


omisin utiliza el comando make de Linux, pero puedes congurarlo para que utilice la herramienta
de compilacin Ant, del grupo Apache, o una funcin especial que t denas. Las funciones predenidas son: jde-make y jde-ant-build y, para utilizar Ant, utiliza lo siguiente en tu /.emacs:
( s e t q j d e b u i l d f u n c t i o n

( j d e a n t b u i l d ) )

Existen muchas variables para controlar el comportamiento tanto de make, como de Ant, aunque en la mayora de las distribuciones de Linux no debe ser necesario que cambies los valores por
omisin de estas variables.

Ejecucin de aplicacin Java


JDEE te permite ejecutar tus aplicaciones Java desde un subproceso de Emacs. Puedes ejecutar
varias aplicaciones de manera concurrente, pero slo un ejemplar de cada aplicacin en un momento
dado. JDEE te mostrar tanto la salida como el error estndar de tu aplicacin en un buffer de Emacs
y, a travs de estos buffers, puedes interactuar con la aplicacin si sta es interactiva.
Para ejecutar la aplicacin utiliza C-c C-v C-r (jde-run).
Por omisin en JDEE, el comando para ejecutar aplicaciones supone que la clase en el buffer
actual contiene el mtodo main de tu programa. Si ste no es el caso, tienes que indicarle cul es la
clase principal, asignando el nombre adecuado a la variable jderunapplicationclass.
Con la variable jderunworkingdirectory puedes indicarle un directorio distinto al actual para
ejecutar tu aplicacin.

Navegando excepciones
Si ocurren excepciones durante la ejecucin de tu programa, la mquina virtual entrega como
salida un registro de excepcin. Este registro aparece en el buffer de ejecucin. Para ver la lnea de
cdigo correspondiente a un punto en el registro de excepcin, puedes hacerlo con el botn derecho
del ratn.
Para navegar el registro de excepcin hay dos combinaciones de teclas: C-c C-v C-[ y C-c C-v C-] .
JDEE ofrece un excelente soporte para trabajar con applets, pero por razones de espacio no lo
cubriremos en este libro.

Depurando aplicaciones
JDEE ofrece dos opciones para depurar aplicaciones Java:
Una interfaz en Emacs para jdb, el depurador en lnea de comandos que se distribuye con JDK.
JDEbug, un depurador desarrollado especcamente para ser utilizado con JDE.
JDEbug ofrece mejores caractersticas para depurar, pero requiere JDK 1.2 o ms reciente, por
lo que si tu aplicacin utiliza una versin anterior, slo podrs utilizar jdb. En este trabajo revisamos
exclusivamente JDEbug.
JDEbug te permite ejecutar un programa Java paso por paso y despliega y modica el estado
interno del programa. Entre sus caractersticas principales contamos:

267

8.2 Emacs

Depuracin a nivel de fuente. JDEbug mantiene un apuntador a la linea de cdigo que se est
ejecutando conforme avanzas. Te permite adems asignar puntos de evaluacin en los buffers
fuente.
Despliega de manera automticas el valor de las variables.
Navegador de objetos. Puedes expandir el despliegue de la variable local para mostrar los
campos del objeto a cualquier nivel de profundidad.
Te permite navegar la pila de ejecucin.
Puedes depurar varios procesos simultneamente en la misma sesin.
Evaluacin de expresiones. Puedes evaluar cualquier expresin que sea vlida en el punto
actual de suspensin.
Por omisin JDEE est congurado para ofrecerte una interfaz de jdb, por lo que debes indicarle
que deseas utilizar JDEbug. Esto lo logramos asignando el valor JDEbug a la variable jdedebugger:
( s e t q j d e d e b u g g e r

( " \ command{ JDEbug } " ) )

JDEbug se apoya en la biblioteca JPDA, que en Linux se distribuye como parte de JDK, por lo
que no es necesario hacer nada ms.

Iniciando el depurador
Para iniciar el depurador selecciona Processes Debugger del men de JDEbug, con lo
que se inicia la ejecucin del depurador. Para depurar una aplicacin debes:
Iniciar la aplicacin dentro del depurador. Adelante te decimos cmo.
Aadir el depurador a tu aplicacin si es que sta fue ejecutada fuera del depurador.
Poner el depurador en modo de escucha e iniciar la aplicacin fuera de ste.
Es muy importante que cuando hayas terminado de utilizar el depurador, termines su ejecucin seleccionando Exit Debugger del men JDEbug. De otra manera, aun cuando termines la
ejecucin de Emacs, pueden quedarse procesos (mquinas virtuales) hurfanos ejecutados por el
depurador.

Iniciando procesos
JDEbug provee dos comandos para iniciar procesos:
1. JDEbug Processes Launch Process, que ejecuta un ejemplar de la aplicacin sealada por jde-run-application-class y, en caso de que su valor sea nil , la aplicacin correspondiente a la del buffer actual de java.
2. JDE Debug App; este comando realiza las siguientes acciones:
a)
b)
c)
d)

Inicia el depurador de ser necesario.


Lanza la aplicacin.
Asigna todos los puntos de revisin que hayas especicado con anterioridad.
Ejecuta la aplicacin.

268

Herramientas para desarrollo


Nota: si no asignaste ningn punto de revisin, la aplicacin ser ejecutada sin interrupcin
hasta terminar.
Cualquiera de estos comandos que ejecutes, dividir la pantalla de Emacs en dos y desplegar
una nueva ventana para las variables locales.
La pantalla superior de Emacs muestra el cdigo fuente, la siguiente muestra el buffer fuente o
el archivo donde pusiste puntos de revisin y, nalmente, la ventana del fondo muestra los mensajes
del depurador para el proceso recin lanzado.
En este momento, si el proceso fu iniciado exitosamente y no se se ha ejecutado hasta terminar,
puedes depurar la aplicacin.

8.2.2. psvn

8.1 PCL-CVS frente para CVS

Otro modo muy importante para controlar versiones es PCL-CVS, que es parte estndar de
Emacs. Este modo sirve como frente para manejar proyectos a travs de CVS.
CVS es el sistema controlador de versiones por omisin. Fue uno de los primeros sistemas
utilizados y, probablemente, aun hoy da sea el ms utilizado en el mundo del software
libre. Sin embargo, en nuestra opinin, subversion es un sistema ms verstil y tiene varias
ventajas sobre CVS.
Este sistema es una interfaz para el control de versiones subversion (ver la seccin 8.1.1); sin
embargo, psvn.el no es parte estndar de Emacs por lo que tienes que descargarlo e instalarlo,
siguiendo las instrucciones en la seccin 4.3.18 y agregar lo siguiente a tu /.emacs:
( r e q u i r e psvn )

Tabla 8.6

Una vez cargado el programa, puedes ejecutarlo con M-x svn-status; te preguntar en el minibuffer por el directorio con tu copia de trabajo. Por omisin te mostrar el directorio del archivo
actual. Este comando ejecuta svn status en el directorio que tecleaste y te muestra un buffer con
el resultado que, como notars, se parece mucho a la salida del comando en una terminal, pero a
diferencia de sta, en este buffer cuentas con una serie de enlaces de teclas para ejecutar rpida y
cmodamente comandos de subversion.
Emacs: comandos de psvn
Enlace

Descripcin

, p , C-p

(svn-status-previous-line) Te lleva a la lnea anterior.

, n , C-n

(svn-status-next-line) Te lleva a la siguiente lnea.


Contina en la siguiente pgina

269

8.2 Emacs
Tabla 8.6

Emacs: comandos de psvn

Contina de la pgina anterior

Enlace

Descripcin

Enter

(svn-status-nd-le-or-examin-directory) Abre el archivo (directorio) en la


lnea actual.

(svn-status-update-buffer) Actualiza la vista en el buffer con respecto a tu


revisin local.

(svn-status-update-cmd Ejecuta svn update en el directorio actual.

(svn-status-add-le) Aade el archivo al repositorio.

(svn-status-mv) Ejecuta el comando svn move en el archivo (directorio) actual.

(svn-status-rm) Ejecuta el comando svn delete en el archivo (directorio) actual.

(svn-status-cp) Ejecuta el comando svn copy en el archivo (directorio) actual.

(svn-status-revert) Ejecuta el comando svn revert en el archivo actual.

(svn-status-show-svn-diff) Ejecuta el comando svn diff del archivo (directorio) actual con la versin de la revisin en tu copia de trabajo.

(svn-status-commit) Compromete el cambio en el archivo (directorio) con el


repositorio actual.

(svn-status-set-user-mark) Pone una marca en el archivo o directorio. Esto


te permite poner marcas a varios archivos y el siguiente comando se ejecutar
sobre todos los archivos marcados. Por ejemplo, aadirlos, borrarlos, comprometer los cambios y otros.

(svn-status-unset-user-mark) Elimina la marca del archivo (directorio) en la


lnea actual.

Extendiendo tu
ambiente

La capacidad de extender y acoplar el sistema a tus necesidades es una de las principales caractersticas de UNIX en general. Linux, por supuesto, hereda esta caracterstica y en este captulo
te mostraremos una de las formas ms poderosas de extender tu ambiente con la programacin en
shell.
Tambin te mostramos cmo extender Emacs a travs de su lenguaje de programacin de extensin, Emacs-Lisp. De hecho, la gran mayora de subsistemas y paquetes para extender Emacs que
revisamos en este libro, por ejemplo JDEE (seccin 8.2.1) o ERC ( 5.15.4), son programas escritos
en Emacs-Lisp. Entonces, lo que sucede cuando cargas uno de estos programas en Emacs, es que
ste acta como mquina virtual e interpreta (ejecuta) el programa.

9.1. Programacin en shell


El shell de UNIX cuenta con una caracterstica muy importante que es la capacidad de ser
programado. La programacin del shell se hace por medio de los llamados guiones de shell, los
cuales bsicamente toman una serie de instrucciones y las ejecutan en un nuevo proceso de shell.
Los guiones de shell son archivos que contienen instrucciones para el shell que llevan a cabo una
tarea especca, por ejemplo automatizar la entrega de ciertos correos a un grupo de personas, y en
general se utilizan para automatizar todo tipo de tareas.
En un guin de shell las instrucciones se ejecutan una despus de otra en el orden dado por
el guin. Adems de stas, los guiones de shell tambin pueden recibir parmetros de la misma
manera en que los programas lo hacen, pueden denir variables para guardar ciertos valores que

272

Extendiendo tu ambiente
sean de inters para la ejecucin del programa y cuentan con estructuras de control de ujo, algunas
de las cuales veremos ms adelante.
En un guin de shell tambin podemos tener comentarios, que son mensajes para los que lean el
guin (en particular, nosotros mismos despus de algn tiempo). Los comentarios son ignorados por
el shell al momento de ejecutar, as que no hacen dao y sirven para dar mayor claridad a nuestro
guin de shell. Los comentarios son todo lo que siga al carcter # hasta el n de la lnea.
Los guiones de shell pueden ser ejecutados de manera autnoma simplemente cambiando los
permisos de ejecucin y poniendo un comentario especial en la primera lnea del archivo. Esta lnea
luce algo as #!/ bin /bash y le indica al shell que debe de usar el programa / bin /bash para procesar el
resto del archivo.
A continuacin te mostramos un guin de shell muy sencillo:
#! / usr / bin / bash
echo h o l a ;

Actividad 9.1 Crea un guin de shell que ejecute un ls la, lo redirija a un archivo llamado
listado . dir y despliegue un mensaje al usuario, informndole de la creacin de este archivo; da
permisos de ejecucin y ejectalo un par de veces en directorios distintos.

9.1.1.

Variables
Los guiones de shell utilizan variables como almacenes para ciertos valores, por ejemplo el
mensaje a desplegar o los nombres de los archivos a borrar. Para las variables se utilizan palabras
formadas nicamente de maysculas1 y se les asigna valor por medio del operador =; por ejemplo
MENSAJE="saluditos por la maana"; despus, para usarlas recuperando su valor, precedemos
el nombre de la variable con el carcter $, como en la siguiente lnea:
% echo $MENSAJE
Entonces el programa anterior, usando variables para el mensaje, quedara as:
#! / usr / bin / bash
MENSAJE= h o l a ; e c h o $MENSAJE ;

Actividad 9.2 Modica el guin de shell anterior de manera que uses variables para el mensaje al
usuario as como para el nombre del archivo a donde se dirige la entrada.

9.1.2.

Preparacin
Hasta ahora has aprendido cmo hacer algunos programas sencillos, hechos con base en los
comandos aceptados por el shell estndar de Linux, bash, y conectando la salida de algunos con la
1

Esto es parte de la tradicin; se pueden usar minsculas tambin.

9.1 Programacin en shell

273

entrada de otros. Ahora ests capacitado para emprender labores un poco ms complejas. Aprenders cmo hacer programas ejecutables por bash, ms grandes y que ofrecen servicios ms tiles.
Antes que nada y con vistas a organizar decorosamente tu actividad, debers crear en tu directorio personal un subdirectorio donde puedas guardar todos tus programas ejecutables de uso
frecuente. Esto, adems de la evidente ventaja de organizar tu labor, te proporciona la posibilidad
de incluir este subdirectorio como parte de tu variable de ambiente $PATH. Procedamos en orden.
Lo que tenemos que hacer es:
1. Crear un directorio llamado /bin: cd; mkdir bin.
2. Agregar a nuestra variable $PATH el directorio que acabamos de crear. Esto es, edita el archivo
/.bashrc y agrega al n de la lnea que comienza: PATH=, lo siguiente: :/$HOME/bin.
Ahora todos los programas que hagas y coloques en ese subdirectorio podrn ser llamados desde
cualquier otro directorio en el que ests. El sistema se encargar de ejecutarlos desde tu directorio
bin. Por supuesto todos los programas debern tener permiso de ejecucin (recuerda el uso de
chmod).
Actividad 9.3 Despliega la variable de ambiente $PATH luego de editar el archivo /.bashrc.
Compara el resultado con la que acabas de poner en el archivo. Que ocurri?
En general, todos los programas que elabores en esta seccin debern almacenarse en tu directorio bin.

9.1.3.

Vigilando el espacio en disco


Nuestro primer programa, como todos los que seguirn, estar enfocado a resolver un problema,
a facilitarte la vida de alguna manera. Algo con lo que todo usuario de un sistema compartido debe
aprender a convivir es con los dems usuarios. Todos comparten un mismo disco duro, un mismo
procesador, una misma memoria; es necesario regular el uso de estos recursos para garantizar su
disponibilidad a todos los usuarios. Es por ello que en muchos sistemas de cmputo compartidos
se establecen polticas generales de uso de recursos. Por ejemplo, se establecen cuotas mximas
de uso de disco. Mediante este procedimiento cada usuario del sistema tiene un lmite mximo
de espacio disponible, es decir, la cantidad de informacin guardada en su directorio personal no
deber exceder nunca este lmite; en caso de que se pretenda rebasar el lmite, el sistema lo impide:
es como si el disco duro se hubiese acabado. El usuario se entera de esto porque se le presenta un
mensaje como Disk quota exceeded.
Para que nunca te suceda esta desagradable situacin y se te impida guardar informacin importante, es necesario que mantengas constantemente vigilado el monto de disco que utilizas. Sera
conveniente entonces poseer un listado de cunto espacio de disco ocupa cada uno de tus subdirectorios para que, en caso necesario y tomando en consideracin lo que sea ms relevante, eliminar
informacin que ya no sea necesaria.
Para poder hacer esto necesitas un programa que te permita conocer cunto espacio de disco
ocupa un directorio y te lo reporte en unidades de uso cotidiano. El comando que hace esto en

274

Extendiendo tu ambiente
UNIX es du (disk usage). Puedes saber cuanto espacio ocupa tu directorio actual y cada uno de sus
subdirectorios con el siguiente comando: du -k .2 .
Actividad 9.4 Logra que la salida de du se muestre paginada.
Actividad 9.5 Logra que du reporte slo el tamao del directorio actual, pero sin desglosar por
subdirectorios.
Lo malo de hacer du -k . es que el listado de la cantidad de disco ocupada sale desordenado.
Si tienes muchos subdirectorios no es evidente cules son los que ms espacio ocupan y, por tanto,
a cules deberas prestar ms atencin. Pero afortunadamente existe el comando sort, que permite
ordenar aquello que recibe como entrada. Como has hecho en el pasado, puedes pasar la salida del
comando du como entrada del comando sort y rematar esto pasando la salida de sort como entrada
de more (o less si lo preeres). sort ordena creciente y quisieras (aunque en gustos se rompen
gneros) que la salida fuera ordenada decreciente para que pudieras jarte quizs en los 3, 5 o 10
subdirectorios ms grandes fcilmente; adems, quieres que para ordenar use los valores numricos
entregados por du. Esto ltimo puede parecer evidente pero no lo es. Hay dos maneras de ver un
423: como el nmero 423 o como la secuencia de tres smbolos 423, una cadena de carcteres.
Visto de la primera forma, 423 es mayor que 52; pero desde el segundo punto de vista, la cadena
423 es menor que 52 porque, en orden lexicogrco el 5 est despus del 4.
En sntesis, y agregando algunas lneas explicativas al programa, tienes lo siguiente:
1
2
3
4
5
6
7
8
9

# ! / bin / bash
#
# R e p o r t a e l e s p a c i o en K b y t e s o c u p a d o p o r c a d a
# s u b d i r e c t o r i o d e l d i r e c t o r i o a c t u a l o r d e n a n d o de mayor a
# menor ( o r d e n i n v e r s o p a r a s o r t ) .
#
e c h o " E s p a c i o o c u p a d o en d i s c o ( en K b y t e s ) "
e c h o " p o r e l d i r e c t o r i o a c t u a l : pwd y s u b d i r e c t o r i o s "
du k . | s o r t n r | more

Nota que est entre entre comilla invertida (acento grave, que est en la esquina superior izquierda del teclado, junto al 1) el comando pwd en la segunda lnea de mensaje lnea (8) . Cuando
se pone un comando entre ese tipo de comilla, al momento de ejecutar la lnea que lo contiene se
reemplaza el comando por su salida, es decir la ejecucin de la lnea (8),
echo "por el directorio actual:pwd y subdirectorios,
produce:
por el directorio actual: /home/users/jose y subdirectorios
Actividad 9.6 Haz que el monto de espacio ocupado se despliegue en mega bytes en vez de en kilo
bytes.
Actividad 9.7 Haz que la salida de sort sea en orden creciente y sea posible hacer paginacin.
2

El . se reere al directorio actual.

275

9.1 Programacin en shell

9.1.4.

Listado de directorios
Por supuesto habrs notado que el listado de los elementos de un directorio incluye tanto subdirectorios como archivos y que en dicho listado las entradas aparecen ordenadas alfabticamente.
Esto hace que subdirectorios y archivos aparezcan mezclados en la lista, lo que diculta distinguirlos, sobre todo si tenemos una larga lista. Sera bueno tener un programa que liste slo los
subdirectorios de un directorio dado.
Entonces queremos hacer un programa al que podamos decirle el nombre, o en general, la ruta
de algn directorio y nos muestre en la pantalla un listado del nombre de todos los subdirectorios
que se encuentran contenidos en l. Sera bueno que ese nombre o ruta del directorio pudiera darse
al programa del mismo modo en que se dan los parmetros de entrada de los programas que conocemos, es decir, ponindolos inmediatamente despus del nombre del programa que se quiere ejecutar.
Cuando llamamos a ls por ejemplo, podemos decirle la ruta de algn directorio del que deseamos
ver el listado. Por ejemplo:
% ls /usr/include
te muestra el listado del directorio /usr/include que pusiste junto al nombre del programa.
bash tiene prevista la situacin en la que se dan parmetros de entrada a los programas. En
esencia slo se requiere guardarlos en algn lugar accesible al programa y ponerle nombre a dicho
lugar para poder referirse a lo que est guardado all desde el programa. Adems, el nombre de estos
lugares deber de ser un estndar para que cualquier programador sepa cmo referirse a l. En casa
todos los miembros de la familia pueden acceder a las llaves de la puerta porque estn en un lugar
estndar que todos conocen y al que todos hacen referencia cuando le piden las llaves a alguien ms.
A estos lugares con nombre para almacenar valores se les llama variables. Ya has tenido experiencia
con variables de ambiente (como PATH) y ahora estamos hablando de las variables de tus programas
(en particular las variables de ambiente son variables de tus programas).
Pues bien, existen ciertas variables que existen siempre automticamente en todos los programas
en shell y que se reeren a los parmetros de entrada de un programa:

Tabla 9.1

Programacin en shell: variables automticas


Variable

Descripcin

$0, $1, $2, ..., $n

$0 es el nombre del programa mismo que invocaste, es decir, lo primero que pones en la lnea de llamada. $1 es el
primer parmetro que se pone luego del nombre del programa (v.gr.. en ls -l, -l sera $1). Anlogamente $2, . . . , $n
son los siguientes parmetros.

$#

es el nmero de parmetros que pones frente al nombre del


programa, es decir no se cuenta $0.
Contina en la siguiente pgina

276

Extendiendo tu ambiente

Tabla 9.1

Programacin en shell: variables automticas

Contina de la pgina anterior

Variable

Descripcin

$?

es el resultado del ltimo comando ejecutado. Todos los


programas que se ejecutan pueden regresar un resultado;
ms adelante abordaremos el tema.

Nota adems que existe un medio para contar cuntos parmetros de entrada se le dieron a un
programa. Basta con observar el valor que posea la variable $# para saber cuntas palabras (separadas por espacios) se dieron frente al nombre del programa cuando ste fue llamado a ejecutarse.
En nuestro programa requeriremos saber cuntos parmetros de entrada se dieron; si existe
algn parmetro, se debe ser la ruta de acceso al directorio del que se desea conocer el listado
de subdirectorios. Llamemos a este directorio el directorio objetivo. Si no existe parmetro alguno
entonces supondremos que el directorio objetivo es el actual. En caso de que s exista el parmetro,
entonces deberemos cambiarnos al directorio objetivo especicado por dicho parmetro y listar slo
el nombre de sus subdirectorios.
Es decir, el esquema general de lo que debemos hacer es el siguiente:
1 Si se dio l a r u t a del d i r e c t o r i o o b j e t i v o
2
n o s cambiamos a e s e d i r e c t o r i o .
3 S i no ,
4
no n o s movemos .
5 Ya p a r a d o s en e l d i r e c t o r i o o b j e t i v o , p a r a c a d a e n t r a d a d e l l i s t a d o
6
de d i r e c t o r i o
7
S i l a e n t r a d a e s e l nombre de un s u b d i r e c t o r i o ,
8
l a mostramos .
9
S i no ,
10
nos v a l e .

Nta que en las lneas 1 y 7 debes tomar decisiones, debes ser capaz de preguntar si algo ocurre
o no. Esto lo puedes hacer en bash usando la construccin:
i f [ c o n d i c i n ]
then
# i n s t r u c c i o n e s que s e e j e c u t a n s i l a c o n d i c i n e s v e r d a d e r a
else
# i n s t r u c c i o n e s que s e e j e c u t a n s i l a c o n d i c i n e s f a l s a
fi

Existen dos maneras de escribir la condicin, una es ponindola entre corchetes ([ y ]) y la


otra usando explcitamente el comando test3 . test d <algo> pregunta si <algo> es un subdirectorio;
si en vez de d se pone f entonces pregunta si <algo> es un archivo ( le ).
3

En realidad [ condicin ] es una manera implcita de usar el comando test .

9.1 Programacin en shell

277

Adems debemos hacer algo para cada entrada del listado de directorio, como dice nuestro
esquema general. Esto es posible usando la construccin for del shell (ver man bash):
f o r < v a r i a b l e de n d i c e > i n < c o n j u n t o de v a l o r e s >
do
# i n s t r u c c i o n e s que hay que r e p e t i r
done

Esto hace que las instrucciones entre el do y el done se repitan tantas veces como elementos
tenga el conjunto especicado a continuacin de la palabra in. En esencia, lo que hace el for es
ponerle a la variable de ndice el primer valor de la lista, luego ejecutar las instrucciones a repetir,
cambiar el valor de la variable de ndice ponindole el segundo del conjunto y repetir las instrucciones; y as sucesivamente hasta que la variable adquiera el ltimo valor del conjunto; sa ser la
ltima vez que se ejecuta el ciclo.
A continuacin se muestra el cdigo del programa que queremos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# ! / bin / bash
#
# E n t r e g a un l i s t a d o de a q u e l l a s e n t r a d a s d e l d i r e c t o r i o que
# son s u b d i r e c t o r i o s .
#
# S i hubo un p a r m e t r o en l a l i n e a de comandos
# e s e l d i r e c t o r i o d e l que d e s e a m o s l o s s u b d i r s .
i f [ $# ne 0 ] ; t h e n
cd $1
fi
# s i no , q u e r e m o s e l l i s t a d o d e l d i r e c t o r i o a c t u a l
e c h o " S u b d i r e c t o r i o s en pwd "
f o r i i n l s aA ; do
i f t e s t d $ i ; t h e n
l s l d $ i
fi
done

Actividad 9.8 Por qu se le puso la opcin d al comando ls (lnea 15)?


Actividad 9.9 Por qu se le pusieron las opciones aA al comando ls (lnea 13)?
Actividad 9.10 Para qu sirven las lneas 1317?
Actividad 9.11 Analiza la lnea 8 del programa. Qu ocurre si el usuario, tontamente, da ms
de un parmetro? Como haras para restringir ms, si es posible, la entrada? (sugerencia: man
test).

278

9.1.5.

Extendiendo tu ambiente

Recorridos recursivos

El problema de borrar basura: planteamiento


Ya sabes cmo hacer para conocer el espacio en disco que ocupas en tu directorio personal.
Esto te provee de un medio para saber cules de tus subdirectorios son ms grandes, lo que puedes
usar como un criterio para decidir qu borrar o comprimir y qu no, con el n de reducir el espacio
ocupado.
Pero si meditas un poco en el proceso que debers llevar a cabo para depurar tu directorio,
te dars cuenta de que puede no ser agradable. Habra que navegar por todos los subdirectorios
buscando archivos intiles y borrndolos, teniendo cuidado de no borrar los que no debes.
Es posible establecer criterios generales, basados en los nombres de los archivos, para decidir
qu borrar y qu no. Ya conoces, por ejemplo, los archivos de respaldo de Emacs, esos que terminan
con y que suelen ser muy tiles cuando an no se obtiene la versin nal de un archivo que est
en proceso de edicin, pero que una vez que dicha versin nal se ha obtenido dejan de serlo. Con
frecuencia, archivos como stos se quedan por all ocupando espacio innecesariamente. Hay otros
casos similares como los archivos de bitcora (.log) o auxiliares (.aux) que son generados por TEXy
LATEX.
Podras pensar entonces en hacer un programa que descienda por todo el rbol de tu directorio
personal eliminando todos los archivos que satisfagan los criterios establecidos en su nombre. Eso
automatizara en buena medida el proceso de depuracin de espacio y reduce signicativamente la
probabilidad de que te equivoques borrando algo que no queras borrar (por supuesto que pueden seguir ocurriendo errores indeseables: si en algn momento deseas conservar un archivo cuyo nombre
cumple con los criterios de borrado, debers cambiarle de nombre para no borrarlo accidentalmente
en el futuro).

El patrn de descenso
Para resolver el problema que te ocupa tienes que ser capaz, primero, de poder descender por un
directorio y todos sus subdirectorios. Cmo haces esto? Conceptualmente hablando, lo que quieres
es:
1. Haces lo que deseas hacer en el directorio actual (lo que quieres hacer aun cuando ste sea el
nico directorio presente).
2. Te jas en cada entrada del listado del directorio.
3. Si la entrada corresponde a un subdirectorio te introduces a l y haces lo mismo que estabas
haciendo en el nivel anterior (haces lo que deseas. . . jarte en cada entrada. . . ).
4. Si le entrada no es un directorio quizs haces algo ms con ella.
5. Cuando terminas con cada una de las entradas del directorio sales al directorio inmediato
anterior.
El paso nmero 2 signica que haces exactamente lo mismo que estabas haciendo en el directorio superior; es decir, ejecutas cada una de las acciones que estabas llevando a cabo, en el mismo
orden; esto es, ejecutas el mismo programa. Cuando un programa, como parte de sus instruccio-

9.1 Programacin en shell

279

nes, ordena la ejecucin de s mismo, el programa recibe el apelativo de recursivo. Imagina que tu
programa se llama paseo_rec. Entonces el esquema general de lo que quieres hacer es algo as:
1
2
3
4
5
6
7
8

Hacemos l o que d e s e a m o s h a c e r , e l o b j e t i v o de n u e s t r o p r o g r a m a
Para cada e n t r a d a del d i r e c t o r i o
S i l a e n t r a d a e s un s u b d i r e c t o r i o
Entramos a l s u b d i r e c t o r i o
Ejecutamos paseo_rec a p a r t i r del d i r e c t o r i o a c t u a l
Salimos del d i r e c t o r i o a l inmediato s u p e r i o r
S i no e s un s u b d i r e c t o r i o
Decimos s u nombre

Deseamos repetir al proceso de las lneas 3 a 8 para cada entrada del directorio. Esto se dice
for i in ls es decir para cada elemento del listado producido por el comando ls. Dado que ls

entrega una por una las entradas del directorio, esa i que usas sirve para referirse, uno por uno, a
cada elemento del listado de directorio. Entonces, una vez que ests parados en la entrada i del
directorio, puedes preguntar si esa i corresponde a un subdirectorio o a un archivo. Esto es posible
hacerlo con los comandos if y test, tal como lo hiciste en el programa que lista directorios. As:
1
2
3
4
5
6
7
8
9
10
11
12

# ! / bin / bash
# P r o g r a m a r e c u r s i v o p a r a b a j a r p o r t o d o un r b o l de d i r e c t o r i o s
e c h o " D i r e c t o r i o a c t u a l : " pwd
f o r i i n l s ; do
# Para cada e n t r a d a del d i r e c t o r i o
i f t e s t d $ i ; t h e n # s i l a e n t r a d a e s de un d i r e c t o r i o
cd $ i
# n o s cambiamos a s t e
$HOME/ b i n / p a s e o _ r e c # Llamada r e c u r s i v a
cd . .
e l i f t e s t f $ i ; t h e n # s i no , s i e s un a r c h i v o
echo " a r c h i v o : $ i "
fi
done

El problema de borrar la basura revisitado


Ahora puedes usarlo para tus nes, hacer un programa que borre todos los archivos que terminen
con: , aux o log. Como realmente no te interesa hacer algo con las entradas del directorio que no
son directorios, eliminas el trozo de cdigo de las lneas911 y en vez de la lnea 4 pondrs tambin
las lneas que necesitas para eliminar los archivos. El resultado es el cdigo que se encuentra en
el listado 9.1 de la siguiente pgina se est suponiendo que el archivo donde este programa se
encuentra se llama borramugres.rec.
Nota que en la lnea 14 se llama al programa borramugres.rec, que se supone se encuentra en
el subdirectorio bin del directorio personal del usuario; as que si cambias el nombre del programa
o su ubicacin debers modicar esa lnea para que pueda encontrarse a s mismo.

280

Extendiendo tu ambiente
Actividad 9.12 Modica el programa para que pregunte si realmente desea borrar cada archivo
de respaldo de Emacs, (sugerencia: man rm).

Cdigo 9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Borrado recursivo de basura


# ! / bin / bash
# Programa r e c u r s i v o p a r a b o r r a r b a s u r a
#
e c h o " D i r e c t o r i o a c t u a l : " pwd
rm f . l o g
rm f . aux
rm f ~
rm f . ~
for i in ls
# Para cada e n t r a d a del d i r e c t o r i o
do
i f t e s t d $ i # s i l a e n t r a d a e s de un d i r e c t o r i o
then
cd $ i
# entra al directorio
$HOME/ b i n / b o r r a m u g r e s . r e c
cd . .
fi
done

Un grep recursivo
Ya conoces el programa grep que te permite, en particular, buscar presencias de una cadena
cualquiera en conjuntos de archivos. En muchas situaciones es deseable conocer no slo en cules archivos de un directorio aparece la cadena, sino en cules archivos de sus subdirectorios, en
cules de los subdirectorios de stos y as sucesivamente. Es simple pensar en una situacin as;
por ejemplo, si quisieras saber cuntos y cules de los archivos contenidos en un directorio o sus
subdirectorios son programas para bash podras buscar la cadena /bin/bash en todos los archivos.
Lo que quieres es hacer un grep recursivo que busque una cadena en todos y cada uno de los
archivos contenidos en un directorio y sus subdirectorios. Tienes que hacer que tu grep recursivo (al
que llamaremos rgrep) busque la cadena deseada en todos los archivos del directorio actual y luego
proceda a la manera de paseo_rec, metindose a cada subdirectorio que se encuentra y llamndose
a s mismo. Cuando la entrada del directorio sea un archivo no haces nada, como puedes ver en el
listado 9.2 de la siguiente pgina.
Actividad 9.13 Qu signican las opciones Hns de grep que se usan en rgrep en la lnea 11?

9.1 Programacin en shell


Cdigo 9.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

281

grep recursivo
# ! / bin / bash
#
# Hace un g r e p r e c u r s i v o a mano ( e s d e c i r emulando
# e g r e p r ) . Como h a c an l o s hombres de mi p o c a .
#
#
i f [ $# ne 1 ]
then
e x i t 1
fi
g r e p Hns $1 | more
for i in ls
do
i f t e s t d $ i
then
cd $ i
echo ""
e c h o " e s t o y en " pwd
$HOME/ b i n / r g r e p $1
cd . .
fi
done

Actividad 9.14 Qu signica la opcin -r de grep (o mejor dicho de egrep, que ocup el lugar
del antiguo grep)?

Cambiando permisos, propietario y grupo


recursivamente
Podras utilizar tambin el esquema general de programa recursivo para mejorarlo, ahora haciendo otra labor: la de cambiar permisos, propietario y grupo de todos los archivos de un directorio
y sus subdirectorios.
Quieres un programa, llamado chmogr, que reciba como parmetros de entrada en la lnea de
llamada:
1. los permisos,
2. el propietario y
3. el grupo,
que quieres poner a todos los archivos y subdirectorios a partir del directorio actual.
Ya sabes usar los comandos chmod, chown y chgrp que son en los que nos apoyaremos para
realizar nuestra labor. Pero hay algo adicional que considerar: no es posible entrar a un subdirectorio
si ste no posee permiso de ejecucin (curioso no?). As que en tu programa debes tener esto en
cuenta y asegurarte de poder entrar a todos los subdirectorios ponindoles permiso de ejecucin.

282

Extendiendo tu ambiente
Seguramente ya has usado varias veces el comando ls con la opcin -l y habrs visto la salida
que produce. A diferencia de ls a secas, ls -l despliega una lnea por cada archivo. Si observas
esta salida, en el extremo izquierdo de cada archivo estn los permisos de acceso del mismo. En
la seccin 3.2.1 revisamos con detalle el sistema de permisos de UNIX y aqu vas a utilizar esta
informacin para acceder a cada subdirectorio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# ! / bin / bash
#
# Programa p a r a cambiar permisos , e l p r o p i e t a r i o y e l
# g r u p o de t o d o s l o s a r c h i v o s y d i r e c t o r i o s r e c u r s i v a m e n t e
#
i f [ $# eq 3 ]
then
for i in ls
do
i f t e s t d $ i
then
chown $2 $ i
c h g r p $3 $ i
# l e ponemos p e r m i s o de e n t r a r t e m p o r a l m e n t e
chmod +x $ i
cd $ i
e c h o " D i r e c t o r i o a c t u a l : " pwd
# OJO aqu s e pone l a r u t a c o m p l e t a a b s o l u t a
# para a c c e d e r a e s t e programa
$HOME/ b i n / chmogr $1 $2 $3
cd . .
# l e ponemos l o s p e r m i s o s que n o s d i j e r o n
chmod $1 $ i
e l i f t e s t f $ i
then
echo "
A r c h i v o : "$ i
chown $2 $ i
chmod $1 $ i
c h g r p $3 $ i
fi
done
else
e c h o "USO : $0 [ perm ] [ p r o p ] [ g r u p o ] "
e c h o " Cambia p e r m i s o s , p r o p i e t a r i o y g r u p o r e c u r s i v a m e n t e "
e c h o " J o s + \ e+ G a l a v + \ i + , F a c u l t a d de C i e n c i a s , UNAM. "
fi

9.1 Programacin en shell

283

Actividad 9.15 El programa recursivo de cambio de permisos propietario y grupo fue hecho hace
mucho cuando an no existan ciertas extensiones de los comandos tradicionales chown, chmod
y chgrp. Cmo haras actualmente un programa con la misma funcionalidad pero ms sencillo?
(sugerencia: man chown)

Actividad 9.16 Elabora, a partir de paseo_rec, un programa que actualice la fecha y hora de
cada archivo descendiendo recursivamente por los subdirectorios a partir de la posicin actual.
(Sugerencia: man touch).

9.1.6.

Comparando archivos
Frecuentemente posees diferentes versiones de tus archivos, por ejemplo diferentes versiones
del mismo programa con el mismo nombre. Posiblemente, haya directorios completos cuyos archivos estn duplicados o son versiones diferentes de los contenidos en otro. En estas circunstancias
sera bueno poder saber si los archivos de un directorio son, de hecho, diferentes de los que tienen
el mismo nombre, contenidos en otro directorio.
En UNIX existe un comando para saber si dos archivos son diferentes: diff. Usaremos este
comando para hacer un programa en shell que te indique cuntos y cules archivos son diferentes
y cules no. Para poder contar necesitars poseer contadores que puedas ir incrementando cada vez
que te percates de que un archivo es diferente de su anlogo o cada vez que son iguales. Para ello
puedes usar el comando let de bash que permite evaluar expresiones aritmticas. Adems para que
te puedas percatar de la igualdad o diferencia de dos archivos necesitars saber cul es el resultado
entregado por diff.
diff, como casi todos los comandos ejecutables en el shell, regresa un valor resultado de su
ejecucin. Es posible atrapar este resultado para poder tomar la decisin de incrementar el contador
de archivos iguales o el de archivos diferentes. Ya antes mencionamos la variable $? que entrega el
resultado del ltimo comando ejecutado, as que sa ser la manera de conocer el valor entregado
por diff. diff entrega un cero si los archivos que se le encomend comparar resultan ser iguales, uno
si son diferentes y dos si no se pudo efectuar la comparacin por algn motivo. En el listado 9.3 en
la siguiente pginaa se muestra el cdigo del programa que deseas.
En las lneas 68 se establece el valor inicial de los contadores IGUAL, DIFER y CONTADOR
que nos permiten contar archivos iguales, diferentes y el total respectivamente. En la lnea 23 se
pregunta si el valor entregado por diff es cero, en cuyo caso incrementamos el valor del contador
IGUAL en uno (lnea 25) usando let. De no ser iguales los archivos (lo que signica que o bien
son diferentes o no se pudieron comparar), entonces incrementamos el contador DIFER y siempre
incrementamos CONTADOR, el que cuenta todos los archivos.

Actividad 9.17 Qu signican las opciones qs de diff en la lnea 22?

284

Extendiendo tu ambiente

Cdigo 9.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Usando el resultado que entrega diff


# ! / bin / bash
#
# Programa p a r a comparar t o d o s l o s l o s a r c h i v o s d e l
# d i r e c t o r i o a c t u a l con l o s de o t r o d i r e c t o r i o
#
CONTADOR=0
DIFER=0
IGUAL=0
i f [ $# ne 1 ]
then
e c h o " u s o : $0 < d i r e c t o r i o >"
e c h o " Se comparan uno a uno l o s a r c h i v o s d e l d i r e c t o r i o "
e c h o " a c t u a l con l o s d e l d i r e c t o r i o e s p e c i f i c a d o "
else
e c h o " Comparando l o s a r c h i v o s en pwd "
e c h o " con l o s de $1 . . . "
echo ""
for i in ls
do
i f [ f $ i ]
then
d i f f q s $ i $ 1 / $ i
i f [ $? eq 0 ]
then
l e t IGUAL=IGUAL+1
else
l e t DIFER=DIFER+1
fi
l e t CONTADOR=CONTADOR+1
fi
done
echo ""
e c h o "$CONTADOR a r c h i v o s c o m p a r a d o s "
e c h o "$IGUAL i g u a l e s "
e c h o "$DIFER d i f e r e n t e s o i n c o m p a r a b l e s "
fi

Actividad 9.18 Qu recibe como parmetro de entrada el programa?


Actividad 9.19 Qu ocurre con el programa cuando hay un archivo en el directorio actual que
no existe en el otro directorio?

9.1 Programacin en shell

285

Actividad 9.20 Modica el programa para que, en caso de que los archivos sean diferentes diga
cul es ms reciente (sugerencia: man test).

9.1.7.

Otra vez el problema de borrar la basura


Has hecho ya un programa recursivo basado en paseo_rec que elimina archivos innecesarios
a partir de un directorio dado. Pero ahora tienes muchos ms elementos para poder hacer una nueva
versin, mejorada, del programa. Es de notar que el problema esencial del programa es la manera de
encontrar los archivos intiles; esto lo haces con el descenso recursivo por el rbol de directorios,
pero hay otra manera de hacerlo sin necesidad de descender por todo el rbol a pie. Existe un
programa que se encarga de encontrar archivos que cumplan con ciertas caractersticas. nd nos
permite encontrar archivos con caractersticas comunes, localizados a partir de cierta ruta especca
(es decir, a partir de cierto directorio); tambin se le dice a nd qu hacer cada vez que se encuentre
algn archivo que cumpla con las caractersticas especicadas, por ejemplo, desplegar el nombre
del archivo. Si nd te puede regresar un conjunto de archivos tales que su nombre cumpla con
la caracterstica de terminar con , por ejemplo, estars en el camino correcto. Bastara entonces
borrar cada archivo de ese conjunto para eliminar los respaldos de Emacs, por ejemplo.
El siguiente programa automatiza el proceso de borrar la basura y adems genera un informe
detallado de su actividad, registrndola en un archivo de tu directorio personal. Es de notar que, a
diferencia de la versin anterior que borraba basura, este programa no borra la basura a partir del
directorio actual, sino que lo hace a partir de tu directorio $HOME. En este programa se hace uso
de nd de la siguiente forma:
% /usr/bin/nd . -name "core" -print
Los parmetros con los cules est siendo ejecutado signican:

. El primer parmetro de nd es . (punto), busca a partir del directorio actual, previamente el


programa se cambia al directorio del usuario.
-name Encuentra archivos cuyo nombre coincida con el patrn que se establece a continuacin. Es
posible tambin establecer condiciones que no tengan que ver con el nombre del archivo sino
con otras caractersticas, por ejemplo su fecha de ltimo acceso, lo que permitira eliminar
archivos viejos.
core Archivos que se llamen core en este ejemplo; en otros casos de este mismo programa se
buscan aquellos que cumplan con el patrn *, por ejemplo, lo que signica los que terminan
con tilde (respaldos de Emacs).
-print Este ltimo parmetro le indica a nd qu hacer con el archivo que encuentre; en este
caso -print signica imprime su nombre.

286

Extendiendo tu ambiente

Cdigo 9.4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

Borrado de archivos usando nd


# ! / bin / bash
#
# Programa p a r a b o r r a r l a b a s u r a d e l d i r e c t o r i o d e l u s u a r i o
#
cd $HOME
e c h o " L i m p i a n d o pwd . . . "
FECHA= d a t e + %d %m%y
echo date
rm r f I n f o r m e .
e c h o " S a l v a n d o e s t a d o a c t u a l de e s p a c i o o c u p a d o . . . "
e c h o " A r c h i v o : I n f o r m e . $FECHA"
/ u s r / b i n / du k s . > " I n f o r m e . $FECHA"
/ u s r / b i n / du k s .
e c h o " B o r r a d o c a c h e de N e t s c a p e y T r a s h " >> I n f o r m e . $FECHA
e c h o " L i m p i a n d o c a c h e de n e t s c a p e . . . "
rm r f $HOME / . n e t s c a p e / c a c h e
mkdir
$HOME / . n e t s c a p e / c a c h e
e c h o " L i m p i a n d o e l b o t e de b a s u r a . . . "
rm r f $HOME/ D e s k t o p / T r a s h
mkdir
$HOME/ D e s k t o p / T r a s h
e c h o "ARCHIVOS BORRADOS">> I n f o r m e . $FECHA
# cores
echo " Borrando c o r e s . . . "
f o r i i n / u s r / b i n / f i n d . name " c o r e " p r i n t
do
rm f $ i
e c h o $ i >> $HOME/ I n f o r m e . $FECHA
done
# r e s p a l d o s de Emacs
e c h o " B o r r a n d o r e s p a l d o s de Emacs . . . "
f o r i i n / u s r / b i n / f i n d . name " ~ " p r i n t
do
rm f $ i
e c h o $ i >> $HOME/ I n f o r m e . $FECHA
done
f o r i i n / u s r / b i n / f i n d . name " . ~ " p r i n t
do
rm f $ i
e c h o $ i >> $HOME/ I n f o r m e . $FECHA
done

(1/2)

9.1 Programacin en shell

287

Cdigo 9.4

(2/2)

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

Borrado de archivos usando nd


# a r c h i v o s a u x i l i a r e s y de b i t c o r a de TeX y LaTeX
e c h o " B o r r a n d o a r c h i v o s a u x i l i a r e s de TeX y LaTeX . . . "
f o r i i n / u s r / b i n / f i n d . name " . l o g " p r i n t
do
rm f $ i
e c h o $ i >> $HOME/ I n f o r m e . $FECHA
done
f o r i i n / u s r / b i n / f i n d . name " . aux " p r i n t
do
rm f $ i
e c h o $ i >> $HOME/ I n f o r m e . $FECHA
done
e c h o " S a l v a n d o e l nuevo e s t a d o a c t u a l de e s p a c i o o c u p a d o . . . "
e c h o " E s p a c i o a c t u a l :" > > I n f o r m e . $FECHA
/ u s r / b i n / du k s . >> " I n f o r m e . $FECHA"
/ u s r / b i n / du k s .
e c h o " E l d i r e c t o r i o pwd ha s i d o l i m p i a d o . "
echo ""

Este programa entrega una lista de tu espacio ocupado antes y despus de la limpieza, y una
lista de los archivos eliminados. El nombre de dicho archivo tiene el prejo Informe y su nombre se
construye en las lneas 9 y 14. Tambin elimina los directorios de cache de Netscape y de depsito
de basura Trash del ambiente de trabajo.
Actividad 9.21 Cul es el sujo del nombre del archivo de informe que genera el programa?
Cmo se obtiene dicho sujo?
Actividad 9.22 Modica el programa para que te pregunte si deseas borrar cada archivo encontrado (Sugerencia: man rm).
Adicionalmente, este programa (la versin original, no la obtenida en el segundo ejercicio) puede ser ejecutado a una hora determinada en das determinados usando el comando crontab. Para
usarlo primero debes hacer lo siguiente, tanto en tu terminal actual como en tu archivo /.bashrc:
hay que hacer que el editor de crontab por omisin sea nuestro conocido Emacs. As que en
/.bashrc tienes que aadir las lneas:
EDITOR = / u s r / b i n / emacs
e x p o r t EDITOR

y por lo pronto lo pones en tu shell actual.


Ahora puedes teclear:
% crontab -e
Eso te pondr en Emacs listo para editar tu tabla de trabajos a ejecutarse automticamente
por el sistema en tiempos determinados. Teclea lo siguiente con los cambios pertinentes (en vez

288

Extendiendo tu ambiente
de /home/jose debe aparecer tu directorio personal, en vez de borramugres debe aparecer el
nombre que le hayas dado al programa para borra basura y en vez de la direccin de correo jose@pateame.fciencias.unam.mx debe aparecer la direccin de tu correo).
#
#
B o r r a d o de b a s u r a
#
#
# Se e f e c t a t o d o s l o s v i e r n e s a l a s 2 : 3 0 AM
#
30 02 6 ( / home / j o s e / b i n / b o r r a m u g r e s ) | / b i n / m a i l s
b o r r a m u g r e s j o s e @ p a t e a m e . f c i e n c i a s . unam . mx > / dev / n u l l 2>&1
#

Nota: A pesar de que se muestran dos lneas sin # en realidad es slo una; si aparecen dos es
slo para mejorar la presentacin.
Esta lnea de crontab hace lo siguiente:
1. Ejecuta el comando entre parntesis, es decir nuestro programa que borra basura.
2. La salida del programa, lo que ste escriba en la pantalla, se pasa a mail con tema borramugres
y direccin de envo jose@pateame.fciencias.unam.mx. El resto de la lnea es para redireccionar la salida estndar de errores a la salida estndar y a su vez sta es enviada a /dev/null
(lo que equivale a tirarla a la basura).
Conviene ahora leer el manual de crontab para entender los primeros cinco campos de la lnea,
que esencialmente indican cundo deber ejecutarse el resto de la lnea; en este caso todos los
viernes (da 6) a los 30 minutos despus de las 02 horas cualquier da (*) de cualquier mes (*).

Slo por no dejar


Hay una opcin ms para hacer el programa de eliminacin de basura. Como ya se dijo antes,
el ltimo parmetro de entrada de nd es lo que tiene que hacer cada vez que se encuentra un
archivo que cumple con las condiciones buscadas. Es posible decirle a nd que, de hecho, ejecute
otro comando y pasarle a dicho comando el nombre del archivo encontrado por nd; eso hace que
puedas quitar los ciclos for que aparecen en el programa y que procesan la salida de nd. Esto lo
haras reemplazando todo el ciclo por una instruccin como la siguiente:
% /usr/bin/nd . -name "core" -exec rm -f {} ;
El signicado de esta lnea hasta antes de -exec es el que ya se ha explicado. -exec le indica a
nd que ejecute un comando, en este caso rm. En el momento en que nd ha encontrado un archivo
que cumple con la condicin, guarda el nombre del archivo encontrado para que pueda ser pasado
como parmetro del comando que se ejecutar. Para hacer referencia a ese archivo encontrado se
utiliza {}. Por ltimo, para avisarle al programa ejecutado por nd (rm en este caso) que se han
terminado los parmetros que le son pasados para su ejecucin, se pone un ; entre comilla simple
(para que el shell no crea que se trata de un terminador de instruccin). En sntesis, el signicado
de la lnea mostrada es: nd busca a partir del directorio actual (.) archivos cuyo nombre (-name)
cumpla con la condicin de ser core; una vez que se encuentra uno de sos ordena la ejecucin

289

9.2 Emacs

(-exec) de rm diciendo: rm -f {} ; borra (rm), sin preguntar (-f) el archivo que encontr ({}) y nada
ms. Nota que todo lo que est despus del -exec es lo que nd le dice a rm.

9.1.8.

Para saber ms
bash es producto de la Free Software Foundation y puedes encontrar informacin adicional acerca
de la programacin en este shell en: http://www.gnu.org.
Tambin hay un tutorial de programacin en bash accesible como documento HOWTO en el Linux
Documentation Project: http://www.linuxdoc.org.

9.2. Emacs
9.2.1.

La madre de todos los lenguajes


A pesar de que Emacs es el editor de texto con mayor funcionalidad que ha existido en la historia
de la computacin, es increble incluso un poco loco que sus usuarios inviertan tanto tiempo en
extender Emacs. Sin embargo, lo hacemos. En esta seccin te mostramos por qu, para qu y cmo
se hace.
Para nosotros, programadores o aprendices de, el editor de texto es una herramienta, til para
crear ms software. Haciendo un smil, podemos pensar en el editor de texto como un martillo para
un carpintero o una llave espaola para un mecnico, como algo til para resolver la tarea en puerta.
Entonces, por qu Emacs es diferente?
La respuesta es que el carpintero y el mecnico modicaran sus herramientas para hacerlas
mejores, si tan slo supieran cmo. Quin sabe mejor que ellos mismos lo que necesitan? Pero ellos
no son herreros y no pueden modicarlas. Por otro lado, Emacs es un tipo de herramienta especial:
es software, lo que signica que la herramienta est hecha de la misma cosa que los usuarios de
Emacs hacen con Emacs. Por lo tanto, t, nosotros y todos los usuarios/programadores de Emacs en
el mundo estamos en la feliz posicin de ser los herreros (diseadores sera un mejor trmino) de
nuestra herramienta principal.
Damos por hecho que conoces algn lenguaje de programacin de alto nivel, aunque no es necesario que manejes un lenguaje de la familia de Lisp. Desarrollaremos varios ejercicios de programacin con ejemplos reales y que te sern de utilidad. Es de esperarse tambin que ests familiarizado
con la terminologa de Emacs; en caso contrario puedes leer la seccin llamada Emacs en todos los
captulos anteriores de este libro.
Emacs-Lisp es un lenguaje de programacin muy grande y no tenemos el tiempo suciente para mostrar todas sus construcciones, pero intentaremos mostrarte suciente como para que puedas
manejar cmodamente variables (creacin, asignacin, bsqueda, etc.), keymaps, comandos interactivos, buffers y ventanas.
Por conveniencia, a lo largo de estas prcticas nos referiremos a Emacs Lisp, como elisp. Tambin hablaremos del lenguaje de programacin LISP (LISt Processing) y en general no haremos

290

Extendiendo tu ambiente
distincin entre este ltimo y elisp: para propsitos de este material, hablaremos indistintamente de
LISP o Emacs-Lisp como elisp o simplemente LISP.

9.2.2.

LISP en 15 minutos
LISP maneja listas (y listas de listas) y stas se presentan entre parntesis. Muchas veces encontrars las listas precedidas por un apstrofo (). Las listas son la parte medular de LISP.

Listas en elisp
En elisp una lista luce como (rosa violeta clavel azucena). Esta lista est precedida por
un apstrofo. Los elementos de la lista son nombres de distintas ores, separados entre s por un
espacio en blanco, aunque cabe aclarar que el nmero de blancos (espacios en blanco, tabuladores
o nuevas lneas) no es relevante.
Las listas tambin pueden tener nmeros dentro, por ejemplo (+ 2 2), que tiene al smbolo +
y al nmero 2, dos veces.
En elisp, tanto los datos como los programas se representan de la misma forma, esto es, son
listas de smbolos, nmeros o bien otras listas, separadas por blancos y rodeadas por parntesis
(dado que los programas lucen como datos, pueden pasarse a otros programas; esto signica que los
programas en elisp tambin son elementos de primera clase y esto constituye una gran herramienta
de elisp).

tomos en elisp
En elisp, a los elementos o palabras que hemos usado en nuestras listas arriba, los llamamos
tomos. Los tomos, desde el punto de vista de elisp, son unidades indivisibles, al igual que los
nmeros y carcteres como +. Por el contrario, las listas, como veremos ms adelante, s pueden
ser divididas (seccin 9.6).
Ya dijimos que una lista puede tener tomos, nmeros y otras listas, pero hay un caso particular
y es la lista que no tiene nada, y que grcamente luce as: ( ); se llama la lista vaca, tambin
representada por nil. Esta lista vaca tiene la facultad de ser una lista y un smbolo al mismo tiempo.
La representacin escrita de listas y tomos se conoce como expresin simblicas (symbolic
expression), o bien s-expression. Aclaramos que la representacin escrita no tiene nada que ver con
la forma interna de las expresiones.
En elisp siempre trabajamos con tomos y listas, pero usualmente a los programadores les gusta
hablar en trminos ms precisos de los tomos que usan. As, tenemos varios tipos de tomos: nmeros, por ejemplo 13, 295 o 1763; y smbolos tales como +, foo, forward-line, etc.; todos los
nombres que hemos usado en las listas de ejemplo, aqu arriba, tambin son smbolos. Adicionalmente, cualquier texto entrecomillado, incluyendo oraciones o prrafos completos, es un smbolo.
Por ejemplo:
( esta l i s t a incluye " texto entre comillas dobles . " )

291

9.2 Emacs

es una lista que tiene cuatro smbolos. En elisp todo el texto entre comillas, incluyendo el signo de
puntuacin y los blancos, es un tomo. Este tipo particular de tomo se conoce como cadena y es el
tipo de tomos que se utiliza para comunicar mensajes que un humano puede leer. Las cadenas son
un tipo distinto de tomo a los nmeros y smbolos y no slo por su forma, sino tambin por su uso.
Dado que los blancos en una lista no importan, las siguientes son representaciones de la misma
lista:
( esta l i s t a
luce asi )
( esta l i s t a luce asi )
( esta
lista
luce
asi )

Por extrao que parezca, hemos cubierto con estos breves ejemplos casi todo lo que podemos
ver en elisp! Todo lo dems son combinaciones de lo anterior, aunque posiblemente usando listas
ms largas y anidadas, pero ningn concepto nuevo. Hay muchas construcciones esotricas en elisp
que utilizan otro tipo de tomos, pero no son comunes y podemos avanzar mucho sin conocerlas.
En resumen, no debes olvidar que: una lista va entre parntesis, una cadena entre comillas
dobles, un smbolo luce como una palabra (o secuencia de ellas, unidas por algn carcter no blanco)
y un nmero luce como un nmero.

Emacs te ayuda a dar formato a cdigo en elisp


Si tecleas una expresin de elisp en Emacs usando ya sea el modo de elisp Interaction, o Emacs
LISP Mode, entonces Emacs te proveer con sucientes comandos para que la expresin sea fcilmente legible. Por ejemplo, presionando TAB automticamente indentar la expresin en el
rengln actual usando el nmero adecuado de espacios.
Adems, cuando tecleas un parntesis que cierra, Emacs momentneamente saltar al parntesis correspondiente que abre, de forma tal que t puedes siempre ver cul es y detectar errores
rpidamente.
Nota: El modo mayor elisp Interaction es el modo en que por omisin se encuentra el buffer
*scratch*, que casualmente es el nico buffer que existe cuando inicias Emacs.

Ejecucin de programas
Una lista en elisp es un programa listo para ser ejecutado. Si lo ejecutas (evalas en el cal de
elisp) har una de tres posibles cosas: nada, excepto regresar la lista misma; mandarte un mensaje
de error o tratar el primer smbolo en la lista como un comando para hacer algo.
El apstrofo sencillo que aparece en algunas de las listas de ejemplo en la seccin anterior se
llama quote (es una funcin). Cuando precede a una lista, le dice a elisp que no haga nada con ella
excepto tomarla tal y como est escrita. En cambio, si no aparece un apstrofo delante de la lista,

292

Extendiendo tu ambiente
entonces elisp interpreta el primer elemento en la lista como un comando que tiene que obedecer.
En elisp estos comandos se llaman funciones. La lista (+ 2 2) arriba no tena un apstrofo, por lo
que elisp entiende el + como una funcin que hace algo con el resto de los elementos en la lista, en
este caso, sumar los elementos en la lista.
Actividad 9.23 Teclea (+ 2 2) en el buffer *scratch*, pon el cursor justo despus del parntesis
que cierra y luego teclea C-x C-e .
Lo que acabas de hacer se conoce como evaluar la lista.
Actividad 9.24 Ahora haz lo mismo, pero con una lista que est precedida con un apstrofo, por
ejemplo, ( que bonito ) . Qu pasa?
Cuando una lista est precedida por un apstrofo, entonces el intrprete de elisp no interpreta
la lista, la lee de manera textual. Nos referiremos a este tipo de listas como listas textuales, citadas,
inmutables o constantes.

Mensajes de error
A continuacin te pediremos que evales una expresin que har que el intrprete de elisp
marque un error. Lo hacemos por varias razones: la primera y ms importante, para mostrarte que
no pasa nada malo, es una actividad inofensiva; haremos esto varias veces a lo largo de la seccin. La
segunda razn es para que te acostumbres al lenguaje y la forma de los mensajes de error, ya que una
vez que los entiendas te dars cuenta que son muy informativos. Puedes pensar en estos mensajes de
error como sealizacin para el viajero de las carreteras de elisp: son crpticos al principio (como
casi cualquier otro tipo de sealizacin), pero una vez que los entiendes, te llevan de la mano a tu
destino nal.
Lo que haremos, y ese es tu siguiente ejercicio, ser evaluar una lista que no est citada y que
no tiene un nombre de funcin como su primer elemento. Hazlo:
Actividad 9.25 Evala la siguiente lista: ( esta lista marca un error ) .
Despus de hacer eso, debiste recibir el mensaje: Symbols function denition is void: esta,
cierto? Dado que este tipo de mensajes es muy frecuente, a continuacin te presentamos una explicacin, aunque ya debes tener una buena idea de lo que el mensaje signica.
Sabemos que el problema fue ocasionado por el smbolo esta; tambin se menciona la palabra function, una palabra muy importante. Para efectos prcticos, valga la siguiente denicin de
funcin: un conjunto de instrucciones para la computadora que le indican lo que debe hacer. En
realidad, el smbolo le dice a la computadora dnde encontrar las instrucciones a ejecutar.
Ahora s, estamos en posicin de entender en su totalidad el mensaje de error: el smbolo esta
no contiene la denicin de conjunto alguno de instrucciones para la computadora.
La extraa frase Symbols function denition is void tiene que ver con la forma en que Emacs
est implementado, ya que cuando un smbolo no tiene un conjunto de instrucciones asociado, el
lugar donde tal conjunto (de existir) debera estar, es ocupado por la funcin void, que no hace nada.

293

9.2 Emacs

Por otro lado, dado que s pudimos sumar 2 y 2 evaluando (+ 2 2) , podemos inferir que el
smbolo + debe tener un conjunto de instrucciones que la computadora obedece; esta instruccin
suman los dos nmeros.
Finalmente, debes saber que los smbolos tambin se usan para nombrar variables o funciones.
Esto no quiere decir que el smbolo, por ejemplo +, sea la funcin, sino simplemente una referencia
al lugar donde estn las instrucciones que hacen a la funcin. Su papel es similar al de los nombres
que tenemos las personas, nuestro amigo Juan Prez, puede ser referido como Juan, pero no es las
letras J, u, a, n. De la misma manera, las instrucciones que le dicen a la computadora que sume una
lista de nmeros (y cmo hacerlo) no son +.
Ms an, elisp nos permite poner varios nombres a un mismo conjunto de instrucciones. Para
sumar dos nmeros podramos hacer que un nuevo nombre, digamos suma, haga referencia a las
mismas instrucciones que +.

El intrprete de elisp
Ya debes tener una buena idea de qu hace el intrprete de elisp cuando encuentra una lista: si es
inmutable, regresa la lista; si el primer elemento es un smbolo, busca su conjunto de instrucciones
asociado y los ejecuta usando el resto de los elementos de la lista como parmetros; si el conjunto
de instrucciones asociado es void, marca un error. Muy sencillo, no? Sin embargo, hay varias
complicaciones que necesitas entender para seguir aprendiendo elisp y comenzar a programar:
Adems de listas, elisp puede interpretar tambin smbolos (sin parntesis alrededor y sin
quote), en cuyo caso el intrprete intentar determinar el valor del smbolo como variable.
Regresaremos a esto ms tarde.
Algunas funciones no trabajan igual que la evaluacin de listas. Se llaman formas especiales
y se usan para cosas muy particulares, como denir funciones. No hay muchas y las iremos
revisando conforme avancemos.
Si lo que el intrprete est tratando de evaluar no es una forma especial, y s es parte de una
lista, el intrprete revisa si la lista tiene otra lista adentro. Si hay una lista adentro, primero ve
qu debe hacer con ella y si a su vez tiene otra lista adentro, primero hace sa y as sucesivamente. Una vez que concluye su trabajo (de evaluacin) con las listas internas, hace lo que
tiene que hacer con la lista actual.
En cualquier otro caso, el intrprete va evaluando de izquierda a derecha y de expresin en
expresin.
La ltima de las complicaciones listadas arriba es la ms interesante de todas y la ms abstracta
tambin. Por qu evala de adentro hacia afuera? La respuesta tiene dos partes: primero debes saber
que toda evaluacin en elisp regresa un valor (o bien termina en error); lo segundo que te interesa
saber es que el valor lo regresa al punto de llamada. Entonces, las expresiones ms externas esperan,
por decirlo de alguna forma, a los valores que regresan las expresiones anidadas para usarlos. Por
ejemplo, veamos que sucede cuando evaluamos (+ 2 (+ 3 4)) ; hazlo: evala esa expresin.

294

Extendiendo tu ambiente
Vers 9 aparecer en el rea de eco. Y eso slo puede suceder si primero se evala (+ 3 4) a 7,
y ese valor es visto y usado por la otra aplicacin de +, como si en realidad estuvieras evaluando:
(+ 2 7) .
Ahora ests en posicin de saber que C-x C-e evala el comando eval-last-sexp4
Actividad 9.26 Evala la expresin (+ 2 (+ 3 4)) , en distintas partes de la misma. Por ejemplo,
pon el cursor al nal y evala (debes obtener 9 otra vez); coloca el cursor sobre el ltimo parntesis
o detrs del parntesis que cierra (+ 3 4) y atrs de un nmero, etc. Qu pasa? Puedes
explicar por qu pasa eso?

Variables
En elisp un smbolo puede tener un valor asociado a l, al igual que una funcin, como ya
vimos. Nota que son cosas distintas: una funcin es un conjunto de instrucciones, mientras que un
valor es algo, como un nmero o un nombre que puede cambiar; de este hecho se desprende el
nombre variable, que es el nombre con el que conocemos a los smbolos que representan un valor.
Algo muy importante es que un smbolo puede tener tanto un valor como una funcin asociados. Puedes pensar en un smbolo como una cajonera, en una cajn se guarda el valor y en otro
las instrucciones que conforman la funcin. Entonces puedes cambiar el contenido de uno de los
cajones sin perturbar al otro.
Por ejemplo, ll-column es una variable que existe en todos los buffers de Emacs. Para saber su
valor puedes evaluarla y vers que su valor es usualmente 70 o 72.
En el cal de elisp, decimos que una variable es o est ligada a un valor: un nmero, como 70,
una cadena "como esta" o a una lista (como esta otra ) . Incluso podemos enlazar una variable a la
denicin de una funcin.
Otra forma muy comn de evaluacin es M-: (eval-expression). Esta funcin viene desactivada por omisin, as que la primera vez que la ejecutes, en lugar de un prompt del estilo Eval:
en el rea de eco, Emacs te har preguntas que te permiten decidir qu hacer: activar el comando
slo por esta ocasin, pero dejarlo desactivado; activarlo (permanentemente); o no hacer nada. Se
considera un comando peligroso para novatos en Emacs, pero t ya no eres un novato.
Recapitulando, ahora sabes que una opcin para evaluar, que hemos usado mucho, es poner la
expresin en un buffer de Emacs, poner el cursor al nal de la expresin y luego ejecutar C-x C-e .
Ahora tienes otra opcin: M-: y despus del prompt Eval: escribir la expresin y presionar Enter .
Actividad 9.27 Prueba evaluar algunos de los ejemplos que hemos revisado hasta el momento
usando M-: . Nota los aspectos buenos y malos de ambos enfoques. Tener las dos formas es muy
til y dependiendo del contexto puedes escoger la que ms te convenga.
Notaste que en la evaluacin de ll-column no usaste parntesis? Prueba evaluar
( ll column), por qu marca un error?
4
El sexp abrevia symbolic expression y se lee sex pee. En espaol es poco usual llamarle evaluacin
de expresiones simblicas a la accin de eval-last-sexp y nos referimos a dicha accin simplemente como
evaluacin.

295

9.2 Emacs

Ahora pon el cursor en el espacio en blanco despus del smbolo +, en la expresin (+ 2 2) ,


y evala. Qu error marca? Es igual a los errores anteriores? Si no son iguales, cul es la
diferencia entre ellos? Explica.

Argumentos y tipos de argumentos


Para redondear la discusin sobre evaluacin en elisp, tambin tenemos que hablar de la forma
en que el intrprete reconoce y pasa los operandos a las funciones. Verbigracia, en nuestro ejemplo
favorito, (+ 2 2) , el intrprete regresa 4 y decimos que los dos nmeros (ambos 2) que siguen al
+ son los argumentos de la funcin. Ellos constituyen la informacin que el intrprete pasa a la
funcin.
En elisp, los argumentos son los smbolos o listas que siguen al nombre de la funcin. Distintas
funciones requieren distintos nmeros de argumentos: algunas no reciben ningn argumento y otras
reciben un nmero variable de argumentos.
De qu tipo debe ser el argumento que pasamos a una funcin? Depende del tipo de informacin que requiera la funcin para llevar a cabo sus acciones. +, por ejemplo, slo recibe nmeros
(o carcteres!), mientras que concat, por mencionar otra funcin, recibe cadenas. Por ejemplo, si
evaluamos
( c o n c a t " abc " " def " )

obtendremos "abcdef", es decir concat concatena todos sus argumentos (cadenas) en una sola cadena.
Una funcin como substring recibe tanto una cadena como nmeros. Lo que hace es regresar
una subcadena del primer argumento (cadena). Por ejemplo,
( s u b s t r i n g " que b o n i t o e s Emacs e l i s p " 14 1 9 )

regresa "Emacs". El primer argumento, como puedes notar, es una cadena; el segundo es la posicin (dentro de esa cadena, empezando a contar desde 0) desde donde ser tomada la subcadena
resultado; el segundo nmero (tercer argumento) es la posicin a la derecha donde debe terminar la
subcadena.
Los valores que regresan las funciones en elisp tambin pueden ser usados como argumentos.
Actividad 9.28 Evala las siguientes expresiones y explica cada uno de los resultados. Si no entiendes algn resultado, evala las subexpresiones hasta que encuentres cul es el truco.
( + 2 f i l l column )
( c o n c a t "wow , veo

" ( + 2 f i l l column ) " l i n d o s g a t i t o s . " )

( c o n c a t "wow , veo

" ( numbert o s t r i n g ( + 2 f i l l column ) )


" lindos gatitos .")

(+)
()

296

Extendiendo tu ambiente
(+ 1 2 3 4 5)
( + 1 ( 1 2 ) 4 ( + 2 f i l l column ) ( 1 2 10))
(+ 2 h o l a )

Qu hace la funcin number-to-string? Qu tipo de argumentos recibe y cuntos?

La funcin message
Al igual que la funcin +, message recibe un nmero variable de argumentos. Se usa para
enviar mensajes al usuario y es tan til que incluso tiene su propia seccin.
Con esta funcin se consigue que un mensaje se despliegue en el rea de eco. Por ejemplo,
puedes desplegar un mensaje evaluando lo siguiente:
( m e s s a g e " E s t o e s un b o n i t o m e n s a j e de p r u e b a " )

Nota que el mensaje aparece en el rea de eco incluso con las comillas. Eso sucede porque
se es el valor regresado por la funcin message. Usualmente, cuando t usas message en tus
programas, esto no suceder y el texto que vers se imprimir como un efecto secundario, sin las
comillas.
Sin embargo, si hay un %s en el argumento entrecomillado de message, no imprimir un %s
en el rea de eco, sino que buscar un argumento despus del argumento entrecomillado, lo evaluar
y pondr su valor en la posicin del %s en la cadena. Por ejemplo,
( m e s s a g e " E l nombre de e s t e b u f f e r e s : %s " ( b u f f e r name ) )

imprimir algo como: "El nombre de este buffer es : scratch " al ser evaluada, suponiendo que s
ests en un buffer llamado *scratch* cuando ejecutamos esto, s estbamos en uno llamado as .
Si lo que quieres es imprimir un nmero en notacin decimal, entonces cambia el %s por un %d,
como por ejemplo:
( m e s s a g e " E l v a l o r de f i l l column e s : %d " f i l l column )

Si hay ms de un %s en la cadena entre comillas, entonces el primer argumento que siga a la


cadena ser puesto en el lugar del primer %s, el segundo argumento sustituir al segundo %s, y as
sucesivamente. Por ejemplo:
( m e s s a g e " Hay %d % s en e l l a b o r a t o r i o "
( f i l l column 1 5 ) " e l e f a n t e s r o s a s " )

imprimir "Hay 55 elefantes rosas en el laboratorio ".


Lo valioso de message es que si lo usas con formato ( %), le puedes pedir que evale funciones
al momento de evaluarse ella misma.

Asignar valores a una variable


Hay varias formas por medio de las cuales podemos darle un valor a una variable. Aqu veremos
setq. Ms adelante hablaremos de let. En elisp decimos que estamos ligando una variable a un
valor.

297

9.2 Emacs
En esta seccin veremos cmo funciona setq 5 y cmo se pasan los argumentos.

setq
Para asignarle a la variable ores la lista ( rosa violeta clavel azucena) puedes evaluar la siguiente expresin:
( setq flores

( rosa v i o l e t a c l a v e l azucena ) )

Vers la lista ( rosa violeta clavel azucena) aparecer en el rea de eco. Esta lista es el valor de
regreso de la funcin y, como efecto secundario, la variable (el smbolo) ores est ahora ligado a
la lista. Es decir, que despus de evaluar la expresin de arriba puedes evaluar el smbolo y vers la
lista aparecer en el rea de eco.
Con setq tambin podemos asignar valores a varias variables al mismo tiempo. Por ejemplo,
para asignar una lista de ores a la variable ores y una lista de animales a la variable animales,
podemos hacer:
( setq f l o r e s ( rosa v i o l e t a c l a v e l azucena )
a n i m a l e s ( l e n s a p o o s o p e r r o ) )

Nota que la expresin bien podra ir toda en una lnea, pero tal vez no hubiese cabido en la pgina
y adems los humanos podemos leer con mayor facilidad listas con un formato ms agradable.
A pesar de que hemos usado hasta el momento el trmino ligar, hay otra forma de referirnos al
trabajo que realiza setq y es decir que setq hace que el smbolo apunte a la lista. Esto tambin se
llama referencia y es muy comn, as que a partir de este momento nos referiremos a este tipo de
asignaciones as.

Contador
En esta seccin construiremos un contador (muy sencillo) que usa setq. Dicho contador puede
ser usado para contar cuntas veces se repite una cierta parte de tu programa. Primero necesitamos
inicializar una variable a cero; luego aadir uno a esa variable cada vez que se repita esa parte en el
programa. Para hacer esto, necesitas una variable que sirva de contador y dos expresiones: un setq
que asigne cero al contador; una segunda expresin setq que incremente el contador cada vez que
es evaluado.
( setq contador 0)

; I n i c i a l i z a c i n

( s e t q c o n t a d o r (+ c o n t a d o r 1 ) )

; Incremento

contador

El texto que sigue a un carcter ; y hasta el n de lnea, es un comentario que es ignorado por el
intrprete de elisp.
5

setq en realidad es una abreviatura de la combinacin de las funciones set y quote.

298

Extendiendo tu ambiente
Si evalas la primera de estas expresiones, la inicializacin, y luego evalas la tercer expresin,
el contador, el nmero 0 aparecer en el rea de eco. Si evalas entonces la segunda expresin, el
incremento, el contador aumentar en 1 su valor; as, si evalas nuevamente la tercera expresin,
entonces vers el nmero 1 aparecer en el rea de eco. Cada vez que evales la segunda expresin,
el valor de contador aumentar en 1.

Actividad 9.29 Evala varias veces la segunda y tercera expresiones de manera alternada; despus explica con detalle cmo evala la segunda expresin el intrprete de elisp.

9.2.3.

Resumen
Aprender elisp es como escalar una montaa en la que la primera parte es la ms difcil. T ya
subiste esa parte, as que lo que sigue se ir haciendo ms sencillo conforme avancemos.
En resumen:
Los programas en elisp estn formados por expresiones, que son listas o tomos.
Las listas estn formadas por cero o ms tomos y listas interiores, separadas por espacios en
blanco y rodeadas por parntesis. Una lista puede ser vaca.
Los tomos son smbolos (palabras) como forwardparagraph, smbolos de un slo carcter
como +, cadenas de carcteres o nmeros.
Un nmero se evala a s mismo.
Una cadena tambin se evala a s misma.
Cuando evalas un smbolo, regresa su valor.
Cuando evalas una lista, el intrprete de elisp checa el primer smbolo en la lista y luego a la
funcin ligada a ese smbolo, luego las instrucciones en la funcin son ejecutadas.
Un slo apstrofo le indica al intrprete que debe regresar la siguiente expresin tal y como
est escrita y no evaluarla.
Los argumentos son la informacin pasada a una funcin. Los argumentos de una funcin se
calculan evaluando el resto de los elementos de la lista, en la cual la funcin aparece como el
primer elemento.
Una funcin siempre regresa un valor cuando se evala (a menos que genere un error); adems, tambin puede llevar a cabo alguna otra accin, llamada efecto secundario. En muchos
casos, el propsito principal de una funcin es crear un efecto secundario.

Actividad 9.30 Crea un contador que incremente de 2 en 2. Adems, escribe una expresin de tal
forma que cuando se evale despliegue un mensaje que diga El valor del contador es X, donde
X deber ser el valor actual del contador.

299

9.3 Evaluaciones

9.3. Practicando evaluaciones


Antes de que aprendas a escribir deniciones de funciones en elisp, es importante que practiques evaluando funciones que ya fueron escritas. Estas expresiones sern listas con los nombres
de las funciones como su primer (y en muchos casos nico) elemento. Comenzaremos con algunas
funciones relacionadas con buffers, ya que son sencillas e interesantes.
Siempre que das un comando de edicin a elisp, tal como el comando para mover
el cursor o recorrer la pantalla, ests evaluando una expresin, cuyo primer elemento es
una funcin. As funciona Emacs.
Cuando tecleas carcteres, provocas que el intrprete de elisp evale expresiones y as es como
obtienes resultados. Incluso teclear simple texto involucra evaluacin de funciones de elisp. En este
caso, veremos una que usa self-insert-command, que simplemente inserta el carcter que tecleaste.
Las funciones que evalas tecleando alguna combinacin de teclas se llaman funciones interactivas
o comandos; cmo crear este tipo de funciones lo veremos ms adelante, en la seccin 9.4.1.

9.3.1.

Nombres de buffers
Las dos funciones, buffer-name y buffer-le-name, muestran la diferencia entre un archivo
y un buffer. Cuando evalas ( buffer name), el nombre del buffer se despliega en el rea de eco;
cuando evalas ( buffer lename), el nombre del archivo visitado en el buffer se despliega. Usualmente el nombre del buffer es el mismo nombre del archivo que visita, mientras que el nombre del
archivo viene con su ruta completa al archivo.
Un buffer y un archivo son entidades completamente distintas. Un archivo es informacin almacenada permanentemente en la computadora (a menos que t lo borres), mientras que un buffer es
informacin dentro de Emacs que desaparecer cuando acabes tu sesin (o cuando mates el buffer).
La distincin es importante porque nos permite distinguir entre acciones tiles cuando hacemos
programas. Sin embargo, muchas veces escuchars a gente decir estoy editando un archivo (en
Emacs), en lugar de algo ms apropiado como estoy editando un buffer que despus salvar a un
archivo. Usualmente este tipo de ambigedades son comprensibles por contexto para una persona,
pero la computadora no es tan inteligente y cuando programas en Emacs elisp es importante que le
digas exactamente lo que deseas.
No todos los buffers de Emacs estn asociados a un archivo. Por ejemplo, cuando empiezas
tu sesin con Emacs, ste arranca con un buffer llamado *scratch*; este buffer no est visitando
ningn archivo, lo mismo que el buffer llamado *Help*.
Actividad 9.31 Ve al buffer scratch y evala las dos expresiones:
( b u f f e r name )
( b u f f e r f i l e name )

tambin evala las expresiones usando C-u C-x C-e .

300

Extendiendo tu ambiente

Obteniendo buffers
La funcin buffer-name regresa el nombre del buffer, pero si lo que t quieres es el contenido del buffer, entonces debes usar current-buffer. Es decir, con current-buffer t obtienes
el buffer mismo, no slo su nombre. Sin embargo, hay una pequea complicacin: si t evalas
( current buffer) , lo que obtienes es el buffer pero su forma impresa se ver como: #<buffer " scratch ">.
Otra funcin relacionada es other-buffer que te regresa el buffer ms recientemente seleccionado que no sea en el cual ests actualmente.
Actividad 9.32 Prueba las funciones buffer-name y other-buffer haciendo lo siguiente. Ve a algn otro buffer en tu sesin actual de Emacs y de regreso a scratch; despus evalas las dos
funciones (recuerdas C-x b ?).

Cambiando de buffer
La funcin other-buffer es til cuando se utiliza con switch-to-buffer. De hecho, esta ltima
es una de las funciones que debes usar con mayor frecuencia en Emacs, cuando ejecutas C-x b ;
esa combinacin de teclas est ligada al comando switch-to-buffer, que recibe un buffer como
parmetro y lo muestra en la ventana actual.
Por ejemplo, si evalas lo siguiente:
( s w i t c h t o b u f f e r ( o t h e r b u f f e r ) )

vers que hace justo lo mismo que C-x b , ya que ests ejecutando (de otra forma) la misma
funcin con los mismos argumentos.
En general, en programas preferimos set-buffer sobre switch-to-buffer; esto es porque los humanos necesitamos ver lo que hacemos, pero los programas no tienen ojos6 y no necesitan que el
buffer en el que operan sea visible en una ventana de Emacs.

Tamao de un buffer y la localizacin del punto


Veamos algunas funciones muy simples, buffer-size, point, point-min, point-max. Estas funciones dan informacin sobre el buffer, su tamao, la posicin del punto y las posiciones inicial y
nal del buffer.
buffer-size regresa el tamao del buffer, que no es otra cosa sino la cuenta de todos los carcteres en el buffer. point regresa la cuenta de todos los carcteres desde el inicio hasta el punto donde
actualmente se encuentra el cursor (uno antes, para ser exactos; o mejor dicho, el punto est entre el
carcter sobre el cual est el cursor y el anterior); point-min es la primera posicin permisible del
buffer (o la cuenta de carcteres desde el principio del buffer hasta la primera posicin donde podemos trabajar en el buffer) y point-max la cuenta de caracteres hasta la ltima posicin permisible
del buffer.
6

S tienen cerebros y bocas, por eso uno puede hablar con sus programas, incluso discutir, aplicarles un
correctivo o simplemente platicar con ellos.

9.4 Deniciones de funciones

301

Actividad 9.33 Evala las cuatro funciones nombradas en esta seccin. Despus mueve el cursor
en el buffer y repite este proceso.
Parece tonto tener una funcin que siempre regresa 1, como point-min, cierto? Pues no, no
es cierto. Cuando programamos en elisp, tenemos la facultad de reducir nuestro espacio de operacin a cualquier subconjunto del buffer actual; esto que se llama narrowing ni siquiera lo voy a
intentar traducir. Desgraciadamente no nos da tiempo de ver en este curso cmo y para qu puedes
usarlo, pero debe ser claro que si estamos trabajando en una seccin del buffer tiene sentido preguntar cul es la primera posicin de esa seccin, y eso es lo que hace point-min. point-max hace algo
similar.
No desprecies estas funciones, ya que a pesar de su aparente simplicidad son sumamente tiles
para hacer un gran nmero de funciones interesantes. De hecho, un gran nmero de funciones de
Emacs las utilizan y algunos de los ejemplos que veremos ms adelante tambin.

9.4. Cmo escribir deniciones de funciones


En elisp, todas las funciones estn denidas en trminos de otras funciones, excepto algunas
primitivas que estn escritas en el lenguaje de programacin C. De cualquier manera, las funciones
primitivas y no primitivas que vienen con Emacs y las nuevas funciones que t escribas, todas se
ejecutan igual.
Vamos a enfatizar ms esto: las funciones que t escribas y las que ya estn integradas a Emacs,
se ejecutan de la misma forma. Entonces te preguntars, si la diferencia no es importante, para qu
me dices? La respuesta es porque es un dato interesante.

9.4.1.

La forma especial defun


En elisp, un smbolo tal como mark-whole-buffer tiene cierto cdigo asociado a l que le
indica a la computadora qu hacer cuando la funcin sea llamada (o ejecutada). Dicho cdigo se
conoce como la denicin de la funcin y se crea evaluando una expresin que comienza con la
palabra reservada defun (que abrevia a dene function). Dado que defun no evala sus argumentos
en la forma usual, se conoce como una forma especial.
En subsecuentes secciones veremos cmo estn hechas (i.e. el cdigo) de algunas funciones
de Emacs; en sta veremos una funcin muy simple, para explicar cmo funciona defun. Una
denicin de funcin tiene hasta cinco partes despus de la palabra defun:
1. El nombre del smbolo al cual la funcin ser ligada, pegada, asociada7 .
2. Una lista de los argumentos que sern pasados a la funcin. Si no se pasarn argumentos a la
funcin, entonces usamos la lista vaca, ( ).
3. Documentacin que describe a la funcin (tcnicamente este campo es opcional, pero en la
prctica muy recomendable).
7

Del verbo en ingls attach y que signica algo as como ligar, pegar o adjuntar.

302

Extendiendo tu ambiente
4. Opcionalmente, una expresin para hacer que la funcin sea interactiva, para que puedas usarla
tecleando M-x y el nombre de la funcin; o tecleando una combinacin de teclas apropiada.
5. El cdigo que le dice a la computadora qu hacer: el cuerpo de la funcin.
Es ms fcil pensar en una funcin como un esqueleto de la forma:
( d e f u n nombre ( a r g u m e n t o s . . . )
" D o c u m e n t a c i n o p c i o n a l . . . "
( i n t e r a c t i v e paso dei n f o r m a c i n ) ; o p c i o n a l
cuerpo . . . )

Por ejemplo, a continuacin te presentamos una funcin que multiplica su argumento (un nmero) por 7:
( d e f u n m u l t i p l i c a por 7 ( num )
" M u l t i p l i c a NUM p o r 7 . "
( 7 num ) )

Este ejemplo no es interactivo, eso lo veremos ms adelante; por el momento nota que las otras
partes estn todas ah. Su nombre, multiplica por7; sus argumentos, (num); su documentacin,
" Multiplica NUM por 7."; y su cuerpo, ( 7 num).
En este caso, la funcin slo recibe un argumento, que aqu decidimos llamar num, pero bien
pudo ser cualquier otro nombre, por ejemplo, parangaricutirimicuaro , pero ese hubiera sido un muy
mal nombre, ya que no le dice nada a un humano. En cambio, num, suena como nmero y eso es
ms o menos lo que esperamos sea pasado a la funcin, un nmero. Por ejemplo, evala la denicin
de la funcin aqu arriba y luego evala las siguientes:
( m u l t i p l i c a por 7 6 )
( m u l t i p l i c a por 7 1 0 )

debers ver 42 y 70, respectivamente.


Los nombres que uses para tus argumentos en la denicin de una funcin se convierten automticamente en privados, esto es, slo son vistos (y por ende, slo pueden ser usados) dentro del
cuerpo de la funcin. En nuestro caso, podrs notar que num se multiplica por 7, pero si t tratas de
usar num fuera de la funcin vers que no est ligado a nada; pon num en el buffer *scratch* y
luego ejecuta C-u C-x C-e para convencerte.
Algo que debes notar es que los nombres que uses para tus argumentos pueden ser usados en
el exterior de la funcin (i.e. fuera de ella) o como nombres de argumentos en otra funcin o en
muchas; en realidad no importa, porque no afecta el curso del cmputo de tu funcin.
La documentacin de tu funcin es lo que aparece cuando usas C-h f y un nombre de funcin.
Por ejemplo, teclea C-h f y luego pon multiplica por7 y vers un nuevo buffer de ayuda con la
documentacin que usamos para describir nuestra funcin.
Actividad 9.34 Haz una funcin que saque el promedio de dos nmeros. Llama a sus parmetros
num y num2. Vuelve a probar multiplica por7 y comprueba que sigue funcionando, a pesar de

que ya hay al menos una funcin ms (la que acabas de hacer que calcula el promedio) que utiliza
el mismo nombre para un argumento, num.

9.4 Deniciones de funciones

303

Instalar nuevas deniciones


Aqu arriba, cuando te pedimos que evaluaras la denicin de la funcin multiplica por7, te hicimos trampa porque no te explicamos lo que iba a suceder. Para efectos didcticos era mejor as,
pero aqu te va la explicacin completa.
Para que t puedas ejecutar una funcin con ciertos argumentos, primero Emacs debe conocer dicha funcin. Para lograr esto, debes instalar la denicin en Emacs. Cuando pones el cursor
al nal de la denicin de una funcin, como multiplica por7, y le picas C-x C-e , vers el
nombre de la funcin en el rea de eco (eso es lo que regresa una denicin de funcin, el nombre
de la funcin). En ese momento, la funcin ha sido instalada en Emacs y es tan parte de Emacs
como forward-word o cualquier otra funcin de edicin que t uses (multiplica-por-7 permanecer
instalada en Emacs hasta que termines tu sesin de Emacs; para instalar cdigo permanentemente
puedes introducirlo en tu /.emacs).

Cmo cambiar la denicin de una funcin


Si quieres cambiar el cdigo en multiplica-por-7, slo tienes que reescribirlo y volver a instalar
la funcin en Emacs. As modicas cualquier cdigo de funcin en Emacs, es muy sencillo.
A manera de ejemplo, puedes cambiar el cdigo de la funcin multiplica-por-7 por una versin
que no utilice multiplicacin (*), por ejemplo:
( d e f u n m u l t i p l i c a por 7 ( num )
" M u l t i p l i c a NUM p o r 7 . "
( + num num num num num num num ) )

Vamos, prubalo! Evala esta nueva versin y vuelve a probar la funcin. De hecho, sta es
la forma de hacer funciones pequeas en Emacs elisp: haces una primera versin, la instalas, la
pruebas y luego haces correcciones y vuelves a instalar, probar, en un ciclo hasta que quede como
la deseas.

Cmo hacer una funcin interactiva


Haces una funcin interactiva poniendo una lista que empieza con la forma especial interactive
justo despus de la documentacin. Un usuario puede invocar una funcin interactiva tecleando
M-x funcin, o tecleando la combinacin de teclas a las cules est ligada la funcin, como por
ejemplo, C-n para ejecutar next-line o C-x h para ejecutar mark-whole-buffer.
Algo muy interesante, que escapa al programador de Emacs elisp novato, es que cuando llamas
a una funcin interactiva, su resultado no aparece en la lnea de eco. La razn es que muchas de estas
funciones son hechas por sus efectos secundarios, como avanzar una lnea o borrar una palabra, y
no por el valor que regresan. Si el valor regresado apareciera en el rea de eco distraera mucho al
usuario.
Una versin de nuestra multi-citada funcin multiplica-por-7 puede ser interactiva y aun as
imprimir su resultado en el rea de eco. Por ejemplo:
( d e f u n m u l t i p l i c a por 7 ( num )

304

Extendiendo tu ambiente
" M u l t i p l i c a NUM p o r 7 . "
( i n t e r a c t i v e "p ")
( m e s s a g e " E l r e s u l t a d o e s : %d " ( 7 num ) ) )

Ahora, cuando evales esta nueva versin de multiplica-por-7 podrs usar la funcin de manera
interactiva: teclea C-u 6 M-x multiplica-por-7 Enter y vers el mensaje El resultado es: 42
aparecer en el rea de eco.
En general, puedes invocar una funcin como sta en una de dos formas:
1. Tecleando un argumento prejo que ser num para la funcin, seguido de M-x y el nombre
de la funcin. Por ejemplo, C-u 3 M-x forwardsentence, o
2. tecleando cualquier tecla o combinacin de ellas a las cuales est ligada la denicin, como
en C-u 3 M-e .
Ambos ejemplos mencionados hacen lo mismo: mueven el punto tres oraciones hacia adelante
(dado que multiplica-por-7 no est ligado a ninguna tecla, entonces no podemos usar la segunda
forma, aunque debiste haber aprendido a ligar funciones a teclas hace un par de captulos dentro del
marco de este material).
Un argumento prejo N puede ser pasado a una funcin usando C-u N o bien M N. Si slo
tecleas C-u sin argumentos, el valor por omisin es 4; comprubalo, ejecutando
C-u M-x multiplica por7
En nuestro ejemplo, la expresin ( interactive "p") le dice a Emacs que pase el argumento
prejo a la funcin y que use su valor (el del argumento prejo) como argumento de la funcin.

Diferentes opciones para interactive


En nuestro ejemplo, p le indica a Emacs que pase el argumento prejo (un nmero) como
parmetro a la funcin. Pero qu sucede si la funcin no recibe un nmero? La forma especial
interactive tiene un gran nmero de opciones, cerca de 20 carcteres, y muy probablemente uno de
ellos te permitir pasar la informacin que requieres a tu funcin. No los revisaremos todos aqu,
slo veremos unos cuantos, pero puedes buscar la documentacin de interactive en el manual en
lnea de Emacs elisp.
Por ejemplo, la letra r le dice a Emacs que pase a la funcin los valores inicial y nal de la
regin (el valor del punto y el valor de la marca en el buffer actual) como dos argumentos separados
a la funcin. Se usa como sigue:
( interactive " r ")

La letra B le dir a Emacs que pida un nombre de buffer que ser pasado a la funcin. No slo
eso, sino que puedes usar una etiqueta para preguntar por el buffer y, adems, Emacs te ayudar a
completar el nombre. Se usa as:
( i n t e r a c t i v e "BDame un b u f f e r : " )

Una funcin con varios argumentos tambin puede usar interactive; la forma en que separamos
los argumentos es usando un smbolo de nueva lnea, \n. Por ejemplo,
( i n t e r a c t i v e "BDame un b u f f e r : \ n r " )

9.4 Deniciones de funciones

305

le dice a Emacs que pida un buffer, que ser el primer argumento de la funcin, y que adems pase
el valor de la marca y el punto (la regin) como segundo y tercer valor (no necesariamente en ese
orden) a la funcin.
Si la funcin no recibe ningn argumento, eso no es motivo para que no puedas usar interactive;
de hecho, interactive siempre recibe el mismo nmero de argumentos que la funcin, as que a una
funcin sin argumentos le corresponde una forma interactive sin argumentos, ( interactive ) .

9.4.2. let
Una expresin let tambin es una forma especial que usars en muchas deniciones de funciones. Su uso es til para ligar un smbolo a un valor, de forma tal que le permite al intrprete
distinguir esta variable de otra con el mismo nombre y que no forme parte del cuerpo de la funcin.
Para entender por qu let es necesaria, piensa en tu hogar, al cual t te reeres como mi casa;
ahora imagina que ests hablando con Foo, y ste est hablando de mi casa. Muy probablemente
Foo est hablando de su casa y no de tu casa, pero si cada vez que t oyes mi casa piensas en tu
casa, te confundirs sin lugar a dudas. Ahora imagina que dos funciones usan una variable y que
dicha variable se llama igual, pero debe tener distintos valores para cada funcin.
let evita este tipo de confusiones. Lo que hace es crear un nombre que opaca, o mejor dicho
oculta, a cualquier referencia externa a ese mismo nombre en el cuerpo del let.
Una expresin let tiene tres partes: (let varlist cuerpo...). La primera parte es el smbolo let,
el segundo es una lista, identicada como varlist; cada elemento de la lista es un smbolo o una
lista de dos elementos, el primero de los cuales es un smbolo y el segundo una expresin; el tercer
elemento de la lista es el cuerpo.
Los smbolos en la lista varlist, son las variables a las que se les asigna un valor inicial por
let. Los smbolos que aparecen solos son asignados el valor nil ; el intrprete evala los segundos
elementos de cada lista y asigna al primer elemento (un smbolo) el resultado.
Por lo tanto, una varlist puede lucir as: (num (sex f )) , en cuyo caso Emacs asignar a la primera
variable, num, el valor nil y la variable sex valdr f .
Si la lista de variables, varlist, est compuesta de parejas (el caso ms usual), let luce as:
( l e t ( ( var value )
( var value )
...
( var value ) )
cuerpo . . . )

Ejemplo de let
La siguiente expresin let le da valor a dos variables y luego imprime sus valores. El cuerpo
consiste slo de la llamada a message:
( l e t (( zebra rayas )
( tiger feroz ))

306

Extendiendo tu ambiente
( m e s s a g e "Un a n i m a l t i e n e % s y e l o t r o e s % s " z e b r a t i g e r ) )

Puedes evaluar esta expresin. El resultado lucir como: Un animal tiene rayas y el otro es
feroz.
Actividad 9.35 Haz una funcin llamada suma-exotica, que recibe tres parmetros numricos,
a, b, c y regresa el resultado de la operacin: a2 + b3 + c4 . Usa let para almacenar los resultados
intermedios. Tambin puedes hacer una funcin auxiliar que reciba dos nmeros como parmetros,
n y m y regrese nm .

9.4.3.

La forma especial if
La tercera forma especial que veremos, adems de defun y let, es la condicional if. Esta forma se
usa para ensear a la computadora a tomar decisiones. No es indispensable para escribir funciones,
pero su uso es muy comn y por eso est aqu. La funcin beginning-of-buffer la usa, por ejemplo.
La idea bsica detrs de if es que si (if) algo es verdadero, entonces algo se hace, por ejemplo,
si el cielo est despejado y hace calor, entonces ve a la playa. En elisp no usamos ninguna palabra
para designar la parte del entonces, por lo que las construcciones if lucen as:
( i f p r u e b a f a l s a ov e r d a d e r a
r e a l i z a r e s t o s i esv e r d a d e r a )

La primera parte es conocida como la parte if y la segunda es conocida como la parte then. Por
ejemplo, evala la siguiente expresin:
( i f (> 5 4)
( m e s s a g e "Wow, 5 e s mayor que 4 . " ) )

La funcin > prueba si el primer argumento es mayor que el segundo y regresa verdadero si lo
es.
En la vida real, claro est, la prueba no es ja, usualmente depende de una variable. Por ejemplo,

1
2
3
4
5

( d e f u n t i p o dea n i m a l ( c a r c t e r )
" Imprime un m e n s a j e en e l r e a de e c o d e p e n d i e n d o de CARCTER .
S i e s e l s mbolo f e r o z , e n t o n c e s a v i s a que e s un t i g r e . "
( i f ( equal car cter feroz )
( m e s s a g e " Es un t i g r e " ) ) )

imprime el mensaje Es un tigre dependiendo de si su parmetro es el smbolo feroz o no.


Las expresiones if reciben opcionalmente un tercer parmetro, conocido como la parte else y se
evala cuando la prueba es falsa. As, podemos completar nuestra funcin tipo deanimal para que
regrese algo ms creativo que nil cuando no encuentra la caracterstica feroz.

9.4 Deniciones de funciones

307

1 ( d e f u n t i p o dea n i m a l ( c a r c t e r )
2
" Imprime un m e n s a j e en e l r e a de e c o d e p e n d i e n d o de c a r c t e r .
3 S i e l e l s mbolo f e r o z , e n t o n c e s a v i s a que e s un t i g r e . "
4
( i f ( equal caract feroz )
5
( m e s s a g e " Es un t i g r e " )
6
( m e s s a g e "Ummm no , l o s i e n t o , no e s f e r o z . " ) ) )

Vamos no seas tmido, evala nuevamente la funcin y prubala con feroz , amistoso, y otros smbolos que se te ocurran.

Valores de verdad en elisp


Hasta el momento hemos hablado de falso y verdadero como si fueran nuevos tipos de datos en
elisp. La realidad es que falso est representado por nuestro viejo amigo, nil ; cualquier otra cosa
en serio, cualquier valor distinto de nil es verdadero.
La expresin que prueba si algo es verdadero se interpreta como verdadera si el resultado de
la evaluacin no es nil . Como ya habamos mencionado, nil tambin signica la lista vaca, ( ). Es
decir, para el intrprete de elisp, nil y ( ) son la misma cosa, pero los humanos tendemos a referirnos
a nil como falso y a ( ) como la lista vaca.
Cabe notar que si el intrprete de elisp no puede regresar algn valor til para representar
verdadero, entonces regresar el smbolo t , que signica verdadero (la t es de true).

9.4.4. save-excursion
La funcin save-excursion es la cuarta y ltima forma especial que revisaremos en este material.
En elisp es comn hacer programas para editar; la funcin save-excursion es comnmente
usada, ya que guarda las posiciones del punto y la marca, ejecuta el cuerpo de la funcin y luego
regresa el punto y la marca a sus valores previos, si es que fueron cambiados por la accin de la
funcin. Su nico propsito es evitar darle sorpresas inesperadas o molestas al usuario, cambiando
a sus espaldas la posicin del punto o la marca.
En Emacs es comn que una funcin cambie la posicin del punto y la marca como parte integral
de su funcionamiento, aun cuando el usuario pueda o no esperar tal comportamiento. Por ejemplo,
la funcin count-lines-region mueve el punto. El uso de save-excursion es una buena prctica de
programacin.
save-excursion incluso recupera los valores de la marca y el punto, aun en el eventual caso
de que algo salga mal, o en el cal usado en elisp, incluso cuando la funcin termine de manera
anormal. Asimismo, esta funcin tambin regresa al buffer de partida en caso de que la funcin
cambie de buffer internamente para trabajar.
La forma general de save-excursion es:
( s a v e e x c u r s i o n
cuerpo . . . )

308

Extendiendo tu ambiente
aunque es usual que save-excursion ocurra dentro de una expresin let, como en:
( let

9.4.5.

varlist
( s a v e e x c u r s i o n
cuerpo . . . ) )

Resumen
En las ltimas secciones hemos mostrado algunas funciones y formas especiales. Aqu las describiremos brevemente, para que te acuerdes rpidamente cmo se usan y tambin mencionaremos
algunas funciones ms que son parecidas.
eval-last-sexp Evala la ltima expresin simblica anterior a la posicin actual del punto. Su
valor aparece en el rea de eco, a menos que la funcin sea llamada con un argumento, en
cuyo caso el resultado se inserta en el buffer actual. Este comando est usualmente ligado a
C-x C-e .
defun Dene function. Esta forma especial tiene hasta cinco partes: el nombre, un esqueleto para
los argumentos que sern pasados a la funcin, documentacin, una declaracin interactive
opcional y el cuerpo de la denicin.
Por ejemplo:
( d e f u n backt o i n d e n t a t i o n ( )
" Apunta a l p r i m e r c h a r v i s i b l e en l a l n e a . "
( interactive )
( b e g i n n i n g ofl i n e 1 )
( s k i p c h a r s f o r w a r d " \ t " ) )

interactive Le declara al intrprete que la funcin puede ser usada interactivamente. Esta forma
especial puede ir seguida de una cadena con una o ms partes que pasan informacin a los
argumentos de una funcin, en secuencia. Estas partes tambin le pueden indicar al intrprete
que solicite informacin del usuario. Las partes de la cadena se separan por medio de nuevas
lneas, \n.
Algunos carcteres de control comunes son:
b El nombre de un buffer existente.
f El nombre de un archivo existente.
p El argumento (numrico) prejo. (Nota que esta p es minscula).
r El punto y la marca, pasados como dos argumentos numricos, el ms pequeo (cualquiera que ste sea) primero. ste es el nico carcter de control que especica dos
argumentos sucesivos en lugar de uno solo.
let Declara que una lista de variables ser usada dentro del cuerpo del let y les da un valor inicial;
por omisin, dicho valor es nil ; despus evala las dems expresiones en el cuerpo del let y
regresa el valor de regreso de la ltima. Dentro del cuerpo del let, el intrprete de elisp no ve
los valores de las variables cuyos nombres ya estaban ligados fuera del let8 .
8

Esto representa un concepto muy importante en lenguajes de programacin, llamado alcance lxico, pero

9.4 Deniciones de funciones

309

Por ejemplo,
( l e t ( ( f o o ( b u f f e r name ) )
( b a r ( b u f f e r s i z e ) ) )
( m e s s a g e " E s t e b u f f e r e s % s y t i e n e %d c a r c t e r e s . "
foo bar ) )

save-excursion Almacena los valores del punto, la marca y el buffer actual antes de evaluar el
cuerpo de la forma. Los restaura una vez terminada la ejecucin de la ltima expresin en su
cuerpo.
Por ejemplo,
( m e s s a g e " Somos %d c a r c t e r e s h a s t a e s t e p u n t o ( en e s t e b u f f e r . ) "
( ( p o i n t )
( s a v e e x c u r s i o n
( g o t o c h a r ( p o i n t min ) ) ( p o i n t ) ) ) )

if Evala el primer argumento de la funcin; si es verdadero, evala el segundo argumento; en caso


contrario, evala el tercero (si existe).
La forma especial if se llama condicional. Hay otras formas condicionales en elisp, pero if es
probablemente la ms usada.
Por ejemplo,
( s t r i n g = ( i n t t o s t r i n g 2 1 )
( s u b s t r i n g ( emacsv e r s i o n ) 7 9 ) )
( m e s s a g e " E s t a e s l a v e r s i n 21 de Emacs " )
( m e s s a g e " E s t a NO e s l a v e r s i n 21 de Emacs " ) )

( if

equal Prueba si dos objetos son el mismo. equal regresa verdadero si los objetos
eq
tienen la misma estructura y contenidos. eq regresa verdadero si los dos objetos son en realidad el mismo objeto.
< <= La funcin < verica si su primer argumento es menor que el segundo; las dems revisan
respectivamente menor o igual, mayor y por ltimo mayor o igual. Las cuatro funciones
> >=
reciben argumentos numricos.
message Imprime un valor en el rea de eco. El mensaje slo puede ser de una lnea de longitud.
El primer argumento es una cadena que puede contener %s, %d, o %c para imprimir el
valor de argumentos que sigan a la cadena. El argumento usado por %s debe ser una cadena.
El argumento usado por %d debe ser un nmero. El argumento usado por %c debe ser un
nmero y ser impreso como el carcter con ese valor en el cdigo ASCII.
setq La funcin setq asigna el valor de su primer argumento al valor del segundo.
set El primer argumento es citado automticamente por setq. Hace lo mismo para subsecuentes
parejas de valores. Otra funcin set slo toma dos argumentos y los evala ambos antes de
asignar el valor del segundo al primero.
buffer-name Sin argumentos, regresa el nombre del buffer actual, como cadena.
ya tendrs muchos semestres para dominar toda esa terminologa; por el momento tendrs que conformarte
y nosotros tambin con entender el concepto.

310

Extendiendo tu ambiente
buffer-le-name Sin argumentos, regresa el nombre del archivo que el buffer actual est visitando.
current-buffer Regresa el buffer en el cual Emacs est activo; puede ser algn buffer distinto al
que est visible en la ventana de Emacs.
other-buffer Regresa el buffer ms recientemente seleccionado (uno distinto al que se pasa como
parmetro a other-buffer y al buffer actual).
switch-to-buffer Selecciona un buffer para que Emacs est activo en l, y lo despliega en la
ventana para que los usuarios puedan verlo. Usualmente est ligada a C-x b .
set-buffer Cambia la atencin de Emacs a un buffer donde los programas corrern. No altera lo
que se est viendo en la ventana.
buffer-size Regresa el nmero de carcteres en el buffer actual.
point Regresa el valor de la posicin actual de punto, como entero; esto es igual al nmero de
carcteres desde el inicio del buffer.
point-min Regresa el mnimo valor permisible para el punto en el buffer actual. Esto es 1, a menos
que narrowing est activo.
point-max Regresa el mximo valor permisible para el punto en el buffer actual. Esto es el nal
del buffer, a menos que narrowing est activo.
Actividad 9.36 Escribe una funcin no interactiva que duplique el valor de su argumento. Despus
haz la funcin interactiva.
Actividad 9.37 Escribe una funcin que pruebe si el valor actual de ll-column es mayor que el
argumento pasado a la funcin, y si lo es, que mande el mensaje apropiado al rea de eco.

9.5. Algunas funciones relacionadas con buffers


En esta seccin estudiaremos varias funciones de Emacs. Esto usualmente se llama walk through, que sera ms o menos equivalente a un paseo por. La idea es mostrarte ejemplos de
verdad de todo lo que hemos visto. Aprender viendo es una tcnica muy usada en programacin y
estamos seguros que te servir mucho, as que sintate cmodamente, respira hondo y pon atencin.
Las funciones que analizaremos aqu estn todas relacionadas con buffers; ms adelante veremos otro tipo de funciones. Describiremos cada funcin, en su momento, de manera breve; si te
interesa ver la documentacin completa de la funcin, puedes usar C-h f < nombre de la funcin> Enter ; o si es una variable C-h v <nombre de la variable> Enter .

9.5.1.

Denicin (simplicada) de beginning-of-buffer


La funcin beginning-of-buffer es una buena funcin para comenzar nuestro paseo por las
funciones de Emacs, ya que es sencilla y a estas alturas ya debes estar familiarizado con ella. Cuando

9.5 Funciones relacionadas con buffers

311

se usa interactivamente, beginning-of-buffer mueve el cursor al inicio del buffer, dejando la marca
en la posicin previa. Usualmente est ligada a M-< .
Sin ms, aqu est nuestra denicin simplicada (es simplicada porque la versin real maneja
una opcin compleja adems del comportamiento que hemos descrito):
1
2
3
4
5
6

( d e f u n s i m p l i f i e d b e g i n n i n g ofb u f f e r ( )
" Mueve e l p u n t o a l i n i c i o d e l b u f f e r ;
d e j a n d o l a marca en l a p o s i c i o n a c t u a l . "
( interactive )
( pushmark )
( g o t o c h a r ( p o i n t min ) ) )

Nota que tiene sus cinco partes como toda buena denicin. La parte que no conoces an, es el
cuerpo de la funcin, que en este caso consta de dos expresiones:
5
6

( pushmark )
( g o t o c h a r ( p o i n t min ) )

La primera de ellas, (push-mark), al ser evaluada por el intrprete lo que hace es poner la marca
en la posicin actual del cursor, en donde sea que ste est. Dicha posicin se guarda en el anillo de
marcas (Emacs tiene varios tipos de anillos, el de marcas, el de la muerte y otros y todos son muy
tiles).
La siguiente lnea, (goto-char (point-min)), mueve el cursor a la primera posicin del buffer.
Por qu poner la marca en el lugar anterior? A primera vista no parece obvio, pero en la prctica
uno usualmente desea regresar al inicio del buffer temporalmente, como por ejemplo para hacer un
pequeo ajuste en las lneas iniciales, para revisar algn dato o alguna otra actividad. Sin embargo,
el punto ms importante es usualmente el de edicin ms reciente, as que poniendo la marca en l
es fcil regresar a ese punto (prueba, por ejemplo, C-x C-x ).
Cuando veamos funciones que desconozcas, por ejemplo goto-char, recuerda que puedes usar
C-h f , seguido del nombre de la funcin, para terminar con Enter para obtener su documentacin.
Actividad 9.38 Escribe la funcin simplied-end-of-buffer.

La denicin de mark-whole-buffer
Esta funcin, mark-whole-buffer, no es ms difcil que nuestra versin simplicada de beginningof-buffer y, a diferencia de aqulla, sta no est simplicada; veremos la versin real.
Lo que hace mark-whole-buffer es poner el punto al inicio del buffer y la marca al nal; no es
tan usada como las anteriores, pero es importante. Usualmente est ligada a C-x h . Luce as:
1 ( d e f u n markwholeb u f f e r ( )
2
" Pone e l p u n t o a l i n i c i o y l a marca a l f i n a l d e l b u f f e r . "
3
( interactive )
4
( pushmark ( p o i n t ) )
5
( pushmark ( p o i n t max ) )
6
( g o t o c h a r ( p o i n t min ) ) )

312

Extendiendo tu ambiente
En esta funcin, las ltimas dos expresiones ponen la marca al nal del buffer y la otra mueve
el punto a la primera posicin. Pero, por qu aparece (push-mark (point)) como primera lnea del
cuerpo? Nuevamente, la idea detrs de esto es que la posicin actual (antes de llamar a mark-wholebuffer) es la posicin de edicin, la ms importante actualmente en el buffer; la prctica indica que
cuando uno marca todo el buffer, lo hace con la intencin de reformatearlo, re-indentarlo, copiarlo,
o algo similar, pero despus de eso, uno desea regresar a la posicin previa de edicin.
Cmo regresamos a esa posicin? Pues es muy sencillo. Recuerda que dijimosq que pushmark empuja la marca a un anillo que puedes recorrer; por omisin C-x C-x te lleva a la posicin previa de la marca, y ya sabes que CSpace pone la marca. Pues CSpace , que en
realidad es un ligado de la funcin set-mark-command, hace ms que eso: si le pasas un argumento prejo, brinca a esa marca en el anillo local de marcas; vamos, intntalo! Ejecuta dos veces
C-u CSpace y ve lo que sucede!

La denicin de append-to-buffer
La funcin append-to-buffer copia una regin (la regin actual en el buffer actual) a un buffer
especicado. Usaremos la funcin insert-buffer-substring para copiar la regin; como es de esperarse, esta ltima recibe dos posiciones, la inicial y la nal, y el buffer del cual debe extraer la
subcadena comprendida entre dichas posiciones.
Esas posiciones no son otras que el punto y la marca (que rodean la regin) en el buffer actual;
aqu est nuestra denicin:
( d e f u n appendt o b u f f e r ( b u f f e r s t a r t end )
" Agrega e l t e x t o de l a r e g i n a l BUFFER .
Es i n s e r t a d o en BUFFER a n t e s de s u p u n t o .
Cuando e s l l a m a d a d e s d e un p r o g r a m a r e c i b e t r e s a r g u m e n t o s :
un b u f f e r o s u nombre , y d o s numeros e s p e c i f i c a n d o e l a r e a
a copiar ."
( i n t e r a c t i v e " BAgregar a l b u f f e r : \ n r " )
( l e t ( ( o l d b u f ( c u r r e n t b u f f e r ) ) )
( s a v e e x c u r s i o n
( s e t b u f f e r ( g e t b u f f e r c r e a t e b u f f e r ) )
( i n s e r t b u f f e r s u b s t r i n g o l d b u f s t a r t end ) ) ) )

Analiza parte por parte la funcin y vers que no hay muchas cosas nuevas; lo que si tiene es
una mezcla funcional de varias cosas que vimos muy por encima. Primero te conviene probarla para
que veas cmo funciona y eso aclarar mucho. Visita un archivo de prueba en un buffer, marca una
regin (pon la marca y mueve el punto un par de lneas abajo, por ejemplo). Ahora regresa al buffer
*scratch*, copia y evala esta funcin y pon el punto al nal del buffer.
A continuacin, regresa al buffer del archivo que acabas de abrir (donde pusiste la marca y el
punto anteriormente) y llama a la funcin: M-x append-to-buffer. Te pide un buffer, te propondr el
ms reciente (si hiciste lo que acabo de decir, debe ser *scratch*); presiona Enter y vers aparecer
la regin en el buffer *scratch*.
Muy bien. Ahora, qu es lo que pas? Vamos por partes:

9.5 Funciones relacionadas con buffers

313

1. Slo necesitamos tres argumentos, el nombre del buffer al que vamos a copiar (destino) y
las posiciones del punto y la marca en el buffer fuente. Nota que no necesitamos tambin el
nombre del buffer fuente, porque para que la funcin haga lo que esperas que haga, tienes
necesariamente que estar en dicho buffer.
2. La forma ( interactive "BAgregar al buffer : \ nr ") , solicita un buffer (el destino) y ya sabes
que r pasa como dos argumentos consecutivos las posiciones del punto y la marca. No slo eso,
r siempre pasa primero el ms pequeo, as que cuando llamemos a insert-buffer-substring,
que espera su segundo argumento sea menor o igual que su tercer argumento, no tendremos
ningn problema.
3. El cuerpo consta de una expresin let, que es la primera que vemos en accin. La usamos para
guardar el buffer actual (el fuente) en una variable local llamada oldbuf. Por qu? Porque
tenemos que cambiar de buffer (al destino) para poder insertar la subcadena.
4. Nota tambin el uso de save-excursion, que con la explicacin del punto anterior ya debe ser
obvio. Lo usamos aqu (antes de cambiar de buffer) para que guarde la informacin adecuada
y nos regrese aqu cuando acabe la funcin.
5. set-buffer es nueva, aunque ya la habamos explicado en el la seccin 9.4.5. Lo que hace es
cambiar la atencin de Emacs (si no est en la ventana, no aparecer por la accin de esta funcin) al buffer que recibe como parmetro. En este caso, le dice a Emacs, ( set buffer ( getbuffercreate
que se cambie al buffer destino, pero oh sorpresa! aqu nos encontramos con otra funcin nueva: get-buffer-create, y, para no variar con los nombres largos y auto-explicativos de Emacs,
esta funcin recibe una cadena o un buffer como argumento. Si es un buffer se mueve a ese
buffer; si es una cadena, busca un buffer con ese nombre y se mueve a l; nalmente, si es una
cadena pero no hay ningn buffer en Emacs con ese nombre, crea uno nuevo y se mueve a l.
6. Por ltimo, tenemos ( insert buffersubstring oldbuf start end) que lo nico que hace es cortar la subcadena comprendida entre start y end en nuestro buffer origen (recuerda que guardamos su contenido en la variable oldbuf) y luego insertarla en la posicin actual.

9.5.2.

Resumen
Aqu est un resumen de las funciones que acabamos de revisar:
describe-function Imprimen la documentacin de una funcin o una variable.
describe-variable Usualmente estn ligadas a C-h f y C-h v , respectivamente.
push-mark Pone la marca en una localidad particular y almacena el valor de la marca anterior en
el anillo de marcas. La marca es una posicin en el buffer que mantendr su posicin relativa
aun cuando sea agregado o eliminado texto del buffer.
goto-char Pone el punto en la posicin especicada por el valor de su argumento, que puede ser
un nmero, un marcador, o una expresin que regresa el nmero de una posicin, tal como
(point-min).
insert-buffer-substring Copia una regin de texto de un buffer, que se pasa como argumento a
la funcin en el buffer actual.

314

Extendiendo tu ambiente
mark-whole-buffer Marca todo el buffer como una regin. Usualmente est ligado a C-x h .
set-buffer Cambia la atencin de Emacs a otro buffer, pero no cambia la ventana que est siendo
desplegada. Se usa cuando un programa (a diferencia de un humano) va a trabajar en un buffer
distinto.
get-buffer-create Encuentra un buffer nombrado o crea uno si un buffer con ese
get-buffer nombre no existe. La funcin get-buffer regresa nil si el buffer nombrado no existe.
Actividad 9.39 Usa if y la funcin get-buffer para construir una funcin interactiva que imprima
un mensaje diciendo si un buffer dado existe o no.

9.6. Funciones fundamentales: car, cdr, cons


En elisp, car, cdr y cons son funciones fundamentales. La funcin cons se usa para construir
listas, mientras que las funciones car y cdr se usan para descomponerlas.
Retrasamos la discusin de estas funciones hasta este momento, porque para hacer cosas interesantes usando estas funciones fundamentales era necesario que conocieras las formas especiales
que revisamos y que manejaras de mejor forma buffers, cadenas, etc.
La funcin cons es una abreviatura de la palabra construct y sirve justamente para construir
listas. Las otras dos funciones, desgraciadamente, tienen nombres esotricos, y desafortunados porque no signican absolutamente nada til; por razones histricas se siguen usando y en funciones
de Emacs siguen apareciendo, as que aqu tambin los usaremos. Pero puedes pensar en ellas como primer elemento, el car, y el resto de la lista, el cdr (que por cierto, se pronuncia could-er en
ingls).
Tambin presentaremos rpidamente varias funciones utilitarias ms, como length, setcar,
nthcdr y nthcdr. Culminaremos la seccin y este breve curso de Emacs elisp revisando copyregion-as-kill, una funcin de Emacs muy til y relativamente ms compleja que todas las anteriores.

9.6.1. car y cdr


El car de la lista es simplemente el primer elemento de la lista. El car de la lista (rosa violeta
clavel azucena) es rosa. Intenta evaluar lo siguiente:
( car

( rosa v i o l e t a c l a v e l azucena ) )

Vers que el smbolo rosa aparece en el rea de eco. Un mejor nombre sera rst (y de hecho
este nombre tambin existe en Emacs elisp; est denido como un alias de car en el paquete cl.el).
El car no remueve el primer elemento de la lista, esto es, despus de aplicar car a una lista, la
lista sigue siendo la misma. En el cal de elisp, esto signica que car es una funcin no destructiva.

315

9.6 Funciones fundamentales

cdr de una lista es el resto de la lista, esto es, cdr regresa la parte de la lista que sigue al
primer elemento. De tal forma que (cdr (rosa violeta clavel azucena)) regresa (violeta clavel
azucena).
Al igual que car, cdr no remueve ningn elemento de la lista. Claramente, un mejor nombre
para cdr sera rest y al igual que rst, rest tambin existe (en el paquete cl.el) y es un alias de cdr.
Cuando car y cdr se aplican a listas de smbolos (como en los ejemplos anteriores) el elemento
de la lista regresado por car es rosa sin parntesis, como smbolo. Sin embargo, el cdr de la lista es
siempre otra lista.
Por otro lado, en una lista de listas, el primer elemento es una lista. car regresa este primer
elemento como lo que es: una lista. Por ejemplo, evala el siguiente ejemplo:
( car

( ( l e n t i g r e c h i t a )
( gazela antlope zebra )
( b a l l e n a d e l f n t i b u r n ) ) )

Esta funcin regresa la lista de animales carnvoros, (len tigre chita), mientras que el cdr de esa
lista es la lista: ((gazela antlope zebra) (ballena delfn tiburn)).

cons
La funcin cons construye una lista; es la inversa de car y cdr. Por ejemplo, cons puede usarse
para hacer una lista de cuatro elementos a partir de una lista de slo tres elementos, agregando uno
al principio as:
( cons r o s a

( v i o l e t a c l a v e l azucena ) )

Despus de evaluar esa expresin vers a nuestra querida y vieja amiga, la lista (rosa violeta
clavel azucena) aparecer en el rea de eco.
cons siempre requiere una lista como segundo argumento y lo que regresa es una nueva lista
cuyo car es el primer argumento y cuyo cdr es su segundo argumento (la lista). No puedes empezar
una lista a partir de nada, necesitas empezarla a partir de la lista vaca. Por ejemplo, evala las
siguientes expresiones en secuencia:
( cons
( cons
( cons
( cons

azucena
clavel
violeta
rosa (

())
( azucena ) )
( c l a v e l azucena ) )
v i o l e t a c l a v e l azucena ) )

Nota que en la primera expresin estamos usando a ( ) como la lista vaca, pero recuerda que es
exactamente lo mismo que usar nil .

Encontrar la longitud de una lista: length


Puedes usar la funcin length de elisp para saber cuntos elementos tiene una lista, como en
los siguientes ejemplos:
( length
( length

( azucena ) )
( daisy buttercup ) )

316

Extendiendo tu ambiente
( length ())

Los valores que obtendrs una vez que evales las expresiones, representan el nmero de elementos en cada lista, 1, 2 y 0 respectivamente.

nthcdr
La funcin nthcdr est asociada con la funcin cdr. Lo que hace es aplicar cdr repetidamente.
Si sacas el cdr de la lista ( rosa violeta clavel azucena) obtendrs la lista ( violeta clavel azucena).
Si ahora sacas el cdr de esta nueva lista, obtendrs ( clavel azucena); (nota que si sacas dos
veces el cdr de la misma lista, obtendrs lo mismo, ya que es no destructiva). Es decir, si evalas
(cdr (cdr ( rosa violeta clavel azucena ))) obtendrs ( clavel azucena).
La funcin nthcdr hace lo mismo que repetidas llamadas a cdr anidadas. En el siguiente ejemplo, el argumento 2 se pasa a la funcin nthcdr, junto con la lista, y el valor que regresa es la lista
sin los dos primeros elementos, que es lo mismo que aplicar dos veces cdr en cadena.
( nthcdr 2 ( rosa v i o l e t a c l a v e l azucena ) )

Actividad 9.40 Usando la lista original, ( rosa violeta clavel azucena), aplica nthcdr pasndole
argumentos numricos del 0 al 5. Puedes explicarlo? Si no puedes, entonces aplica el mismo
nmero de veces (de manera anidada) cdr a la misma lista. Ahora s, explcalo.

setcar
Como te puedes imaginar por sus nombres, las funciones setcar y setcdr (que veremos en un
momento) asignan nuevos valores al car y al cdr de una lista. En realidad cambian la lista original,
a diferencia de car y cdr que son no destructivas. Una forma de entender cmo funciona esto es
experimentando. Empezaremos con la funcin setcar.
Primero, podemos hacer una lista y luego asignar a una variable dicha lista, utilizando la funcin
setq. Aqu est una lista de animales:
( setq animales

( g i r a f a a n t i l o p e t i g r e leon ) ) .

Evala las siguientes expresiones. Una vez evaluadas, puedes conrmar que la variable animales
ahora apunta a la lista ( girafa antilope tigre leon) . A continuacin, evala la funcin setcar pasndole dos argumento, la variable animales y el smbolo citado hipo; es decir, evala:
( s e t c a r animales hipo )

Vers el smbolo hipo aparecer en el rea de eco. Ahora evala nuevamente la variable animales y
notars que la lista ha cambiado.

setcdr
La funcin setcdr es similar a la funcin setcar, excepto que esta funcin cambia el segundo y
subsecuentes elementos de una lista en lugar del primero.

317

9.6 Funciones fundamentales

Por ejemplo, asigna el valor de una variable animalesdomesticables, evaluando la siguiente expresin:
( s e t q a n i m a l e s d o m e s t i c a b l e s

( c a b a l l o vaca oveja p e r r o ) )

Ahora, evala:
( s e t c d r a n i m a l e s d o m e s t i c a b l e s

( gato cocodrilo ) )

Vers la lista ( gato cocodrilo ) aparecer en el rea de eco. se es el valor de regreso de la funcin;
ahora verica su efecto secundario, evaluando animalesdomesticables.
Actividad 9.41 Construye una lista de aves evaluando varias expresiones cons. Guarda esa lista
en una variable, con setq. Investiga qu pasa cuando haces un cons de una lista con ella misma;
por ejemplo, qu pasa cuando haces (cons aves aves) , suponiendo, claro, que la variable donde
guardaste tu lista se llama aves. Reemplaza la primera ave de tu lista con un pez. Reemplaza el
resto de las aves en la lista con peces.

9.6.2.

Cortando y guardando texto


Cuando matas texto en un buffer, con alguno de los comandos que matan texto, Emacs guarda
ese texto en una lista para que puedas traerlo de nuevo a la vida con alguno de los comandos que
hacen yank. Por lo que la lista puede lucir ms o menos as:
( " un p e d a z o de t e x t o " " t e x t o f i n a l " )

La funcin cons puede usarse para aadir una pieza de texto a esta lista, como en:
( c o n s " o t r a p i e z a de t e x t o " ( " un p e d a z o de t e x t o " " t e x t o f i n a l " ) )

Y despus, con un uso apropiado de car y nthcdr puedes obtener de vuelta todas las secciones
de texto almacenadas en la lista. Por ejemplo, si quisieras el segundo elemento de la lista, podras
evaluar:
( c a r ( n t h c d r 1 ( " o t r a p i e z a de t e x t o "
" un p e d a z o de t e x t o "
" texto final ")))

que debe mostrar "un pedazo de texto ".


Las funciones de Emacs que hacen kill y yank en realidad son ms complejas. Para empezar, el
anillo de la muerte (equivalente a nuestra lista en el ejemplo anterior) es circular (de ah el nombre
de anillo) por lo que una vez que llegas al ltimo elemento, si quieres seguir buscando partes de
texto en el anillo, te debe llevar al primero de la lista.
La funcin principal de este captulo tiene que ver con el anillo de la muerte y cmo se usa. Para
que te vayas aclimatando, primero te mostraremos una funcin llamada zaptochar.

318

Extendiendo tu ambiente

zap-to-char

La funcin zap-to-char elimina el texto en la regin comprendida entre la localizacin del


cursor (i.e. el punto) y la siguiente aparicin de un carcter (incluido este ltimo) dado. El texto que
zap-to-char elimina se guarda en el anillo de la muerte; y puede sacarse de ah con C-y (yank). Si
se le pasa un argumento prejo, entonces elimina el texto hasta encontrar ese nmero de presencias
del carcter.

Entonces, si el cursor estuviera al inicio de esta oracin y el carcter fuera s, Entonces, sera
eliminada. Si el argumento prejo fuese 2, Entonces, s sera eliminado.

Para determinar cunto texto tiene que ser eliminado, zap-to-char utiliza una funcin de bsqueda. Las bsquedas se usan extensivamente en el cdigo que manipula texto en Emacs, por lo que
mientras revisamos estas funciones te rogamos pongas especial atencin en la funcin de bsqueda
y en la de borrado.

9.6 Funciones fundamentales

319

( d e f u n zapt o c h a r ( a r g c h a r )
" Mata e l t e x t o h a s t a l a ARG s i m a a p a r i c i n de CHAR.
Va h a c i a a t r s s i ARG e s n e g a t i v o . Marca un e r r o r s i CHAR
no e s e n c o n t r a d o . "
( i n t e r a c t i v e " p \ ncZap t o c h a r : " )
( k i l l r e g i o n ( p o i n t )
( progn
( s e a r c h f o r w a r d ( c h a r t o s t r i n g c h a r ) n i l n i l a r g )
( point ) ) ) )

1
2
3
4
5
6
7
8
9

Analicemos ahora la funcin por partes:


1. La seccin interactiva, ( interactive "p\ncZap to char : ") , nos indica tres cosas:
a) El * le dice a Emacs que marque un error si el buffer est protegido contra escritura. O
en otras palabras, si es de slo lectura. Esto es obvio, porque si no podemos editarlo, no
podemos borrar texto alguno.
b) La p le dice a Emacs que la funcin recibir como primer argumento el argumento
prejo. ste ya lo conocas.
c) El \n separa los argumentos y la c le dice a Emacs que debe pedir un carcter, utilizando
para ello el prompt: Zap to char : .
2. El cuerpo de la funcin contiene la funcin que mata (esto es, que elimina) el texto de la
regin desde la posicin actual (la primera presencia de ( point ) ) hasta la posicin (incluida
ella) donde se encuentra el carcter. Esto es la primera parte:
6

( k i l l r e g i o n ( p o i n t ) . . .

La siguiente parte del cdigo utiliza la funcin progn. El cuerpo de progn consiste de llamadas
a search-forward y nuevamente a point. Es ms fcil entender el funcionamiento de progn
una vez que entiendas cmo funciona la bsqueda hacia adelante, search-forward, as que
primero veremos esta ltima y luego regresamos a progn.
3. La funcin search-forward se usa para localizar el carcter que marca la posicin hasta la que
queremos cortar el texto. Si la bsqueda es exitosa, deja el punto inmediatamente despus del
ltimo carcter en la cadena objetivo (en este caso, la cadena objetivo es slo de un carcter de
largo). Si la bsqueda es hacia atrs, deja el punto justo antes del primer carcter en la cadena
objetivo. Adems, search-forward regresa t para sealar verdadero, por lo que mover el punto
es un efecto secundario.
En zap-to-char, la llamada a la funcin search-forward luce como:
8

( s e a r c h f o r w a r d ( c h a r t o s t r i n g c h a r ) n i l n i l a r g )

La funcin search-forward toma cuatro argumentos:


a) El primer argumento es el objetivo, aquello que estamos buscando. ste debe ser una
cadena, tal como s.
Nota que en elisp, un carcter no es visto (automticamente) como una cadena de un
solo carcter. Por eso usamos (chartostring char) para transformar el carcter a una
cadena, como search-forward lo quiere.

320

Extendiendo tu ambiente
b) El segundo argumento limita la bsqueda; es una posicin especca en el buffer. En este
caso, la bsqueda puede ir hasta el nal del buffer, por lo que no estamos limitando la
bsqueda y entonces usamos nil .
c) El tercer argumento le dice a la funcin qu debe hacer si la bsqueda falla puede
sealar un error (e imprimir un mensaje) o puede regresar nil . Usar nil como tercer
argumento provoca que la funcin marque un error.
d) El cuarto argumento para search-forward es una cuenta de repeticin cuntas presencias de la cadena debe buscar. Este argumento es opcional y si la funcin se llama sin
una cuenta de repeticin, la funcin recibe por omisin 1. Si este argumento es negativo,
la bsqueda va hacia atrs.
En su forma general, search-forward se ve as:
( s e a r c h f o r w a r d

" cadena o b j e t i v o "


l m i t e del a b s q u e d a
queh a c e r s i l a b s q u e d a f a l l a
c u e n t a de r e p e t i c i n )

4. La funcin progn es tal que provoca que todos sus argumentos sean evaluados en secuencia y
luego regresa el valor del ltimo. Las expresiones previas (a la ltima) se evalan slo por sus
efectos secundarios, ya que sus valores de regreso se descartan.
Su forma general es:
( progn
cuerpo . . . )

En zap-to-char, la expresin progn tiene que hacer dos cosas: poner el punto en la posicin
correcta y luego regresar la posicin de ese punto para que kill-region pueda hacer su trabajo.
El primer argumento de progn es search-forward. El segundo argumento es (point). Esta
expresin regresa el valor del punto, que en este caso ser la localizacin a la que se ha movido
search-forward.
De acuerdo, de acuerdo, fue una explicacin muy larga. Lo sentimos, pero no conocas searchforward y progn, que son dos funciones muy tiles y muy usadas en elisp. As que aqu te va
un resumen de cmo funciona zap-to-char ahora que sabes cmo funcionan todas las funciones
auxiliares:
El primer argumento pasado a kill-region es la posicin del punto en el momento que ejecutas
zap-to-char. Dentro del progn, la funcin de bsqueda mueve el punto justo despus del carcter
hasta el que queremos cortar; point regresa el punto de esta nueva posicin. La funcin kill-region
pone estos dos valores juntos, el primero como inicio de la regin y el segundo como el punto nal
de sta y elimina la regin.
La funcin progn es necesaria porque kill-region recibe slo dos argumentos; y fallara si
search-forward y point fueran escritas en secuencia, en lugar de como argumentos de progn.
Es decir que progn es el segundo argumento de kill-region y su valor de regreso es el valor que
regresa ( point ) .
Obviamente, sta no es la nica manera de hacer esta funcin: bien pudimos haber guardado el
valor regresado por search-forward en una variable local (con let) y luego usarlo en kill-region.

9.6 Funciones fundamentales

321

Pero esta forma que hemos revisado, es la que se usa desde la versin 19 de Emacs y es ms elegante,
adems de que muestra el uso de una nueva funcin que te servir mucho: progn.

delete-region: nota cultural


La funcin zap-to-region que acabamos de ver utiliza a la funcin kill-region; sta a su vez
utiliza otras dos funciones, copy-region-as-kill, que veremos en un minuto, y delete-region. La
funcin delete-region es interesante y muy sencilla; lo nico que hace es borrar texto de forma tal
que no puedas recuperarlo.
Sin embargo, delete-region no est escrita en Emacs-elisp sino en C. Es una de las primitivas
de Emacs.

9.6.3.

Inicializacin de variables: defvar


sta es la ltima parada antes de poder explicar copy-region-as-kill y es importante, porque la
variable kill ring, el lugar donde se guardan todas las secciones de texto que se matan, se crea con
defvar.
La funcin defvar viene de dene variable y es una forma especial, similar a setq ya que
asigna un valor a una variable. Sin embargo, es distinta a setq en dos aspectos: primero, slo asigna
un valor a una variable si la variable an no tiene uno; si la variable ya tiene un valor, defvar
no sobreescribe su valor actual. Segundo, defvar tiene una cadena que sirve para documentar la
variable.
Para ver el valor actual de una variable cualquiera, usamos describe-variable, usualmente ligada a C-h v . Por ejemplo, checa lo que dice C-h v cuando le pasas kill-ring. Vers dos cosas
importantes: primero su valor, que puede ser muy pequeo o muy grande, dependiendo de cunto hayas matado en la sesin de Emacs hasta el momento; vers tambin su documentacin, que
comienza ms o menos as:
Documentation :
L i s t of k i l l e d t e x t sequences .

La denicin de kill-ring usando defvar puede ser:


( d e f v a r k i l l r i n g n i l
" L i s t of k i l l e d t e x t sequences . " )

Como puedes notar, su valor inicial es nil , que tiene sentido, ya que si no has guardado nada en
el anillo no esperaras que cuando quieras pegar (recuperar del anillo, o revivir)9 , algo apareciera,
o s?
9

No hay traduccin exacta para yank, pero en notacin de muchos otros editores de texto, equivaldra a
pegar, slo que es mucho ms poderoso porque tiene memoria.

322

Extendiendo tu ambiente

9.6.4. copy-region-as-kill
La funcin copy-region-as-kill copia una regin de texto del buffer en una variable que se llama
kill ring. Si llamas a kill-region-as-kill inmediatamente despus de haber ejecutado un kill-region,

Emacs junta la seccin de texto recin copiada con la anterior. Esto signica que si haces un yank
despus, obtendrs todo el texto de las ltimas dos operaciones de muerte. Por otro lado, si algn
otro comando precede a la accin de copy-region-as-kill, la funcin copia el texto en una entrada
separada en el anillo de la muerte.
Aqu est el cdigo de la funcin. Probablemente en versiones muy recientes de Emacs sea
distinto; de cualquier forma esta versin es lo sucientemente compleja e interesante para que la
analicemos aqu.
1
2
3
4
5
6
7
8
9
10
11

( d e f u n copyr e g i o n as k i l l ( beg end )


" S a l v a l a r e g i n como s i h u b i e s e s i d o matada , p e r o no l a mata . "
( interactive " r ")
( i f ( eq l a s t command k i l l r e g i o n )
( k i l l a p p e n d ( b u f f e r s u b s t r i n g beg end ) ( < end beg ) )
( s e t q k i l l r i n g
( c o n s ( b u f f e r s u b s t r i n g beg end ) k i l l r i n g ) )
( i f ( > ( l e n g t h k i l l r i n g ) k i l l r i n g max )
( s e t c d r ( n t h c d r (1 k i l l r i n g max ) k i l l r i n g ) n i l ) ) )
( s e t q t h i s command k i l l r e g i o n )
( s e t q k i l l r i n g yankp o i n t e r k i l l r i n g ) )

Si revisas con cuidado la denicin notars que tiene sus cinco partes. Los dos argumentos, beg
y end y el cdigo r de interactive (que regresa la regin, como dos argumentos numricos consecutivos) deben darte una idea respecto a qu hacen referente al inicio (beg, por beginning) y n (end)
de la regin. Los parmetros estn en ingls, porque cuando comiences a ver el cdigo de distintas
funciones de Emacs por tu cuenta, vers que la regin se usa exhaustivamente y curiosamente stos
son los nombre favoritos para nombres de parmetros en funciones que manejan la regin.
El cuerpo de la funcin comienza con un if lnea 4 . Nos sirve para distinguir dos tipos de
situaciones: saber si el comando ejecutado inmediatamente antes que ste fue (o no) un kill-region.
En caso de que haya sido, la nueva regin muerta se pega a la anterior. En caso contrario, se inserta
(la regin muerta) al inicio del anillo de la muerte.
Las ltimas expresiones son setq. Una asigna a la variable this command el valor kill region
y la otra hace que la variable kill ringyankpointer apunte al anillo de la muerte.
El cuerpo del copy-region-as-kill amerita una discusin ms detallada y la mostramos a continuacin:

El cuerpo
La funcin copy-region-as-kill fue escrita con sumo cuidado para poder:

9.6 Funciones fundamentales

323

Fusionar uno o ms comandos que matan en una sola pieza de texto que pudiera ser pegada
nuevamente con un solo comando. No tienes idea lo til que es esto, pero eventualmente lo
sabrs.
Todo lo que matas (o los comandos que matan hacia adelante) se aaden al nal del texto copiado previamente, y los comandos que copian o matan texto en reversa se copian al principio
del texto copiado previamente. De esta manera, las palabras en el texto (que se va pegando) se
mantienen en el orden correcto.
La funcin hace uso de dos variables para mantener el rastro de los comandos actual y anterior
que ejecut Emacs. Las dos variables son this command y last command.
Normalmente, siempre que una funcin se ejecuta Emacs asigna esa funcin a this command,
en este ejemplo copy-region-as-kill. Al mismo tiempo, Emacs asigna el valor de last command al
valor anterior de this command. Sin embargo, el comando copy-region-as-kill es diferente; asigna
el valor de this command a kill region, que es el nombre de la funcin que llama a copy-regionas-kill.
En la primera parte del cuerpo de copy-region-as-kill, una expresin if determina si el valor de
last command es kill-region. Si lo es, la parte entonces del if se evala; usa la funcin kill-append
para concatenar el texto copiado con esta llamada al texto que ya se encuentra en la primera posicin
del anillo de la muerte. Por otro lado, si el valor de last command no es kill-region, entonces la
funcin copy-region-as-kill agrega un nuevo elemento al anillo de la muerte.

La funcin kill-append
La funcin kill-append que se usa en la denicin de copy-region-as-kill se muestra a continuacin:
( d e f u n k i l l a p p e n d ( s t r i n g b e f o r e p )
( s e t c a r k i l l r i n g
( i f b e f o r e p
( c o n c a t s t r i n g ( c a r k i l l r i n g ) )
( c o n c a t ( c a r k i l l r i n g ) s t r i n g ) ) ) )

Como siempre, podemos analizarla por partes (nota que no tiene documentacin). La funcin
setcar utiliza concat para concatenar el nuevo texto al car del anillo de la muerte. Si pre-agrega o
post-agrega, depende del resultado de la expresin if:
( i f b e f o r e p
( c o n c a t s t r i n g ( c a r k i l l r i n g ) )
( c o n c a t ( c a r k i l l r i n g ) s t r i n g ) )

Si la regin que se est matando est antes que la regin que mat el ltimo comando, entonces
debemos agregar antes (pre-agregar) el texto; contrariamente, si el texto muerto sigue a lo que se
mat con anterioridad, entonces debemos agregarlo despus. La expresin if depende del predicado
beforep para decidir si el texto nuevo debe ir antes o despus de lo que est en el car del anillo de
la muerte.
El smbolo beforep es el nombre de uno de los argumentos de kill-append. En la funcin
copy-region-as-kill su valor se calcula con (< end beg), lo que es verdadero cuando el texto que

324

Extendiendo tu ambiente
estamos cortando va antes que los que estn en el car del anillo de la muerte (y por ende ser
pre-agregado).
Pre-agregar est representado por:
( c o n c a t s t r i n g ( c a r k i l l r i n g ) )

Post-agregar por:
( c o n c a t ( c a r k i l l r i n g ) s t r i n g )

Para entender cmo funciona esto, primero necesitamos entender cmo funciona concat. La
funcin concat liga o une dos cadenas de texto. El resultado es una cadena. Por ejemplo,
( c o n c a t " abc " " def " )

regresa "abcdef".
Ahora s, podemos entender rpidamente cmo funciona kill-append: modica el contenido
del anillo de la muerte. La funcin setcar cambia en realidad el primer elemento de la lista. Logra
esto usando concat para reemplazar el viejo contenido del primer elemento del anillo con un nuevo
primer elemento que se obtiene concatenando el viejo texto con el nuevo (el texto recin muerto,
esto es). El nuevo texto se pone antes que el viejo o al revs, dependiendo de si estaba antes o
despus en el buffer, respectivamente.

La parte nal de copy-region-as-kill


Muy bien; despus de haber entendido cmo funciona copy-region-as-kill cuando el comando
previo fue tambin un kill-region, ahora tenemos que ver la ltima parte: qu pasa cuando el
comando previo no fue kill-region?
Lo que hace es asignar como valor al anillo de la muerte una nueva lista que es igual a la anterior,
pero ahora como primer elemento tiene el texto recin cortado. Esto se logra con la seccin:
6
7

( s e t q k i l l r i n g
( c o n s ( b u f f e r s u b s t r i n g beg end ) k i l l r i n g ) )

La siguiente parte es nuevamente una expresin if. Esta expresin sirve nicamente para mantener acotado el tamao del anillo de la muerte; usualmente su valor es 30. Es decir, evita que el
anillo de la muerte guarde ms all del valor que tenga kill-ring-max. Esto se logra con la seccin
de cdigo:
8
9

( i f ( > ( l e n g t h k i l l r i n g ) k i l l r i n g max )
( s e t c d r ( n t h c d r (1 k i l l r i n g max ) k i l l r i n g ) n i l ) )

Lo que dice esta expresin if es que si pasa del tamao permitido, entonces convierte en nil el
ltimo elemento del anillo de la muerte. Ya vimos las funciones setcdr y nthcdr as que esto no
debe parecerte tan extrao. Salvo quiz por el uso de la funcin llamada 1, que resta uno a su
argumento.
A continuacin siguen dos asignaciones en el cdigo de copy-region-as-kill, la primera:

9.6 Funciones fundamentales

10

325

( s e t q t h i s command k i l l r e g i o n )

Nota que estas dos expresiones no son parte del if anterior, por lo que se ejecutan siempre
que se ejecute la funcin. Lo nico que hace es guardar el smbolo kill region en la variable
this command, por lo que si volvemos a copiar algn texto inmediatamente despus, ste ser
pegado al car del anillo de la muerte.
Finalmente, la ltima lnea
11

( s e t q k i l l r i n g yankp o i n t e r k i l l r i n g )

actualiza el apuntador global kill ringyankpointer que dice en todo momento cul es el siguiente
texto a revivir. Esta variable es usada por yank y yank-pop, pero, por cuestiones de espacio, ya no
ceremos estas dos ltimas funciones veremos aqu.

9.6.5.

Resumen
Aqu est un resumen de las funciones que introdujimos recientemente:
car Regresa el primer elemento de una lista.
cdr Regresa el resto de la lista.
nthcdr Regresa el resultado de sacar el cdr n veces a una lista.
cons Construye una lista agregando su primer argumento como primer elemento a la lista que
recibe como segundo argumento. Si no recibe una lista como segundo argumento, entonces
crea lo que se conoce como una lista impropia, aunque todo lo que se puede hacer con listas
impropias se puede hacer con listas normales, as que no debera preocuparte.
setcar Cambia el primer elemento de una lista.
setcdr Cambia el resto de una lista.
progn Evala cada uno de sus argumentos en secuencia y regresa el valor del ltimo, descartando
todos los valores intermedios.
search-forward Busca una cadena y si la encuentra, mueve el punto. Recibe cuatro argumentos:
1. La cadena a buscar (objetivo).
2. Opcional, un lmite para la bsqueda.
3. Opcional, qu hacer si falla, regresa nil o un mensaje de error.
4. Opcional, cuntas veces repetir la bsqueda; si el argumento es negativo, busca hacia
atrs.
kill-region Corta el texto entre el punto y la marca del buffer y lo guarda en el anillo de la muerte,
para que puedas revivirlo con yank.
delete-region Elimina el texto entre el punto y la marca del buffer y lo descarta. No puedes
recuperarlo.
copy-region-as-kill Copia el texto entre el punto y la marca al anillo de la muerte para que
puedas recuperarlo. La funcin ni corta ni mueve el texto del buffer.

326

Extendiendo tu ambiente
Actividad 9.42 Escribe una funcin interactiva que busque una cadena. Si la bsqueda encuentra
la cadena, deja el punto despus de sta y despliega el mensaje La encontr. (NO utilices searchforward como el nombre de tu funcin; si lo haces, sobre-escribirs la funcin existente que viene
con Emacs. Usa un nombre como busca.)
Actividad 9.43 Escribe una funcin que imprima el tercer elemento del anillo de la muerte en el
rea de eco, si existe, claro. Si el anillo de la muerte no tiene un tercer elemento, manda un mensaje
apropiado.

9.7. Lluvia de funciones tiles de Emacs-elisp


Ponte cmodo y reljate, ya que en esta seccin no hay ejercicios, slo funciones y explicaciones
breves. Sin embargo, si las tecleas y pruebas, estamos seguros que te divertirs, las entenders mejor
y te sern tiles como patrones para funciones futuras.

9.7.1.

Quin o qu es ASCII?
Es comn imprimir la tabla de carcteres ASCII10 , pero obviamente hacerlo tecleando carcter
por carcter no es precisamente una idea brillante. Por un lado son 128 carcteres (27 ) en el ASCII
estndar y 256 en el extendido (28 ). Aqu est una funcin en elisp que lo hace por nosotros.
( d e f u n show a s c i i ( )
" M u e s t r a e l ASCII como una l i s t a de p a r e j a s . "
( interactive )
( l e t (( counter 0))
( dotimes ( i 256)
( i n s e r t ( f o r m a t "( %d, %c ) " i i ) )
( when ( eq c o u n t e r 1 0 )
( insert "\ n ")
( setq counter 0))
( setq counter ( incf counter ) ) ) ) )

Slo evala la funcin; despus muvete a un buffer que puedas editar y ejecuta
M-x showascii y vers aparecer varias lneas, cada una con diez o menos de tales parejas. Por
ejemplo, la sptima lnea debe lucir as:
( 6 1 , = ) ( 6 2 , > ) ( 6 3 , ? ) ( 6 4 ,@) ( 6 5 ,A) ( 6 6 , B) ( 6 7 , C) ( 6 8 ,D) ( 6 9 , E ) ( 7 0 , F )

y que puedes leer cmo el cdigo ASCII de A es 65, el de B es 66 y as sucesivamente.


10
ASCII son las siglas de American Standard Code for Information Interchange, aunque se utiliza para
referirnos al conjunto de codicacin que predomin hasta hace un par de aos. Hoy da Unicode es el
estndar de facto para codicacin.

9.7 Lluvia de funciones

327

Lo ms interesante de esta funcin es el uso de la funcin dotimes que, como su nombre indica,
hace algo un cierto nmero de veces. Tiene la siguiente sintaxis:
( d o t i m e s (VAR COUNT [ RESULT ] ) BODY . . . )

Evala BODY ligando VAR a un entero sucesivo desde 0 (cero) inclusive, hasta COUNT (no
incluido). Despus evala RESULT, para obtener el valor de regreso, o regresa nil por omisin.
Ahora ya debe ser obvio cmo funciona la funcin show-ascii: primero inicializa el contador
lstinline|counter| en 0; utiliza i como ndice para recorrer todos los posibles valores ASCII desde
0 hasta 255 (recuerda que el 256 no est incluido) y va imprimiendo cada valor numrico y su
correspondiente carcter. Esto lo hace la funcin format. Lo que sigue, sirve para agregar una nueva
lnea cada que hemos impreso diez parejas y no tiene mayor complicacin.

9.7.2.

Cmo numerar una regin de lneas?


Algo que puede ser muy til, aunque sea poco comn, es numerar una lista de objetos, digamos
la lista de tus libros que casualmente tienes escrita en un archivo. Con lo que sabes de edicin lo
podras hacer ms o menos as: visitas el archivo en un buffer de Emacs, te mueves al primer carcter
de la primera lnea y tecleas 1. ; luego te mueves a la siguiente lnea, regresas a la primera posicin
en la lnea y tecleas 2. ; y as sucesivamente.
No suena muy difcil. Con un poco de prctica podras llegar a la primera posicin de la siguiente lnea con teclear slo dos combinaciones de teclas y agregar un nmero (uno o ms dgitos), un
punto, un guin y un espacio; son slo unos cuantos carcteres ms. Y en efecto, es muy sencillo.
Desgraciadamente t tienes 8272 libros en tu lista! Adems, como eres muy escrupuloso quieres
que todos los ttulos de tus libros comiencen en la misma columna, o lo que es lo mismo quieres que
la numeracin agregue exactamente el mismo nmero de carcteres a cada lnea. No hay problema,
aqu esta una funcin en elisp que lo hace:
1
2
3
4
5
6
7
8
9
10
11

( d e f u n numera ( beg end )


" Numera l a s l i n e a s en l a r e g i n . "
( interactive " r ")
( l e t ( ( l i n e s ( c o u n t l i n e s beg end ) )
( p a d d i n g ( l e n g t h ( i n t t o s t r i n g l i n e s ) ) ) )
( g o t o c h a r beg )
( dotimes ( l i n e l i n e s )
( i n s e r t ( format
( c o n c a t " %" ( f o r m a t " % cd " p a d d i n g ) " d. " )
(1+ l i n e ) ) )
( f o r w a r d l i n e 1 ) ) ) )

Hay pocas cosas nuevas en esta funcin. Por ejemplo, la funcin count-lines (lnea 4) que
regresa el nmero de lneas que hay en la regin; la funcin int-to-string (lnea 5) que convierte un
entero a una cadena. Todo lo dems debe ser medianamente obvio, salvo quiz por el detalle de la
variable llamada padding (lnea 5), que la usamos para saber de cuntas posiciones tiene que ser la
cadena que vamos a agregar.

328

Extendiendo tu ambiente
El razonamiento que usamos fue el siguiente: si hay seis lneas en la regin, entonces el grueso
de la cadena que tenemos que agregar en cada lnea es: un carcter (para el dgito de la lnea),
un carcter para el punto, uno para el guin y un espacio, en total cuatro. Pero si hay 28 lneas,
entonces necesitamos un carcter ms (los primeros nueve sern de un dgito y tendrn un espacio
a la izquierda del dgito) y los siguientes ya son de dos, y as sucesivamente. Pues bien, padding
lnea 9 es justamente el nmero de carcteres que debe ocupar el nmero de lnea, y format
entiende ese parmetro y agrega los espacios en blanco necesarios a la izquierda del nmero.

9.7.3.

Indentar es un placer, borrar espacios en blanco un martirio

Una de los aspectos ms interesantes de Emacs es que sabe cmo indentar el texto de mis
programas. Sin embargo, como casi cualquier otra cosa en esta vida, no es perfecto. Por ejemplo,
digamos que al nal de una lnea pongo un carcter que abre un nuevo bloque (sin importar el
lenguaje de programacin). Emacs detecta el carcter e inserta una nueva lnea y luego, digamos
otros siete espacios en blanco para que comiences a poner el cuerpo del bloque. En la mayora
de los casos esto es una bendicin. Sin embargo, supongamos que tecle un carcter de ms en
la lnea anterior (cerca del nal de la lnea), cmo regreso? Lo ms probable es que intente usar
BackSpace para borrar el carcter y continuar.
Lo que en realidad sucede es que tienes que teclear ocho o diez veces BackSpace , en lugar
de slo una o dos, porque primero borras todos los espacios blancos que agreg Emacs. Claro,
te preguntars por qu no utilizar las funciones de posicionamiento de cursor y luego borramos y
listo. Pues por muchas razones, la primera de ellas que usualmente uno sabe lo que tecle mal casi
instantneamente. Tus dedos viajan en el teclado ms rpido de lo que lees, y mientras detectas
el error uno o dos carcteres ms ya fueron impresos; lo natural, o instintivo si as lo preeres,
es inmediatamente teclear dos o tres veces (dependiendo de qu tan lejos est el error) la tecla
BackSpace y continuar editando.
Algunos modos ya incluyen variables que modican el comportamiento de la funcin que se
ejecuta cuando presionamos BackSpace , pero algunos no. Aqu est una versin de una funcin
que borra inteligentemente todos los espacios en blanco hasta llegar a un carcter no blanco y
despus el cdigo para instalarla en Emacs:

9.7 Lluvia de funciones

1
2
3
4
5
6
7
8
9
10
11
12
13
14

329

( d e f u n mye l e c t r i c d e l e t e ( a r g )
" B o r r a e l c a r z c t e r p r e c e d e n t e o b l a n c o s e s p a c i o s ,
t a b u l a d o r e s , y n u e v a s l i n e a s . S i myhungry d e l e t e key no
e s n i l , e n t o n c e s t o d o s l o s b l a n c o s que p r e c e d e n l a p o s i c i n
a c t u a l son b o r r a d o s . "
( i n t e r a c t i v e "P ")
( i f ( o r ( n o t myhungry d e l e t e key )
arg )
( f u n c a l l myd e l e t e f u n c t i o n ( p r e f i x n u m e r i c v a l u e a r g ) )
( l e t ( ( here ( point ) ) )
( s k i p c h a r s b a c k w a r d " \ t \ n " )
( i f (/= ( point ) here )
( d e l e t e r e g i o n ( p o i n t ) h e r e )
( f u n c a l l myd e l e t e f u n c t i o n 1 ) ) ) ) )

Primero, nota como el if (linea 7) nos sirve para discernir los casos que maneja la funcin. Si la
variable myhungrydeletekey, que no aparece en el cuerpo de la funcin, es nil o si le pasamos
un argumento numrico a la funcin, entonces se ejecuta:
8

( f u n c a l l myd e l e t e f u n c t i o n ( p r e f i x n u m e r i c v a l u e a r g ) )

En esta lnea hay dos funciones nuevas, pero ambas son triviales: prex-numeric-value que regresa
el valor numrico del argumento pasado a la funcin y funcall que evala su primer argumento como
si fuera una funcin, pasndole el resto de los argumentos. Nota que no es equivalente a:
( myd e l e t e f u n c t i o n ( p r e f i x n u m e r i c v a l u e a r g ) )

porque esto tratara de buscar una funcin llamada my-delete-function, pero tal funcin no existe
y de existir probablemente no sera lo que nosotros buscamos. Es una variable, cuyo valor es, as es
adivinaste: el nombre de una funcin. Hablemos un poco sobre la razn de hacerlo as; porque si lo
piensas dos veces parece una complicacin innecesaria; por qu no ponemos ah el nombre de la
funcin que es el valor de my-delete-function? Porque hay muchas funciones similares para borrar
carcteres y quieres darle la oportunidad a los usuarios de utilizar la que mejor les acomode.
Ahora, qu pasa si la condicin del if es falsa? Se ejecuta la siguiente parte (lineas 1014), que
s parece una funcin como las que hemos visto. Primero guardamos el valor actual del punto en
una variable llamada here (linea 10), nos saltamos todos los blancos (hacia atrs) y ahora vemos si
en realidad nos movimos o no. Si nos movimos, entonces borramos la regin; si no nos movimos
(quiere decir que estamos en una literal) entonces slo borramos un carcter. Nuevamente borramos
con la funcin para borrar que el usuario quiera.
Por ejemplo, para programar en elisp, puedes poner esto en tu /.emacs:

330

Extendiendo tu ambiente

( addhook emacsl i s p modehook


( lambda ( )
( d e f i n e key emacsl i s p modemap " \ Cm" n e w l i n e andi n d e n t )
( d e f i n e key emacsl i s p modemap ( b a c k s p a c e ) mye l e c t r i c d e l e t e )
( s e t q myd e l e t e f u n c t i o n backwardd e l e t e c h a r u n t a b i f y
myhungry d e l e t e key t ) ) )

que bsicamente le dice a Emacs que cada vez que tecleas Enter , debe pasar a la siguiente lnea
y luego indentar adecuadamente. Tambin le indica que BackSpace debe ejecutar la funcin que
recin analizamos; por ltimo le doy nombre a las dos variables que se usan dentro del cuerpo de la
funcin.

9.7.4.

Un ejercicio totalmente intil, o eso parece


Cuntas veces has tenido la necesidad de partir una oracin en una lista de las palabras que
constituyen la oracin? Nunca? En realidad no es comn, al menos no en elisp. Sin embargo, es
un buen ejemplo para mostrar el manejo de cadenas y listas en elisp.
La funcin que vers usa dos funciones auxiliares. A decir, las dos funciones auxiliares son las
que hacen el trabajo y la funcin principal slo oculta detalles que el usuario de la funcin no tiene
por qu conocer. Esto es una prctica usual en programacin: slo pide al usuario los parmetros
que el usuario conoce.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

( d e f u n s t r i n g t o k e n i z e r ( c h a r s t r )
" R e g r e s a una l i s t a que c o n t i e n e t o d o s l o s e l e m e n t o s
en l a c a d e n a STR que e s t n s e p a r a d o s p o r CHAR . "
( s t r i n g t o k e n i z e r aux c h a r s t r n i l ) )
( d e f u n s t r i n g t o k e n i z e r aux ( c h a r s t r r e s )
" R e g r e s a una l i s t a , RES , que c o n t i e n e t o d o s l o s e l e m e n t o s
en l a c a d e n a STR que e s t n s e p a r a d o s p o r CHAR . "
( l e t ( ( i n d e x ( i n d e x o f c h a r s t r 0 ) ) )
( i f ( n u l l index )
( i f ( s t r i n g e q u a l s t r " " )
( reverse res )
( r e v e r s e ( cons s t r r e s ) ) )
( s t r i n g t o k e n i z e r aux c h a r ( s u b s t r i n g s t r ( 1 + i n d e x ) )
( cons ( s u b s t r i n g s t r 0 index )
res ) ) ) ) )
( d e f u n i n d e x o f ( c h a r s t r c o u n t )
" R e g r e s a e l n d i c e de l a p r i m e r a a p a r i c i n de CHAR
en l a c a d e n a STR empezando en COUNT . "
( cond ( ( s t r i n g e q u a l s t r " " ) n i l )
( ( c h a r e q u a l ( a r e f s t r 0 ) c h a r ) c o u n t )
( t ( i n d e x o f c h a r ( s u b s t r i n g s t r 1 ) ( 1 + c o u n t ) ) ) ) )

331

9.7 Lluvia de funciones

string-tokenizer es la funcin interfaz y recibe dos parmetros, la cadena que vamos a seccionar y
el carcter que separa las secciones. Por la pregunta con la que iniciamos la seccin, podra pensarse
que siempre usaramos un espacio en blanco como separador. Finalmente las palabras en una oracin
casi siempre estn separadas por un espacio (ignorando muchas reglas gramaticales, claro, porque
los signos de puntuacin y ms de un espacio tambin delimitan palabras). Pero no lo hicimos
as, porque esta funcin es ms general y podemos fcilmente hacer una especializacin de stringtokenizer que sirva para separar palabras en una oracin.
Bien. Nota que esta funcin no hace ms que llamar a string-tokenizer-aux, pero con tres
parmetros. Los primeros dos son los que pas el usuario (una cadena y un carcter separador) y un
tercero, nil o la lista vaca. La funcin auxiliar usar este ltimo parmetro para ir almacenando las
secciones (o sub-cadenas).
Veamos entonces cmo funciona string-tokenizer-aux. Primero calcula el ndice dentro de la
cadena STR en el cul est la primera presencia del carcter separador en realidad el clculo lo
hace la segunda funcin auxiliar, index-of, pero por el momento vas a tener que creerme que s
funciona, es decir, que s regresa un entero que representa la posicin (en la cadena) de la primera
presencia del carcter separador .
A continuacin viene una serie de pruebas; primero preguntamos si el ndice es nil (linea 10);
si lo es, entonces preguntamos si la cadena es la cadena vaca en la linea 11 (i.e. si ya consumimos
toda la entrada). Si la respuesta es armativa, regresamos el resultado en reversa (ms adelante
explicar por qu en reversa). Si la cadena an no es la cadena vaca, quiere decir que el contenido
completo de la cadena debe ser la ltima parte del resultado (ya no se puede separar ms); asi que
lo agregamos al resultado y lo regresamos.
Como la funcin string-tokenizer-aux es una funcin recursiva, tiene dos partes importantes.
La primera, la clusula de escape, que es la parte que acabamos de revisar en el prrafo anterior.
Ahora, como buen ejemplo de funcin recursiva, tambin tiene una parte donde se llama a s misma.
Veamos cmo llegamos ah. Si el ndice no es nil (la primera pregunta en la linea 10), entonces
sabemos que index-of regres un nmero, un ndice en la cadena, por lo que sabemos hasta dnde
hay que cortar y eso hacemos: cortamos desde el inicio de la cadena hasta el ndice (sin incluir al
carcter separador) y agregamos esto al inicio de la lista resultado. Ahora tenemos que analizar el
resto de la cadena y por eso hacemos una llamada recursiva a la funcin misma, pero ahora usando
como parmetros: (1) el mismo carcter separador; (2) el resto de la cadena (despus del primer
carcter separador y sin incluirlo) y (3) con la nueva lista resultado que ya tiene en su primera
posicin la cadena recin cortada.
Esto se repite tantas veces como carcteres separadores contenga la cadena inicial, hasta que
fnalmente termina y regresa la lista. Por ejemplo, supn que hacemos la siguiente llamada:
( s t r i n g t o k e n i z e r ?

" e s una b o n i t a c a d e n a " )

La notacin ? (signo de interrogacin y espacio) le dice a Emacs que le estamos pasando un carcter, en este caso un espacio blanco. Lo que regresar es una lista de la forma (" es" "una" " bonita " "cadena"
Nota cmo ninguna de las sub-cadenas (palabras) contiene al carcter separador.
La funcin auxiliar index-of es tambin una funcin recursiva. Tiene dos casos base (o clusulas
de escape): la primera se activa cuando se agota la cadena (que se va recortando en un carcter
con cada llamada a s misma); la segunda se activa cuando el carcter que estbamos buscando es
encontrado. Su tercer parmetro es un contador, que si le pasamos 0 (cero) nos regresar el ndice en

332

Extendiendo tu ambiente
la cadena donde se encuentra el carcter separador por primera vez. Los siguiente ejemplos deben
aclarar un poco la situacin:
( i n d e x o f ? " e s una b o n i t a c a d e n a " 0 )
2
( i n d e x o f ? " una b o n i t a c a d e n a " 0 )
3

que si cuentas desde 0 son los ndices del primer espacio en blanco en ambos casos. Para redondear
la idea de la recursividad, estos ejemplos siguen el comportamiento de las llamadas recursivas de la
funcin string-tokenizer-aux:
( s t r i n g t o k e n i z e r aux ? " e s una b o n i t a c a d e n a " ( ) )
( s t r i n g t o k e n i z e r aux ? " una b o n i t a c a d e n a " ( " e s " ) )
( s t r i n g t o k e n i z e r aux ? " b o n i t a c a d e n a " ( " una " " e s " ) )
( s t r i n g t o k e n i z e r aux ? " c a d e n a " ( " b o n i t a " " una " " e s " ) )
( s t r i n g t o k e n i z e r aux ? " " ( " c a d e n a " " b o n i t a " " una " " e s " ) )
( r e v e r s e ( " c a d e n a " " b o n i t a " " una " " e s " ) )
( " e s " " una " " b o n i t a " " c a d e n a " )

Esto tambin debe aclarar por qu tenemos que regresar el resultado en reversa: porque fuimos
metiendo las sub-cadenas al inicio de la lista. Si las furamos metiendo al nal no habra necesidad,
pero lucira ms compleja la funcin.
Por ltimo, decimos que las funciones index-of y string-tokenizer-aux estn ambas en forma
recursiva de cola, primero porque son recursivas y segundo porque lo ltimo que hacen es llamarse
a s mismas. Una funcin recursiva puede hacer muchas llamadas a s misma, pero est en forma
recursiva de cola si y slo si el que llama regresa inmediatamente despus. Por ejemplo, la siguiente
funcin calcula el n-simo trmino en la serie de Fibonacci:
( defun f i b ( n )
( i f (< n 2)
1
( + ( f i b ( n 1 ) ) ( f i b ( n 2 ) ) ) ) )

pero no est en forma recursiva de cola, porque cuando terminan las llamadas recursivas no regresa
la funcin ya que falta realizar las sumas.

9.7.5.

Resumen
Aqu est un resumen de las funciones que acabamos de revisar:
dotimes Tiene la siguiente sintaxis:
( d o t i m e s (VAR COUNT [ RESULT ] ) BODY . . . )

Evala BODY ligando VAR a un entero sucesivo desde 0 inclusive, hasta COUNT (excluyndolo). Despus evala RESULT para obtener el valor de regreso, o regresa nil por omisin.
count-lines Tiene la siguiente sintaxis:
( c o u n t l i n e s START END &o p t i o n a l IGNOREINVISIBLE )

333

9.8 Para saber ms

Regresa el nmero de lneas entre START y END. Usualmente esto equivale al nmero de
carcteres de nueva lnea entre esas dos posiciones, pero puede ser una ms si el mayor de los
dos nmeros no est al inicio de una lnea.
Si el valor del parmetro opcional es distinto de nil , entonces las lneas ocultas (o colapsadas)
con selective-display no se consideran para la cuenta.
int-to-string Recibe un nmero como parmetro y lo convierte a una cadena en notacin decimal.
Utiliza un signo negativo si el nmero es negativo; algo que no es obvio del nombre de la
funcin es que puede recibir tanto enteros como nmeros de punto otante.
funcall Evala el primer argumento como si fuera una funcin, pasndole el resto de los argumentos como sus parmetros. Por tanto, ( funcall cons x y) regresa (x . y) .

9.8. Para saber ms


Emacs-Lisp es un lenguaje muy poderoso; sin embargo, no es un lenguaje utilizado para mucho
ms que modicar y extender Emacs. Es decir, su uso como lenguaje de produccin no es muy
amplio, por lo que muy poca gente invierte tiempo programando profesionalmente en elisp. Es
importante que sepas hacer cosas relativamente sencillas, como las que vimos aqu y algunas incluso
un poco ms complicadas, porque de esa manera podrs mejorar tu productividad.
Por otro lado, el nmero de usuarios de Emacs es tan grande, hablando a nivel mundial, que es
difcil que quieras hacer algo que no se le haya antojado a alguien ms alguna vez y, ms an, es
muy probable que esa cosa ya est implementada; utiliza Google o visita alguno de estos sitios:
http://www.gnu.org
http://www.xemacs.org
USENET o Google groups:
gnu.emacs.help
comp.emacs
comp.emacs.xemacs
gnu.emacs.gnus
gnu.emacs.sources

Apndices

Distribuciones de
Linux

Existen varias formas de instalar Linux en tu computadora. A lo largo de este libro se utiliz
Ubuntu, pero hay muchas ms opciones. Segn www.distrowatch.com, en este momento existen
mas de 500 versiones distintas de Linux. Existen algunas de ellas que tienen soporte por parte de
grandes empresas como Novell, Oracle, Red Hat o IBM. Adems, para empezar a usar Linux no
necesitas instalarlo de forma permanente en tu computadora, ya que muchas distribuciones tienen lo
que se conoce como un live cd, que es un disco que te permite utilizar Linux desde un cd o dvd sin
tener que copiarlo a tu disco duro. De esa forma puedes decidir si esa distribucin de Linux ofrece
lo que t necesitas sin tener que eliminar el sistema operativo que utilizas actualmente. A lo largo
de este apndice te presentaremos algunas de las distribuciones ms comunes de Linux, en dnde
puedes obtenerlas y cules son sus puntos clave.

A.1. Ubuntu
A.1.1.

Filosofa
Desde 2004 Ubuntu ha experimentado un incremento enorme en su nmero de usuarios, siendo
actualmente la distribucin ms popular. Como es una distribucin derivada de Debian (el cual
revisaremos en A.2), cuenta con toda la robustez de esa distribucin. El principal problema de
Debian es los largos periodos de tiempo que pueden pasar entre la liberacin de nuevas versiones.
Para evitar eso, los desarrolladores de Ubuntu se han comprometido a liberar una nueva versin

338

Distribuciones de Linux
cada seis meses. Adems los principales objetivos de Ubuntu son:
Mantener por siempre su gratuidad, y que nunca haya un costo adicional para obtener una
versin profesional.
Hacer que Ubuntu pueda ser usado por el mayor nmero de personas.
Estar siempre comprometido con el software libre.
A pesar de tener a su disposicin todos los paquetes de Debian, en Ubuntu la instalacin por
omisin incluye un nmero reducido de paquetes, lo cual permite que pueda distribuirse en un solo
CD, dejando la instalacin de otros paquetes como una decisin posterior. Puedes obtener una copia
en http://www.ubuntu.com/

A.1.2.

Manejo de software
El manejo de paquetes dentro de Ubuntu se hace utilizando archivos .deb, los cuales pueden ser
instalados con la herramienta dpkg. Esta herramienta es la encargada de desempacar los archivos,
copiarlos a su destino y ejecutar las operaciones para que el nuevo software opere adecuadamente.
Dado que dpkg es una herramienta poderosa pero a la vez poco amigable, se han creado varias
interfaces para hacer el trabajo de instalacin ms sencillo. De dichas interfaces, una de las ms
comunes es apt. Veamos como se instala un paquete haciendo uso de esta herramienta.
Lo primero que necesitamos es saber cul es el nombre del paquete que deseamos instalar;
para ello haremos uso de la herramienta apt-cache. Mediante sta podremos consultar la lista de
paquetes disponibles y ver cul de ellos es el que nosotros deseamos. Estas listas se construyen
a partir de los repositorios que se encuentran en el archivo /etc/apt/sources.list. Dicho archivo
contiene lneas como la siguiente:
deb h t t p : / / mx . a r c h i v e . u b u n t u . com / u b u n t u / main u n i v e r s e

Esa lnea indica lo siguiente:


La palabra deb indica que se van a obtener archivos de binarios (tambin puede aparecer
debsrc, para indicar que se van a obtener archivos de cdigo fuente).
Le sigue el URL del repositorio que indica de dnde se van a obtener los paquetes.
La siguiente palabra indica qu distribucin se utiliza (en este caso stable), y qu secciones
estn disponibles1 (en este caso main).
Puedes agregar tantas lneas como necesites, para as agregar ms repositorios que te permitan
tener acceso a ms paquetes. La mayor parte del tiempo no necesitars ms que los repositorios
ociales. En caso de que modiques tus repositorios necesitars indicarle a apt que reconstruya la
lista de paquetes. Para poder hacerlo, ejecuta como root la instruccin:
% apt-get update
Una vez hecho eso, puedes buscar el paquete que deseas, digamos emacs. Entonces es necesario
ejecutar la instruccin:
% apt-cache search emacs
1

Entre las distintas secciones estn: main universe multiverse restricted

339

A.2 Debian

De esa forma le indicamos a apt que debe buscar la lista de paquetes y regresarnos todos los
que contengan la palabra emacs en su nombre o su descripcin. Esto regresar algo como:
d i c t i o n a r y e l d i c t i o n a r y c l i e n t f o r Emacs
d r s c h e m e PLT Scheme Programming E n v i r o n m e n t
emacse x t r a emacs c o n f i g u r a t i o n
emacss n a p s h o t g t k The GNU Emacs e d i t o r ( w i t h GTK+ 2 . x s u p p o r t )
emms The Emacs M u l t i M e d i a System
emacs21 The GNU Emacs e d i t o r
emacs21b i n common The GNU Emacs e d i t o r s d e p e n d e n t f i l e s
emacs21common The GNU Emacs e d i t o r s

Si quieres ver ms detalles acerca de un paquete, entonces puedes ejecutar:


% apt-cache search -f emacs21-common
Con lo cual obtienes un listado como:
P a c k a g e : emacs21common
Priority : optional
Section : editors
I n s t a l l e d S i z e : 35948
Architecture : all
S o u r c e : emacs21
V e r s i o n : 2 1 . 4 a6u b u n t u 2
R e p l a c e s : emacs21 ( < 21.2 4)
Depends : emacsencommon ( >= 1 . 4 . 1 0 ) , dpkg ( >= 1 . 9 . 0 )
S u g g e s t s : emacs21e l
C o n f l i c t s : emacs21e l ( < 2 1 . 4 a 6) , w3e l
F i l e n a m e : p o o l / main / e / emacs21 / emacs21common_ 2 1 . 4 a6_ a l l . deb
S i z e : 10936074
MD5sum : b 4 a 9 8 1 d 1 2 f 6 a 3 9 f 4 3 c 8 9 6 d d f 9 2 4 1 2 9 f d
SHA1 : 33 f 6 6 7 d 8 f b d 5 e 1 8 5 7 0 d 4 0 5 c 5 c 5 4 d 9 e 2 2 6 4 3 c 9 d 6 f
D e s c r i p t i o n : The GNU Emacs e d i t o r s s h a r e d , a r c h i t e c t u r e
independent i n f r a s t r u c t u r e
GNU Emacs i s t h e e x t e n s i b l e s e l f d o c u m e n t i n g t e x t e d i t o r .
This package c o n t a i n s the a r c h i t e c t u r e independent i n f r a s t r u c t u r e
t h a t s s h a r e d by emacs21 and emacs21nox .

Esa instruccin puedes ejecutarla con ms de un paquete para que encuentres cul es el que
deseas instalar. Una vez hecho eso, ser necesario ejecutar el comando de instalacin de apt:
% sudo apt-get install emacs21-common
Con lo cual apt te informar qu paquete se va a descargar y cunto espacio utilizar. En caso
de que existan dependencias no resueltas, te informar cules son los paquetes que debes instalar
para satisfacerlas, y si as lo deseas, apt se encargar de obtenerlas por ti.

340

Distribuciones de Linux

A.2. Debian
A.2.1.

Filosofa
Debian es un sistema operativo libre, dinmico y gratis. Es distribuido por el Proyecto Debian.
Su objetivo principal es distribuir un conjunto de software que sea capaz de satisfacer la mayora
de las necesidades de los usuarios de una computadora. Para lograr eso, Debian actualmente tiene
18,733 paquetes disponibles. Debian mantiene sus distribuciones en tres estados:
stable (estable). Contiene los paquetes ociales; es la distribucin lista para usarse y todo est
garantizado que funcionar.
testing (de prueba). Contiene paquetes que an no han sido aceptados en la distribucin estable,
pero que en algn momento lo estarn.
unstable (inestable). Contiene paquetes en desarrollo; probablemente habr paquetes que no funcionarn del todo bien, pero tambin tiene los paquetes ms nuevos.
Conforme va pasando el tiempo, los paquetes pueden pasar de una distribucin inestable a una
de prueba y de ah, despus de una revisin minuciosa, nalmente llegan a estable. Muchas personas
consideran a Debian como la distribucin ms robusta de Linux2 , siendo esto una consecuencia de
la enorme cantidad de paquetes que tiene disponibles en sus repositorios, todas las arquitecturas
que soporta y la garanta de que en su versin estable todo est probado. Por desgracia, esto puede
ocasionar que la versin estable sea obsoleta, pues revisar todos esos paquetes para garantizar que
todo es seguro lleva mucho tiempo. Esto puede no ser un problema si utilizas la versin de prueba
o inestable. Puedes descargar Debian desde http://www.debian.org/.

A.2.2.

Manejo de software
El manejo de paquetes de Debian, al igual que Ubuntu, es mediante el manejador de paquetes
dpkg y su interfaz apt. Para revisar cmo utilizar dichas herramientas, consulta la seccin A.1.

A.3. Fedora
A.3.1.

Filosofa
Fedora es una coleccin de proyectos patrocinados por Red Hat, y desarrollados en contacto
con la comunidad de software libre. Originalmente Red Hat tena una sola distribucin homnima a la compaa, pero en el 2003 sta desapareci. Red Hat dividi sus esfuerzos en dos di2

dando esto como resultado varias guerras santas

341

A.3 Fedora

recciones: el proyecto Fedora mantendra lo que antes era la distribucin del sistema operativo
y Red Hat Enterprise se encargara de atender a los clientes empresariales. El propsito del proyecto Fedora es y ha sido apoyar el rpido progreso del software libre y de su contenido. Esto
incluye tener procesos abiertos al pblico, transparencia y rpida innovacin. Puedes obtenerlo en
http://fedoraproject.org/.

A.3.2.

Manejo de software
El manejo de paquetes de Fedora es mediante el uso de archivos .rpm, los cuales se instalan
haciendo uso de la herramienta rpm3 . Para resolver las dependencias que puede tener un paquete,
e instalarlas automticamente, se hace uso de la herramienta yum4 . Si se desea instalar emacs en el
sistema, lo primero que se debe hacer es buscar cul es el paquete que se desea instalar. Para eso se
utiliza la instruccin:
% yum search emacs
Con lo cual se obtiene un listado de los paquetes que contienen la palabra emacs, y que se puede
observar a continuacin.
emacs . i 3 8 6
21.4 5
installed
Matched from :
emacs
The GNU Emacs t e x t e d i t o r .
Emacs i s a p o w e r f u l , c u s t o m i z a b l e , s e l f d o c u m e n t i n g ,
m o d e l e s s t e x t e d i t o r . Emacs c o n t a i n s s p e c i a l c o d e e d i t i n g
f e a t u r e s , a s c r i p t i n g l a n g u a g e ( e l i s p ) , and t h e c a p a b i l i t y
t o r e a d m a i l , news , and more w i t h o u t l e a v i n g t h e e d i t o r .
h t t p : / / www. gnu . o r g / s o f t w a r e / emacs /

r e a d l i n e . i386
5.0 3
installed
Matched from :
The R e a d l i n e l i b r a r y p r o v i d e s a s e t o f f u n c t i o n s t h a t a l l o w
u s e r s t o e d i t command l i n e s . Both Emacs and v i e d i t i n g modes
a r e a v a i l a b l e . The R e a d l i n e l i b r a r y i n c l u d e s a d d i t i o n a l
f u n c t i o n s f o r m a i n t a i n i n g a l i s t o f p r e v i o u s l y e n t e r e d command
l i n e s f o r r e c a l l i n g o r e d i t i n g t h o s e l i n e s , and f o r p e r f o r m i n g
cshl i k e h i s t o r y e x p a n s i o n on p r e v i o u s commands .

Una vez que sabes cual es el nombre del paquete que quieres instalar, debes ejecutar como root
la instruccin:
% yum install emacs.i386
3
4

Redhat Package Manager


Yellow dog Update Manager

342

Distribuciones de Linux
Con lo cual yum te mostrara cuales son los paquetes que va a instalar, sus dependencias y cuanto
espacio van a ocupar.

Compilando e
instalando a pie

B.1. Aplicaciones no disponibles


Hay ocasiones en las que quieres instalar una aplicacin, pero no existe un paquete para el
sistema de instalacin de tu distribucin. Algunas veces, alguien ms se encarga de distribuirlos y
puedes o no conseguir un .deb o un .rpm en su pgina. En caso de que eso no sea posible, ser
necesario compilar el paquete e instalarlo a pie. Esto puede sonar ms complicado de lo que en
realidad es, pero para ilustrar el proceso veamos un ejemplo. Vamos a instalar un cliente de MSN
para Linux que se conoce como amsn. Lo primero que necesitas es conseguir el cdigo fuente de la
aplicacin, que en este caso lo puedes bajar de http://sourceforge.net/projects/amsn/. El archivo
que vamos a bajar es amsn-0.96.tar.bz2, el nmero corresponde a la versin que bajamos, por lo
que es probable que cuando t lo consigas sea algo distinto. El siguiente paso es descomprimir el
archivo; en este caso, a partir de la extensin, sabemos que es un archivo empacado con tar y luego
comprimido con bzip2. Para desempacarlo puedes usar el comando
tar xvfj amsn-0.96.tar.bz2,
o bien hacerlo desde Konqueror. Esto genera el directorio amsn-0.96 En el encontrars algunos
archivos que suelen ser estndar en las distribuciones de cdigo fuente en UNIX. Entre estos se
encuentran, generalmente, los siguientes archivos:
README
INSTALL
congure

344

Compilando e instalando a pie


En el archivo README viene una breve explicacin de qu es la aplicacin, cmo funciona y
a veces instrucciones para instalar. En caso de que las instrucciones para instalar no aparezcan en
README, es porque estn en INSTALL. La informacin ms importante de este archivo son las
dependencias del programa que quieres compilar y las opciones que le puedes pasar al compilarlo.
El resto del procedimiento es igual para la mayora de los programas, y usualmente es:
1. Congurar los parmetros de compilacin.
2. Compilar el programa.
3. Instalar el programa.

Congurando la compilacin
Veamos cmo se conguran los parmetros de compilacin. Para hacer eso utilizamos herramientas de UNIX que se llaman automake y congure. El desarrollador que prepar los fuentes
para instalar se encarg de utilizar un guin de instalacin con automake para que nosotros podamos compilar con congure. De esa forma congure se encarga de buscar en dnde tenemos
nosotros instaladas las dependencias del programa que queremos compilar, y establece en dnde
queremos instalar nuestro programa una vez compilado, incluyendo binarios y documentacin. As
que realicemos este paso para amsn. Es necesario que el archivo congure tenga permisos de ejecucin; en caso de que no sea as puedes otorgrselos con chmod +x congure; una vez hecho eso
ejectalo con ./ congure . Vers que empieza a revisar si tienes instaladas todas las dependencias
que necesitas; si no encuentra algo en ese momento se detendr y te indicar qu es lo que falta en tu
sistema. Supongamos que en este momento congure indica que no puede encontrar el compilador
de C, gcc; entonces vers algo como:
c h e c k i n g f o r g c c . . . no
c h e c k i n g f o r c c . . . no
c h e c k i n g f o r c c . . . no
c h e c k i n g f o r c l . . . no
c o n f i g u r e : e r r o r : no a c c e p t a b l e C c o m p i l e r f o u n d i n $PATH

Ser necesario instalar este compilador. En este momento, si corres con suerte, bastar con
utilizar tu manejador de paquetes mientras que en el peor de los casos tendrs que compilar tambin
ese paquete. Para instalar gcc y de paso g++1 en Ubuntu basta con ejecutar sudo apt-get install gcc
g++. as que si una vez heco esto ultimo vuelves a ejecutar cong, deber seguir con su ejecucin
normal. En caso de que te hagan falta bibliotecas para seguir compilando tambin ser necesario
que las instales. Supongamos que no tienes instalado Tk, el cual es necesario para compilar amsn;
cuando congure se detenga y nos indique que no encuentra la biblioteca necesaria, recurrimos
a apt para instalarla. En este caso es necesario instalar el paquete de desarrollo, pues queremos
compilar cdigo fuente. Los paquetes de desarrollo en Linux tienen la terminacin dev. Ejecutamos
entonces sudo aptget install tk8.4dev, y una vez ms ./ congure . Ahora amsn debera compilar
sin problemas2 . En caso de que quieras modicar algn parmetro de la instalacin de amsn, puedes
1

g++ es el compilador de C++.


Dependiendo de qu tengas instalado en tu mquina, es posible que necesites instalar ms paquetes, pero
el procedimiento es igual al que acabamos de describir
2

B.1 Aplicaciones no disponibles

345

ejecutra ./ congure help, lo cual te mostrar las opciones disponibles.

Compilando
Cuando congure termina exitosamente su ejecucin, puedes compilar el programa. Al terminar, congure crea un archivo de nombre Makele en el archivo en donde se encuentra el cdigo fuente. Dentro de ese archivo se encuentran las opciones y rutas que se prepararon en el
seccin B.1. La herramienta que lee el archivo Makele, lleva el mismo nombre, makele, y se
invoca con el comando make. En caso de que no est instalada, nuevamente recurrimos a apt,
sudo aptget install make. Ahora, colocndonos en el directorio en donde se encuentra el archivo
Makele, tecleamos make y vemos cmo se compila todo3 .

Instalando
Ahora viene la ltima parte. Despus de haber compilado el programa es necesario instalarlo
en algn lugar que facilite su acceso. De esa forma cualquier usuario del sistema puede usar el
programa que compilaste. Para llevar a cabo la instalacin una vez ms vas a hacer uso de make,
pero esta vez es necesario hacerlo con permisos de super usuario, sudo make install . Vers como
make despliega las instrucciones que est llevando a cabo.
Listo. Una vez hecho esto, si tecleas amsn desde tu consola, se iniciar el cliente de MSN.
Este proceso es casi estndar dentro del mundo UNIX, por lo que puedes repetirlo para la mayora
del cdigo fuente que quieras compilar e instalar. Si existe un paquete para la aplicacin que deseas
instalar dentro del manejador de paquetes de tu distribucin, es mejor idea usarlo y no compilar a pie.
Si compilas e instalas pierdes las ventajas del manejador, como saber fcilmente qu aplicaciones
tienes instaladas y en qu versin estn, o el desinstalar fcilmente4 .

3
4

Dependiendo de qu ests instalando, esto puede tardar varios minutos


En algunas aplicaciones puedes usar sudo make uninstall para desinstalar la aplicacin

Emacs: archivos de
conguracin

A lo largo de este libro hemos revisado Emacs y muchas extensiones, subsistemas y paquetes
para extender la funcionalidad bsica de Emacs. Conforme avanzamos, explicamos las distintas
opciones y lneas de conguracin, pero las integramos aqu para tu comodidad.

C.1. /.emacs
; ; E s t e a r c h i v o de c o n f i g u r a c i n p a r a Emacs , e s un a n e x o d e l l i b r o :
; ; Manual de s u p e r v i v e n c i a en L i n u x
; ;
; ; f o n t l o c k
; ;
( r e q u i r e f o n t l o c k )
( addhook f o n t l o c k modehook t u r n onf a s t l o c k )
( g l o b a l f o n t l o c k mode 1 )
; ; C o l o r theme :
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / c o l o r theme " ) )
( r e q u i r e c o l o r theme )
( c o l o r theme i n i t i a l i z e )
( c o l o r themec h a r c o a l b l a c k )

348

Emacs: archivos de conguracin


; ;
; ; C o d i f i c a c i n : UTF8
; ;
( p r e f e r c o d i n g s y s t e m u t f 8)
; ; AUCTeX , RefTeX y p r e v i e w emacs :
; ; S i AUCTeX y p r e v i e w emacs e s t n i n s t a l a d o s de manera g l o b a l en t u
; ; s i t i o , no r e q u i e r e s l a s s i g u i e n t e s d o s l n e a s :
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / a u c t e x " ) )
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / a u c t e x / p r e v i e w " ) )
( r e q u i r e texs i t e )
( require tex )
( require latex )
( require reftex )
( l o a d " p r e v i e w l a t e x . e l " n i l t t )
( s e t q TeXa u t o s a v e t )
( s e t q TeXp a r s e s e l f t )
( s e t q d e f a u l t TeXm a s t e r n i l )
( s e t q LaTeXs e c t i o n hook
( LaTeXs e c t i o n h e a d i n g
LaTeXs e c t i o n t i t l e
LaTeXs e c t i o n t o c
LaTeXs e c t i o n s e c t i o n
LaTeXs e c t i o n l a b e l )
)

; ; I s p e l l hablando espaol .
( s e t q i s p e l l programname " a s p e l l "
i s p e l l e x t r a a r g s (" W" " 3 " )
i s p e l l d i c t i o n a r y a l i s t
( cons
( " s p a n i s h " " [ [ : a l p h a : ] ] " " [ ^ [ : a l p h a : ] ] " " [ . ] " n i l (" B" "d "
" e s " ) n i l u t f 8)
i s p e l l d i c t i o n a r y a l i s t )
)
( s e t d e f a u l t i s p e l l l o c a l d i c t i o n a r y " s p a n i s h " )
; ; BBDB
; ; S i BBDB e s t i n s t a l a d o en un s i t i o e s t n d a r de Emacs , no r e q u i e r e s
la primera lnea :
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / bbdb / l i s p " ) )
( r e q u i r e bbdb )
( bbdb i n i t i a l i z e vm )
; ; w3m
( r e q u i r e w3ml o a d )
; ; Dictionary ( dict client )

C.2 /.vm

349
( load " d i c t i o n a r y i n i t ")
( g l o b a l s e t key [ ( c o n t r o l c ) ? s ] d i c t i o n a r y s e a r c h )
( g l o b a l s e t key [ ( c o n t r o l c ) ?m] d i c t i o n a r y matchwords )
; ; TRAMP
( r e q u i r e tramp )
( s e t q tramp d e f a u l t method " s c p " )
; ; ERC
( require erc )
( r e q u i r e e r c s p e l l i n g )
; ; JDE y a m i g o s :
( l o a d f i l e " ~ / e l i s p / c e d e t / common / c e d e t . e l " )
( s e m a n t i c l o a d e n a b l e codeh e l p e r s )
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / j d e / l i s p " ) )
( addt o l i s t l o a d p a t h ( expandf i l e name " ~ / e l i s p / e l i b " ) )
( require jde )
( s e t q j d e e n a b l e a b b r e v mode t
j d e e l e c t r i c r e t u r n p t
j d e b u i l d f u n c t i o n ( j d e a n t b u i l d )
j d e d e b u g g e r ( " JDEbug " )
tempo i n t e r a c t i v e t
)
; ; S u b v e r s i o n D e p e n d i e n d o de t u c o n f i g u r a c i n , p u e d e s e r que n e c e s i t e s
; ; l a p r i m e r a l n e a p a r a e n v i a r c o m e n t a r i o s en UTF8 a l r e p o s i t o r i o :
( s e t e n v "LCCTYPEenUS . u t f 8")
( r e q u i r e psvn )

C.2. /.vm
; ; emacs l i s p
( s e t q vms p o o l f i l e s
( ( " ~ / INBOX"
" imaps s l : g a l a d r i e l . f c i e n c i a s . unam . mx : 9 9 3 : i n b o x : l o g i n : J u a n . Doe
:"
" ~ / INBOX . CRASH" ) )
)
( s e t q vmimapa u t o expunge a l i s t
(
; ; Dejamos una c o p i a en e l s e r v i d o r .
( " imaps s l : g a l a d r i e l . f c i e n c i a s . unam . mx : 9 9 3 : i n b o x : l o g i n : J u a n . Doe
:" . nil )

350

Emacs: archivos de conguracin


)
vms k i p r e a d m e s s a g e s t
vmc i r c u l a r f o l d e r s
t
vmv i r t u a l f o l d e r a l i s t
(
( " Amigos "
( ( " ~ / INBOX " )
( and ( a u t h o r " E l i s a V i s o . " ) ( a u t h o r " F r a n c i s c o S o l s o n a . " ) )
))
)
vmsummaryshowt h r e a d s t
)
( s e t q vmm a i l h e a d e r from " J u a n Doe < J u a n . D o e @ c i e n c i a s . unam . mx>"
send m a i l f u n c t i o n s m t p m a i l send i t
s m t p m a i l smtps e r v e r " g a l a d r i e l . f c i e n c i a s . unam . mx"
s m t p m a i l l o c a l domain " c i e n c i a s . unam . mx"
s m t p m a i l s e n d t o domain " c i e n c i a s . unam . mx"
)
; ; BBDB i n s i n u a t i o n :
( bbdbi n s i n u a t e vm )

C.3. /.emacs-w3m
; ; emacs l i s p
( s e t q w3mhomep a g e " h t t p : / / www. f c i e n c i a s . unam . mx"
w3md e f a u l t d i s p l a y i n l i n e i m a g e s t
)

Bibliografa
[1] D IVERSOS AUTORES The tex catalogue on line.
http://www.tex.ac.uk/tex-archive/help/Catalogue/catalogue.html. Contiene muchsimos paquetes de LATEX con su documentacin, listos para ser descargados.
[2] E TTRICH , M. Kde. http://www.kde.org.
[3] H ILBRICH , T. Emacs: Dictionary. http://www.myrkr.in-berlin.de/dictionary/.
[4] I TO , A. Emacs: w3m. http://w3m.sourceforge.net.
[5] K INNUCAN , P. Emacs: Jdee - java development environment for emacs.
http://jdee.sunsite.dk/.
[6] L UDLAM , E.
Emacs: Cedet - collection of emacs development environment tools.
http://cedet.sourceforge.net/.
[7] M ITTELBACH , F.,
Wesley, 2004.

AND

G OOSENS , M. The LATEX Companion, Second Edition. Addison-

[8] R EICHOER , S. Emacs: psvn. http://www.xsteve.at/prg/vc_svn/.


[9] S TALLMAN , R. Emacs, gcc y gdb. http://www.gnu.org. Presidente de la Free Software
Foundation. Fundador GNU.
[10] T ORVALDS , L. El sistema operativo linux. http://www.linux.org.
[11] T SUCHIYA , M. Emacs: emacs-w3m. http://emacs-w3m.namazu.org.
[12] WALLIN , I.,

AND

C EDEQVIST, P. Emacs: Elib - emacs lisp library.

http://elib.sourceforge.net.
[13] WANG , P. S. An Introduction to Unix with X and the Internet. PWS Publishing Company,
1997.

UNIVERSIDAD NACIONAL AUTNOMA DE MXICO


FACULTAD DE CIENCIAS

Manual de supervivencia en Linux


se termin de imprimir en octubre de 2007
en los talleres de Publidisa Mexicana, S. A. de C. V.
Calz. de Chabacano 69, Col. Asturias
Mxico 06850, D. F.
El tiro fue de 500 ejemplares
Est impreso en papel Bond de 90 gramos
En su composicin se emplearon tipos Times New Roman y Courier
de 11:13.5, 12:14 y 18:20 puntos de pica.

You might also like