11.07.2015 Views

Manual de supervivencia en Linux - mmc - UNAM

Manual de supervivencia en Linux - mmc - UNAM

Manual de supervivencia en Linux - mmc - UNAM

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ii3.4. Agrupando nombres <strong>de</strong> archivos . . . . . . . . . . . . . . . . . . . . . 443.5. Konqueror: administrador <strong>de</strong> archivos y algo más . . . . . . . . . . . . 453.5.1. Iniciando Konqueror . . . . . . . . . . . . . . . . . . . . . . . 463.5.2. Konqueror como administrador <strong>de</strong> archivos . . . . . . . . . . . 463.5.3. Konqueror como un navegador web . . . . . . . . . . . . . . . 483.5.4. Konqueror como una aplicación integrada . . . . . . . . . . . . 493.6. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.6.1. Ejecutando Emacs <strong>de</strong>s<strong>de</strong> la línea <strong>de</strong> comandos . . . . . . . . . 503.6.2. Conceptos es<strong>en</strong>ciales . . . . . . . . . . . . . . . . . . . . . . . 523.6.3. Dired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.6.4. Ejecución <strong>de</strong> comandos <strong>de</strong> Unix <strong>de</strong>s<strong>de</strong> Emacs . . . . . . . . . . 544. Edición 554.1. La guerra <strong>de</strong> los editores <strong>de</strong> texto . . . . . . . . . . . . . . . . . . . . . 554.1.1. Vieja guardia contra nueva guardia . . . . . . . . . . . . . . . . 564.2. Kate: un editor para programadores . . . . . . . . . . . . . . . . . . . 564.2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.2.2. Empezando a utilizar Kate . . . . . . . . . . . . . . . . . . . . 574.2.3. Editando archivos . . . . . . . . . . . . . . . . . . . . . . . . . 594.3. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644.3.1. Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.3.2. Movimi<strong>en</strong>to . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664.3.3. Matando y borrando . . . . . . . . . . . . . . . . . . . . . . . 674.3.4. Re<strong>en</strong>carnación <strong>de</strong> texto . . . . . . . . . . . . . . . . . . . . . . 684.3.5. Regiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.3.6. Rectángulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.3.7. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.3.8. Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.3.9. Buscar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.3.10. Reemplazar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.3.11. Guardar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.3.12. V<strong>en</strong>tanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.3.13. Marcos (frames) . . . . . . . . . . . . . . . . . . . . . . . . . 714.3.14. Ayuda <strong>en</strong> línea . . . . . . . . . . . . . . . . . . . . . . . . . . 724.3.15. Lista <strong>de</strong> buffers . . . . . . . . . . . . . . . . . . . . . . . . . . 724.3.16. Anzuelos (Hooks), setq y otros . . . . . . . . . . . . . . . . . . 724.3.17. Ortografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734.3.18. Ext<strong>en</strong>di<strong>en</strong>do Emacs . . . . . . . . . . . . . . . . . . . . . . . . 74


iv5.14.3. Contactos, KAddressBook . . . . . . . . . . . . . . . . . . . . 1085.14.4. Cal<strong>en</strong>dario y p<strong>en</strong>di<strong>en</strong>tes con KOrganizer . . . . . . . . . . . . 1125.15. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195.15.1. VM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215.15.2. BBDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.15.3. w3m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315.15.4. ERC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1365.15.5. TRAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1395.15.6. Diccionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406. L A TEX 1436.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1436.2. Compon<strong>en</strong>tes <strong>de</strong> un texto . . . . . . . . . . . . . . . . . . . . . . . . . 1446.3. Ambi<strong>en</strong>tes para formato . . . . . . . . . . . . . . . . . . . . . . . . . 1456.3.1. Posibles errores . . . . . . . . . . . . . . . . . . . . . . . . . . 1476.4. Formato g<strong>en</strong>eral <strong>de</strong> un docum<strong>en</strong>to . . . . . . . . . . . . . . . . . . . . 1496.4.1. Cartas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526.5. Tipos y tamaños <strong>de</strong> letras . . . . . . . . . . . . . . . . . . . . . . . . . 1536.6. Listas <strong>de</strong> <strong>en</strong>unciados o párrafos . . . . . . . . . . . . . . . . . . . . . . 1566.6.1. Numeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . 1576.6.2. Listas marcadas . . . . . . . . . . . . . . . . . . . . . . . . . . 1606.6.3. Descripciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 1616.6.4. Listas más compactas . . . . . . . . . . . . . . . . . . . . . . . 1636.7. Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1646.7.1. Multicolumnas . . . . . . . . . . . . . . . . . . . . . . . . . . 1666.7.2. Separación <strong>de</strong> r<strong>en</strong>glones y columnas . . . . . . . . . . . . . . . 1686.7.3. Líneas “incompletas” verticales y horizontales . . . . . . . . . 1726.7.4. Espacio <strong>en</strong>tre los r<strong>en</strong>glones . . . . . . . . . . . . . . . . . . . . 1736.8. Matemáticas <strong>en</strong> L A TEX . . . . . . . . . . . . . . . . . . . . . . . . . . . 1746.8.1. Fórmulas matemáticas . . . . . . . . . . . . . . . . . . . . . . 1766.9. Emacs y L A TEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1786.9.1. Anotaciones <strong>en</strong> los símbolos . . . . . . . . . . . . . . . . . . . 1926.9.2. Arreglos <strong>de</strong> fórmulas . . . . . . . . . . . . . . . . . . . . . . . 1936.10. Imág<strong>en</strong>es y figuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1976.10.1. Tablas, figuras, etc. . . . . . . . . . . . . . . . . . . . . . . . . 1976.10.2. Cortando figuras . . . . . . . . . . . . . . . . . . . . . . . . . 2046.10.3. Colores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2056.10.4. Dibujando objetos geométricos . . . . . . . . . . . . . . . . . . 2076.10.5. Líneas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2076.10.6. Acomodando objetos . . . . . . . . . . . . . . . . . . . . . . . 2266.11. Refer<strong>en</strong>cias e índices . . . . . . . . . . . . . . . . . . . . . . . . . . . 231


6.11.1. Refer<strong>en</strong>cias bibliográficas . . . . . . . . . . . . . . . . . . . . 2316.11.2. Índices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2376.12. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2376.12.1. AUCTEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2386.12.2. RefTEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2416.12.3. Preview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2427. L<strong>en</strong>guajes <strong>de</strong> marcado 2457.1. XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2467.2. HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2497.2.1. XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2497.3. CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2507.3.1. Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2537.4. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2558. Herrami<strong>en</strong>tas para <strong>de</strong>sarrollo 2568.1. Control <strong>de</strong> versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 2568.1.1. subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2568.1.2. Introducción a subversion . . . . . . . . . . . . . . . . . . . . 2578.2. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2608.2.1. JDEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2608.2.2. psvn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2689. Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te 2719.1. Programación <strong>en</strong> shell . . . . . . . . . . . . . . . . . . . . . . . . . . . 2719.1.1. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2729.1.2. Preparación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2729.1.3. Vigilando el espacio <strong>en</strong> disco . . . . . . . . . . . . . . . . . . . 2739.1.4. Listado <strong>de</strong> directorios . . . . . . . . . . . . . . . . . . . . . . . 2759.1.5. Recorridos recursivos . . . . . . . . . . . . . . . . . . . . . . . 2789.1.6. Comparando archivos . . . . . . . . . . . . . . . . . . . . . . 2839.1.7. Otra vez el problema <strong>de</strong> borrar la basura . . . . . . . . . . . . . 2859.1.8. Para saber más . . . . . . . . . . . . . . . . . . . . . . . . . . 2899.2. Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2899.2.1. La madre <strong>de</strong> todos los l<strong>en</strong>guajes . . . . . . . . . . . . . . . . . 2899.2.2. LISP <strong>en</strong> 15 minutos . . . . . . . . . . . . . . . . . . . . . . . . 2909.2.3. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2989.3. Evaluaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2999.3.1. Nombres <strong>de</strong> buffers . . . . . . . . . . . . . . . . . . . . . . . . 2999.4. Definiciones <strong>de</strong> funciones . . . . . . . . . . . . . . . . . . . . . . . . . 3019.4.1. <strong>de</strong>fun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3019.4.2. let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305v


vi9.4.3. La forma especial if . . . . . . . . . . . . . . . . . . . . . . . 3069.4.4. save-excursion . . . . . . . . . . . . . . . . . . . . . . . . . . 3079.4.5. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3089.5. Funciones relacionadas con buffers . . . . . . . . . . . . . . . . . . . . 3119.5.1. Definición (simplificada) <strong>de</strong> beginning-of-buffer . . . . . . . . 3119.5.2. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3149.6. Funciones fundam<strong>en</strong>tales . . . . . . . . . . . . . . . . . . . . . . . . . 3149.6.1. car y cdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3159.6.2. Cortando y guardando texto . . . . . . . . . . . . . . . . . . . 3189.6.3. Inicialización <strong>de</strong> variables: <strong>de</strong>fvar . . . . . . . . . . . . . . . . 3219.6.4. copy-region-as-kill . . . . . . . . . . . . . . . . . . . . . . . . 3229.6.5. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3259.7. Lluvia <strong>de</strong> funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3269.7.1. ¿Quién o qué es ASCII? . . . . . . . . . . . . . . . . . . . . . 3269.7.2. ¿Cómo numerar una región <strong>de</strong> líneas? . . . . . . . . . . . . . . 3279.7.3. Borrado efectivo <strong>de</strong> espacios . . . . . . . . . . . . . . . . . . . 3289.7.4. Un ejercicio totalm<strong>en</strong>te inútil, o eso parece . . . . . . . . . . . 3309.7.5. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3329.8. Para saber más . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333A. Distribuciones <strong>de</strong> <strong>Linux</strong> 337A.1. Ubuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337A.1.1. Filosofía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337A.1.2. Manejo <strong>de</strong> software . . . . . . . . . . . . . . . . . . . . . . . . 338A.2. Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340A.2.1. Filosofía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340A.2.2. Manejo <strong>de</strong> software . . . . . . . . . . . . . . . . . . . . . . . . 340A.3. Fedora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340A.3.1. Filosofía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340A.3.2. Manejo <strong>de</strong> software . . . . . . . . . . . . . . . . . . . . . . . . 341B. Compilando e instalando a pie 343B.1. Aplicaciones no disponibles . . . . . . . . . . . . . . . . . . . . . . . 343C. Emacs: archivos <strong>de</strong> configuración 347C.1. ∼/.emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347C.2. ∼/.vm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349C.3. ∼/.emacs-w3m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350


Índice <strong>de</strong> figuras1.1. Acceso al sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. Inicio <strong>de</strong> una sesión <strong>en</strong> un sistema UNIX. . . . . . . . . . . . . . . . . 61.3. Equivocación al teclear la contraseña. . . . . . . . . . . . . . . . . . . 62.1. KControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2. Administración <strong>de</strong> usuarios . . . . . . . . . . . . . . . . . . . . . . . . 122.3. Administración <strong>de</strong> contraseñas . . . . . . . . . . . . . . . . . . . . . . 122.4. Disposición <strong>de</strong>l teclado . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5. KDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.6. K3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.7. Quemado <strong>de</strong> un disco <strong>de</strong> datos . . . . . . . . . . . . . . . . . . . . . . 162.8. Quemado <strong>de</strong> un disco <strong>de</strong> audio . . . . . . . . . . . . . . . . . . . . . . 182.9. Amarok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.10. Emacs <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE . . . . . . . . . . . . . . . . . . . . . . . . 203.1. Sistema <strong>de</strong> archivos <strong>en</strong> un sistema Unix . . . . . . . . . . . . . . . . . 253.2. Resultado <strong>de</strong> <strong>en</strong>tubar ls -al con less . . . . . . . . . . . . . . . . . . . 293.3. Konqueror como un administrador <strong>de</strong> archivos . . . . . . . . . . . . . . 473.4. Konqueror con un emulador <strong>de</strong> terminal . . . . . . . . . . . . . . . . . 483.5. Konqueror como un navegador <strong>de</strong> Internet . . . . . . . . . . . . . . . . 493.6. Konqueror <strong>de</strong>plegando una imag<strong>en</strong> . . . . . . . . . . . . . . . . . . . . 493.7. Konqueror <strong>de</strong>plegando un docum<strong>en</strong>to postscrip. . . . . . . . . . . . . . 504.1. Kate <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE . . . . . . . . . . . . . . . . . . . . . . . . . 574.2. V<strong>en</strong>tana <strong>de</strong> inicio <strong>de</strong> Kate . . . . . . . . . . . . . . . . . . . . . . . . . 605.1. V<strong>en</strong>tana principal <strong>de</strong> KMail . . . . . . . . . . . . . . . . . . . . . . . . 895.2. Vista principal <strong>de</strong> Akregator . . . . . . . . . . . . . . . . . . . . . . . 1005.3. Kopete <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE . . . . . . . . . . . . . . . . . . . . . . . . 1035.4. Vista principal <strong>de</strong> kopete . . . . . . . . . . . . . . . . . . . . . . . . . 1045.5. V<strong>en</strong>tana inicial <strong>de</strong> Kontact . . . . . . . . . . . . . . . . . . . . . . . . 1075.6. KAddressBook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109


viii5.7. Creando una nueva ag<strong>en</strong>da . . . . . . . . . . . . . . . . . . . . . . . . 1105.8. Creando una nuevo contacto . . . . . . . . . . . . . . . . . . . . . . . 1105.9. Pestaña <strong>de</strong> <strong>de</strong>talles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.10. KAddressBook con algunos contactos . . . . . . . . . . . . . . . . . . 1115.11. KOrganizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125.12. Creando una nuevo ev<strong>en</strong>to . . . . . . . . . . . . . . . . . . . . . . . . 1135.13. Ajustando la repetición <strong>de</strong> un ev<strong>en</strong>to . . . . . . . . . . . . . . . . . . . 1145.14. Agregando participantes <strong>en</strong> un ev<strong>en</strong>to . . . . . . . . . . . . . . . . . . 1155.15. Ajustando la hora <strong>de</strong> la reunión . . . . . . . . . . . . . . . . . . . . . . 1165.16. Vista ¿Qué es lo sigui<strong>en</strong>te? . . . . . . . . . . . . . . . . . . . . . . . . 1165.17. Vista Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.18. Vista Día . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.19. Vista Semana laboral . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185.20. Vista Semana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185.21. Vista Tres días sigui<strong>en</strong>tes . . . . . . . . . . . . . . . . . . . . . . . . . 1195.22. Vista Mes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1205.23. El diario <strong>de</strong>ntro <strong>de</strong> Kontact . . . . . . . . . . . . . . . . . . . . . . . . 1206.1. Gráfico introducido con inclu<strong>de</strong>graphics . . . . . . . . . . . . . 2016.2. Escalando objetos con graphics. . . . . . . . . . . . . . . . . . . . . . 2026.3. Rotaciones y reflejos con graphics . . . . . . . . . . . . . . . . . . 2036.4. Tomando pedazos <strong>de</strong> figuras . . . . . . . . . . . . . . . . . . . . . . . 2046.5. Ejemplo <strong>de</strong> opciones para dibujar . . . . . . . . . . . . . . . . . . . . . 2136.6. Graficación <strong>de</strong> funciones arbitrarias . . . . . . . . . . . . . . . . . . . 2216.7. Impresión <strong>de</strong> la retícula . . . . . . . . . . . . . . . . . . . . . . . . . . 2226.8. Colocación <strong>de</strong> los ejes . . . . . . . . . . . . . . . . . . . . . . . . . . 2226.9. Segunda forma <strong>de</strong> pintar la retícula . . . . . . . . . . . . . . . . . . . . 2236.10. Divertim<strong>en</strong>to con sólo trazo <strong>de</strong> líneas . . . . . . . . . . . . . . . . . . . 2246.11. Dibujo <strong>de</strong> una gráfica <strong>en</strong> L A TEX . . . . . . . . . . . . . . . . . . . . . . 2296.12. Actividad 6.52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2316.13. Ejemplo <strong>de</strong> L A TEX usando BIBT E X . . . . . . . . . . 2336.14. Salida <strong>de</strong> L A TEX al ejecutar BIBT E X . . . . . . . . . . . . . . . . . . . . 2346.15. Ejemplo <strong>de</strong> una base <strong>de</strong> datos BIBT E X . . . . . . . . . . . . . . . . . . 2356.16. Ejemplo usando los estilos BIBT E X . . . . . . . . . . . . . . . . . . . . 2366.17. Preview <strong>en</strong> acción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2437.1. Página sin hoja <strong>de</strong> estilo . . . . . . . . . . . . . . . . . . . . . . . . . 2517.2. Página con hoja <strong>de</strong> estilo . . . . . . . . . . . . . . . . . . . . . . . . . 252


Índice <strong>de</strong> tablas1. Conv<strong>en</strong>ciones tipográficas . . . . . . . . . . . . . . . . . . . . . . . . XII3.1. Comandos <strong>de</strong> Unix importantes . . . . . . . . . . . . . . . . . . . . . . 393.2. Emacs: opciones <strong>de</strong> inicio . . . . . . . . . . . . . . . . . . . . . . . . 513.3. Emacs: comandos <strong>de</strong>l modo dired . . . . . . . . . . . . . . . . . . . . 534.1. Kate: <strong>en</strong>laces <strong>de</strong> tecla para acceso rápido . . . . . . . . . . . . . . . . . 614.2. Kate: opciones para buscar y reemplazar . . . . . . . . . . . . . . . . . 634.3. Kate: sangrados disponibles . . . . . . . . . . . . . . . . . . . . . . . 644.4. Emacs: comandos <strong>de</strong> movimi<strong>en</strong>to . . . . . . . . . . . . . . . . . . . . 664.5. Emacs: movimi<strong>en</strong>to a lugares especiales . . . . . . . . . . . . . . . . . 674.6. Emacs: comandos para matar y borrar . . . . . . . . . . . . . . . . . . 674.7. Emacs: comandos para manejar rectángulos . . . . . . . . . . . . . . . 694.8. Emacs: comandos para manejar registros . . . . . . . . . . . . . . . . . 694.9. Emacs: comandos para revisar ortografía . . . . . . . . . . . . . . . . . 745.1. Dominios <strong>de</strong> jerarquía superior . . . . . . . . . . . . . . . . . . . . . . 825.2. Servicios comunes <strong>de</strong> Google . . . . . . . . . . . . . . . . . . . . . . . 855.3. Otros servicios <strong>de</strong> la Wikipedia . . . . . . . . . . . . . . . . . . . . . . 865.4. Algunos comandos disponibles <strong>en</strong> el sistema . . . . . . . . . . . . . . 945.5. Emacs: comandos <strong>de</strong> selección <strong>de</strong> VM . . . . . . . . . . . . . . . . . . 1245.6. Emacs: comandos para componer correo <strong>en</strong> VM . . . . . . . . . . . . . 1255.7. Emacs: comandos <strong>de</strong> Mail . . . . . . . . . . . . . . . . . . . . . . . . 1265.8. Emacs: comandos para contestar correo <strong>en</strong> VM . . . . . . . . . . . . . 1265.9. Emacs: comandos para a<strong>de</strong>lantar m<strong>en</strong>sajes <strong>de</strong> VM . . . . . . . . . . . . 1275.10. Emacs: tipos válidos para campos BBDB . . . . . . . . . . . . . . . . 1295.11. Emacs: comandos <strong>de</strong> BBDB . . . . . . . . . . . . . . . . . . . . . . . 1305.12. Emacs: iniciando w3m . . . . . . . . . . . . . . . . . . . . . . . . . . 1315.13. Emacs: sigui<strong>en</strong>do ligas con w3m . . . . . . . . . . . . . . . . . . . . . 1325.14. Emacs: navegando con w3m . . . . . . . . . . . . . . . . . . . . . . . 1335.15. Emacs: puntos <strong>de</strong> interés <strong>en</strong> la página ala w3m . . . . . . . . . . . . . 1335.16. Emacs: movimi<strong>en</strong>to <strong>en</strong>tre páginas con w3m . . . . . . . . . . . . . . . 134


x5.17. Emacs: manejo <strong>de</strong> imág<strong>en</strong>es <strong>en</strong> w3m . . . . . . . . . . . . . . . . . . . 1355.18. Emacs: ligas favoritas <strong>en</strong> w3m . . . . . . . . . . . . . . . . . . . . . . 1365.19. Emacs: comandos <strong>de</strong> ERC . . . . . . . . . . . . . . . . . . . . . . . . 1375.20. Emacs: módulos para ext<strong>en</strong><strong>de</strong>r ERC . . . . . . . . . . . . . . . . . . . 1385.21. Emacs: comandos <strong>de</strong> dictionary . . . . . . . . . . . . . . . . . . . . . 1416.1. L A TEX: ambi<strong>en</strong>tes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1456.2. L A TEX: comandos para modificar espacios . . . . . . . . . . . . . . . . 1506.3. Tamaños disponibles para letras . . . . . . . . . . . . . . . . . . . . . 1546.4. L A TEX: comandos para cambios <strong>de</strong> tipo <strong>de</strong> letra . . . . . . . . . . . . . . 1556.5. Modificadores para la <strong>de</strong>finición <strong>de</strong> columnas . . . . . . . . . . . . . . 1656.6. Ac<strong>en</strong>tos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1756.7. Símbolos no ingleses . . . . . . . . . . . . . . . . . . . . . . . . . . . 1756.8. Símbolos <strong>de</strong> puntuación y especiales . . . . . . . . . . . . . . . . . . . 1756.9. Símbolos griegos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1796.10. Símbolos con flechas . . . . . . . . . . . . . . . . . . . . . . . . . . . 1806.11. Operadores y símbolos relacionales . . . . . . . . . . . . . . . . . . . 1806.12. Símbolos varios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1826.13. Nombres <strong>de</strong> funciones comunes . . . . . . . . . . . . . . . . . . . . . 1826.14. Símbolos agrandables . . . . . . . . . . . . . . . . . . . . . . . . . . . 1846.15. Delimitadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1866.16. Tipos <strong>de</strong> letras <strong>en</strong> modo matemático . . . . . . . . . . . . . . . . . . . 1876.17. Ac<strong>en</strong>tos <strong>en</strong> modo matemático . . . . . . . . . . . . . . . . . . . . . . . 1926.18. Comandos <strong>de</strong> espacio <strong>en</strong> modo matemático . . . . . . . . . . . . . . . 1966.19. Posiciones posibles para los flotantes . . . . . . . . . . . . . . . . . . . 1986.20. Conversión <strong>de</strong> grados Far<strong>en</strong>heit a C<strong>en</strong>tígrados . . . . . . . . . . . . . . 1996.21. Conversión <strong>de</strong> Far<strong>en</strong>heit a C<strong>en</strong>tígrados . . . . . . . . . . . . . . . . . . 2006.22. Repres<strong>en</strong>taciones numéricas . . . . . . . . . . . . . . . . . . . . . . . 2006.23. Comparación <strong>de</strong> tamaños . . . . . . . . . . . . . . . . . . . . . . . . . 2046.24. Paquetes <strong>de</strong> pgf para colores y dibujos . . . . . . . . . . . . . . . . . . 2056.25. Colores básicos con los que se cu<strong>en</strong>ta . . . . . . . . . . . . . . . . . . 2066.26. Modificadores para el trazo <strong>de</strong> líneas y figuras . . . . . . . . . . . . . . 2126.27. Opciones <strong>de</strong> grosor y estilos <strong>de</strong> líneas . . . . . . . . . . . . . . . . . . 2136.28. Ejemplos <strong>de</strong> figuras <strong>en</strong> TikZ . . . . . . . . . . . . . . . . . . . . . . . 2146.29. Líneas dobles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2146.30. Tipos <strong>de</strong> puntas <strong>de</strong> flechas <strong>en</strong> TikZ . . . . . . . . . . . . . . . . . . . . 2156.31. Figuras geométricas que se pue<strong>de</strong>n lograr <strong>en</strong> TikZ . . . . . . . . . . . 2166.32. Graficación <strong>de</strong> funciones comunes <strong>en</strong> TikZ . . . . . . . . . . . . . . . 2186.33. Símbolos para marcar curvas que se grafican . . . . . . . . . . . . . . . 2196.34. Emacs: comandos <strong>de</strong> AUCTEX . . . . . . . . . . . . . . . . . . . . . . 2398.1. subversion: comandos más importantes . . . . . . . . . . . . . . . . . 259


8.2. JDEE: abreviaturas <strong>de</strong> estructuras <strong>de</strong> control . . . . . . . . . . . . . . . 2638.3. JDEE: formas para completar campos y métodos . . . . . . . . . . . . 2648.4. JDEE: <strong>en</strong>unciados import . . . . . . . . . . . . . . . . . . . . . . . . . 2648.5. JDEE: g<strong>en</strong>eradores <strong>de</strong> código, wizards . . . . . . . . . . . . . . . . . . 2658.6. Emacs: comandos <strong>de</strong> psvn . . . . . . . . . . . . . . . . . . . . . . . . 2699.1. Programación <strong>en</strong> shell: variables automáticas . . . . . . . . . . . . . . 275xi


PrefacioEste libro pres<strong>en</strong>ta las aplicaciones y el <strong>en</strong>foque que un estudiante <strong>de</strong> computacióno un futuro programador <strong>de</strong>be dominar para sacar el mayor provecho <strong>de</strong> su <strong>en</strong>señanzaprofesional <strong>en</strong> programación y, <strong>en</strong> g<strong>en</strong>eral, <strong>en</strong> las ci<strong>en</strong>cias <strong>de</strong> la computación. Hemosvertido aquí la experi<strong>en</strong>cia <strong>de</strong> media doc<strong>en</strong>a <strong>de</strong> años imparti<strong>en</strong>do cursos propedéuticos<strong>de</strong> <strong>superviv<strong>en</strong>cia</strong> para estudiantes <strong>de</strong> la lic<strong>en</strong>ciatura <strong>en</strong> ci<strong>en</strong>cias <strong>de</strong> la computación <strong>de</strong> laFacultad <strong>de</strong> Ci<strong>en</strong>cias <strong>de</strong> la Universidad Nacional Autónoma <strong>de</strong> México.Conv<strong>en</strong>ciones tipográficasTabla 1Conv<strong>en</strong>ciones tipográficasEntidadEnfatizadoitálicascomando<strong>en</strong>unciadosDescripciónUtilizamos este tipo <strong>de</strong> letra (font) para <strong>en</strong>fatizar o resaltarpalabras o frases.Las utilizamos para modismos, palabras o frases <strong>en</strong> inglés ypalabras utilizadas <strong>en</strong> el medio y cuya traducción o aceptación<strong>en</strong> el idioma no es clara.Los comandos y opciones se muestran así. Cuando <strong>en</strong>cu<strong>en</strong>treslíneas tales como: % comando, éstas repres<strong>en</strong>tan comandosque pue<strong>de</strong>s teclear y ejecutar <strong>en</strong> una terminal. Porconv<strong>en</strong>ción utilizaremos % para significar que <strong>de</strong>be ejecutarsecomo un usuario no-priviligiado y $ cuando <strong>de</strong>be ejecutarsecomo súper-usuario o root.Utilizaremos este tipo <strong>de</strong> letra para escribir código que <strong>de</strong>beir <strong>en</strong> un archivo.Este símbolo es el logo <strong>de</strong>l ambi<strong>en</strong>te Gnome y sirve para señalarqué aplicaciones para este ambi<strong>en</strong>te son equival<strong>en</strong>tesa la revisada <strong>en</strong> la sección don<strong>de</strong> aparece.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


xivTabla 1 Conv<strong>en</strong>ciones tipográficas Continúa <strong>de</strong> la página anteriorEntidadDescripciónEste símbolo es el logo <strong>de</strong>l ambi<strong>en</strong>te KDE y sirve para señalaraplicaciones alternativas o similares a la revisada <strong>en</strong> lasección don<strong>de</strong> aparece.Este símbolo es el logo <strong>de</strong>l editor Emacs y sirve para señalarpaquetes alternativos o similares al revisado <strong>en</strong> la seccióndon<strong>de</strong> aparece.A quién está dirigidoEste texto está dirigido a estudiantes y profesionales <strong>de</strong> la computación o futurosprogramadores que estén interesados <strong>en</strong> incursionar <strong>en</strong> el mundo <strong>de</strong>l software libre,conocer el sistema operativo <strong>Linux</strong> y que requieran dominar rápidam<strong>en</strong>te herrami<strong>en</strong>tasori<strong>en</strong>tadas al <strong>de</strong>sarrollo y productividad <strong>en</strong> este ambi<strong>en</strong>te.Es un libro práctico, por lo que es importante resaltar que todo lo que se ve <strong>en</strong> losdistintos capítulos pue<strong>de</strong> repetirse <strong>en</strong> un sistema <strong>de</strong> cómputo con sistema operativo <strong>Linux</strong>.Asimismo, los ejercicios <strong>en</strong> algunas <strong>de</strong> las secciones son <strong>de</strong> utilidad para reafirmarel conocimi<strong>en</strong>to y se recomi<strong>en</strong>da realizarlos <strong>en</strong> el or<strong>de</strong>n pres<strong>en</strong>tado.Distribución y ambi<strong>en</strong>tesAlgunas <strong>de</strong>estas notasmuestrancomandosA lo largo <strong>de</strong>l libro <strong>en</strong>contrarás muchos ejemplos que funcionarán bi<strong>en</strong> <strong>en</strong> cualquierdistribución <strong>de</strong> <strong>Linux</strong>. Sin embargo, y a pesar <strong>de</strong> nuestros mejores esfuerzos, hemosincluido aplicaciones que no son parte es<strong>en</strong>cial <strong>de</strong> las distribuciones <strong>de</strong> <strong>Linux</strong> másutilizadas. Cada vez que esto suce<strong>de</strong> te mostramos, <strong>en</strong> una nota al marg<strong>en</strong>, el comandoque <strong>de</strong>bes ejecutar como súper-usuario para instalar dicha aplicación.Para lograr esto, por supuesto, nos hemos visto <strong>en</strong> la necesidad <strong>de</strong> utilizar una distribucióny optamos por Ubuntu y como administrador <strong>de</strong> paquetes utilizamos apt. Porejemplo, verás <strong>en</strong> notas al marg<strong>en</strong> algo parecido a esto:% smart install katelo que constituye (como verás <strong>en</strong> el Capítulo 1) una línea <strong>de</strong> comandos que, al serejecutada, se conecta a la red, localiza la aplicación kate, la <strong>de</strong>scarga a tu computadoray la instala.En el apéndice A se pres<strong>en</strong>ta una relación <strong>de</strong> algunas <strong>de</strong> las distribuciones másimportantes <strong>en</strong> el mercado al mom<strong>en</strong>to <strong>de</strong> la edición <strong>de</strong> este libro. En dicho anexo


<strong>en</strong>contrarás, <strong>en</strong>tre otros datos interesantes <strong>de</strong> cada distribución, la manera preferida <strong>de</strong>administrar aplicaciones.En el apéndice B se pres<strong>en</strong>tan las opciones que se ti<strong>en</strong><strong>en</strong> para instalar paquetes ofunciones <strong>de</strong> tu distribución favorita. Podrás ver ahí cómo compilar para instalar algunos<strong>de</strong> los servicios que se pres<strong>en</strong>tan <strong>en</strong> este libro.Finalm<strong>en</strong>te, <strong>en</strong> el apéndice C colocamos los archivos principales para tu archivo.emacs que fuimos construy<strong>en</strong>do a lo largo <strong>de</strong> este material, así como los archivosnecesarios para correo e internet.xv


Introducción aUnix 11.1. HistoriaLa primera versión <strong>de</strong> UNIX, llamada Unics, fue escrita <strong>en</strong> 1969 por K<strong>en</strong> Thompson.Corría <strong>en</strong> una computadora PDP-7 <strong>de</strong> Digital. Más a<strong>de</strong>lante, los laboratorios Bell,el MIT y G<strong>en</strong>eral Electric se involucraron <strong>en</strong> la creación <strong>de</strong>l sistema Multics, gran<strong>de</strong><strong>en</strong> tamaño, y el primer sistema <strong>de</strong> tiempo compartido que incluía muchas i<strong>de</strong>as innovadorasacerca <strong>de</strong> sistemas operativos. Thompson y algunos <strong>de</strong> sus colegas admirabanlas capacida<strong>de</strong>s <strong>de</strong> Multics; sin embargo, p<strong>en</strong>saban que era <strong>de</strong>masiado complicado. Sui<strong>de</strong>a era <strong>de</strong>mostrar que era posible construir un sistema operativo que proporcionara unambi<strong>en</strong>te <strong>de</strong> <strong>de</strong>sarrollo cómodo <strong>de</strong> una forma más simple. Y afortunadam<strong>en</strong>te, tuvieronun éxito admirable <strong>en</strong> el <strong>de</strong>sarrollo <strong>de</strong> esta i<strong>de</strong>a; a pesar <strong>de</strong> esto, UNIX es irónicam<strong>en</strong>temucho más complicado <strong>de</strong> lo que Multics nunca llegó a ser.En 1970 Thompson, junto con D<strong>en</strong>nis Ritchie, portó UNIX a la PDP-11/20. Ritchiediseñó y escribió el primer compilador <strong>de</strong> C para proveer un l<strong>en</strong>guaje que pudieraser usado para escribir una versión portátil <strong>de</strong>l sistema. En 1973, Ritchie y Thompsonreescribieron el kernel <strong>de</strong> UNIX, el corazón <strong>de</strong>l sistema operativo, <strong>en</strong> C.Inicialm<strong>en</strong>te se otorgaron lic<strong>en</strong>cias gratuitas para utilizar UNIX a universida<strong>de</strong>scon propósitos meram<strong>en</strong>te educativos (<strong>en</strong> 1974). Esta versión fue la quinta edición (lasediciones hac<strong>en</strong> refer<strong>en</strong>cia a las ediciones <strong>de</strong>l manual <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> UNIX). La sextaedición fue liberada <strong>en</strong> 1975; sin embargo, fue hasta la séptima edición, liberada por loslaboratorios Bell <strong>en</strong> 1979, don<strong>de</strong> se logró la meta <strong>de</strong>seada: portabilidad; esta edición


2 Introducción a Unixfue la que sirvió como punto <strong>de</strong> partida para la g<strong>en</strong>eración <strong>de</strong> este nuevo y maravillosomundo: el mundo UNIX. Ésta es consi<strong>de</strong>rada la edición clásica <strong>de</strong> UNIX. Las dosverti<strong>en</strong>tes más fuertes creadas a partir <strong>de</strong> esta edición <strong>de</strong> UNIX son: System V (noconfundirlo con la quinta edición) y el sistema BSD (Berkeley Software Distribution).A pesar <strong>de</strong> que ambos sistemas surgieron <strong>de</strong> la misma influ<strong>en</strong>cia y compart<strong>en</strong> muchascaracterísticas, los dos sistemas se <strong>de</strong>sarrollaron con personalida<strong>de</strong>s muy distintas.System V es más conservador y sólido; mi<strong>en</strong>tras que BSD es más innovador y experim<strong>en</strong>tal.System V era un sistema comercial, mi<strong>en</strong>tras que BSD no.La historia es mucho más <strong>de</strong>tallada y aún hay mucho que contar acerca <strong>de</strong>l <strong>de</strong>sarrollo<strong>de</strong> cada una <strong>de</strong> estas verti<strong>en</strong>tes, <strong>de</strong> las cuales surgieron todavía muchas verti<strong>en</strong>tesmás <strong>de</strong> UNIX.En el caso <strong>de</strong> la lic<strong>en</strong>ciatura <strong>en</strong> Ci<strong>en</strong>cias <strong>de</strong> la Computación <strong>en</strong> la Facultad <strong>de</strong> Ci<strong>en</strong>cias,como <strong>en</strong> muchas otras universida<strong>de</strong>s <strong>de</strong> prestigio, el servicio al que acce<strong>de</strong>n losestudiantes y la mayoría <strong>de</strong> los profesores es utilizando una implem<strong>en</strong>tación <strong>de</strong> UNIX,<strong>Linux</strong>, con computadoras conectadas <strong>en</strong> una red, por lo que todo lo que suce<strong>de</strong> <strong>en</strong>trelos estudiantes y la computadora será <strong>en</strong> el contexto <strong>de</strong> esta red.1.1.1. Sistemas UNIX libresLos sistemas compatibles UNIX libres 1 para la arquitectura i386, notablem<strong>en</strong>te <strong>Linux</strong>y FreeBSD, han hecho <strong>de</strong> UNIX un sistema al alcance <strong>de</strong> cualquiera. Estos sistemasprove<strong>en</strong> excel<strong>en</strong>te r<strong>en</strong>dimi<strong>en</strong>to y vi<strong>en</strong><strong>en</strong> con un conjunto <strong>de</strong> características y herrami<strong>en</strong>tasestándar <strong>de</strong> UNIX. Son tan robustos que incluso muchas empresas han basado su<strong>de</strong>sarrollo <strong>en</strong> alguno <strong>de</strong> estos sistemas.Dado que estos sistemas no conti<strong>en</strong><strong>en</strong> software propietario pue<strong>de</strong>n ser usados, copiadosy distribuidos por cualquiera (incluso gratis). Las copias <strong>de</strong> estos sistemas sepue<strong>de</strong>n conseguir <strong>en</strong> CD-ROM o bi<strong>en</strong> por medio <strong>de</strong> Internet.<strong>Linux</strong>. <strong>Linux</strong> es una versión <strong>de</strong> UNIX libre, originada por Linus Torvalds <strong>en</strong> la Universidad<strong>de</strong> Helsinki <strong>en</strong> Finlandia. Fue inspirado por Minix – escrito por AndrewTan<strong>en</strong>baum – y sigue más o m<strong>en</strong>os las conv<strong>en</strong>ciones <strong>de</strong> System V. Su <strong>de</strong>sarrolloha sido llevado a cabo por programadores (hackers, wizards) <strong>de</strong> todo el mundo,coordinados por Linus a través <strong>de</strong> Internet. Una gran cantidad <strong>de</strong> código incluida<strong>en</strong> el "sistema operativo <strong>Linux</strong>" 2 es GNU y la versión <strong>de</strong> X es XFree86.Hay varias distribuciones <strong>de</strong> <strong>Linux</strong> y algunas <strong>de</strong> las más importantes son:Ubuntu: http://www.ubuntu.com/ (y Kubuntu, la distribución que utilizamos<strong>en</strong> este trabajo: http://www.kubuntu.org/)1 En este contexto libre, es una traducción literal <strong>de</strong> free que no significa gratis, (como <strong>en</strong> cervezasgratis), sino significa libre (como <strong>en</strong> libertad <strong>de</strong> expresión).2 Un sistema operativo es un conjunto <strong>de</strong> programas que controla y administra los recursos <strong>de</strong> lacomputadora, como son el disco, la memoria, los dispositivos <strong>de</strong> <strong>en</strong>trada y salida.


1.1 Historia 3Fedora: http://fedora.redhat.com/Debian: http://www.<strong>de</strong>bian.org/op<strong>en</strong>SUSE: http://www.op<strong>en</strong>suse.org/FreeSpire: http://freespire.org/<strong>Linux</strong> se distribuye bajo la lic<strong>en</strong>cia GPL (G<strong>en</strong>eral Public Lic<strong>en</strong>ce), que es conocidacomo CopyLeft y que repres<strong>en</strong>ta gran parte <strong>de</strong> la idiosincrasia <strong>de</strong>l mundoUNIX libre.FreeBSD. FreeBSD es <strong>de</strong>rivado <strong>de</strong>l sistema BSD (<strong>de</strong> la versión 4.4 para ser exactos);fue creado, igual que <strong>Linux</strong>, para la arquitectura i386. Su i<strong>de</strong>a fundam<strong>en</strong>tal <strong>de</strong><strong>de</strong>sarrollo es t<strong>en</strong>er un ambi<strong>en</strong>te estable <strong>de</strong> <strong>de</strong>sarrollo para esa arquitectura. Estásoportado por un grupo internacional <strong>de</strong> voluntarios. La gran mayoría <strong>de</strong> los programasque conforman los sistemas FreeBSD, a difer<strong>en</strong>cia <strong>de</strong> <strong>Linux</strong>, están gobernadospor lic<strong>en</strong>cias estilo Berkeley, las cuales permit<strong>en</strong> redistribuciones siemprey cuando el código incluya una nota reconoci<strong>en</strong>do el <strong>de</strong>recho <strong>de</strong> autor <strong>de</strong> Reg<strong>en</strong>tsof the University of California and the FreeBSD project. Algunas otras partes <strong>de</strong>FreeBSD son GNU y están cubiertas por la GPL.La pregunta más común <strong>en</strong>tre usuarios <strong>de</strong> UNIX <strong>en</strong> el mundo es: ¿cuál es mejor:<strong>Linux</strong> o FreeBSD? La respuesta no es clara. Ambos ti<strong>en</strong><strong>en</strong> cosas bu<strong>en</strong>as y tal vez lamejor forma <strong>de</strong> saberlo es probar ambos.1.1.2. El proyecto GNUEl proyecto GNU buscaba <strong>de</strong>sarrollar un sistema compatible con UNIX, totalm<strong>en</strong>telibre 3 . Es operado por la FSF (Free Software Foundation), organización fundada por RichardStallman, qui<strong>en</strong> ha escrito gran parte <strong>de</strong>l código <strong>de</strong> GNU. GNU es una anagrama<strong>de</strong> "GNU’s not UNIX". Algunas herrami<strong>en</strong>tas invaluables para el trabajo diario <strong>de</strong> unestudiante <strong>de</strong> Ci<strong>en</strong>cias <strong>de</strong> la Computación (al m<strong>en</strong>os <strong>en</strong> esta Universidad) que han sido<strong>de</strong>sarrolladas <strong>de</strong>ntro <strong>de</strong>l proyecto GNU son: un editor <strong>de</strong> texto (Emacs), el compilador<strong>de</strong> C (gcc), un <strong>de</strong>purador (gdb), y versiones <strong>de</strong> prácticam<strong>en</strong>te todas las herrami<strong>en</strong>tasestándar <strong>de</strong> UNIX.Todo el software distribuido por GNU se libera bajo la lic<strong>en</strong>cia GPL. De acuerdocon los términos <strong>de</strong> esta lic<strong>en</strong>cia, cualquiera pue<strong>de</strong> modificar el software y redistribuirsu propia versión. La restricción principal es que te obliga a redistribuirlo incluy<strong>en</strong>doel código fu<strong>en</strong>te, aún <strong>en</strong> el caso <strong>de</strong> que tú hayas hecho las modificaciones.3 A varios años <strong>de</strong> haber sido creada, lo han logrado. Su nombre es Hurd y promete muchas cosasinteresantes <strong>en</strong> el mundo <strong>de</strong> los sistemas operativos. Sin embargo, <strong>Linux</strong>, (que sigue mucha <strong>de</strong> la filosofía<strong>de</strong> GNU, pero no es el proyecto GNU), le lleva mucha v<strong>en</strong>taja. Sin duda alguna ésta es una épocainteresante para estar metido <strong>en</strong> el software libre: nos esperan cosas bu<strong>en</strong>as.


4 Introducción a UnixUNIX es un sistema operativo multi-usuario y multi-tarea, es <strong>de</strong>cir, permite a muchosusuarios conectarse al sistema y cada uno <strong>de</strong> estos usuarios pue<strong>de</strong> ejecutar variosprogramas a la vez.1.2. Sistemas <strong>de</strong> tiempo compartidoUNIX es un sistema <strong>de</strong> tiempo compartido. Esto significa que las computadoras quetrabajan con UNIX pue<strong>de</strong>n aceptar más <strong>de</strong> un usuario al mismo tiempo. La computadoraprincipal (la parte <strong>de</strong>l hardware que ejecuta realm<strong>en</strong>te la mayoría <strong>de</strong>l trabajo) recibeel nombre <strong>de</strong> computadora anfitrión. Una <strong>de</strong> las tareas <strong>de</strong>l sistema operativo es asegurarque los recursos <strong>de</strong> la computadora anfitrión se compartan <strong>en</strong>tre todos los usuarios.Para trabajar con UNIX normalm<strong>en</strong>te usarás una terminal. Una terminal UNIX básicaconsta <strong>de</strong> una pantalla, un teclado y algunas cosas más. No obstante, como se verámás a<strong>de</strong>lante algunas terminales son más complejas que otras.Cada vez que oprimes una tecla, la terminal <strong>en</strong>vía una señal a la computadora anfitrión.Como respuesta, esta última <strong>en</strong>vía su propia señal <strong>de</strong> regreso a la terminal,indicándole que <strong>de</strong>spliegue el carácter correspondi<strong>en</strong>te <strong>en</strong> la pantalla. UNIX fue configurado<strong>de</strong> tal forma que cuando la computadora anfitrión efectúa el eco, pue<strong>de</strong>s verque lo que teclea se recibe bi<strong>en</strong> y que la conexión <strong>en</strong>tre la computadora anfitrión y laterminal está intacta.1.2.1. Los sistemas multiusuarioMuchas computadoras anfitrión están conectadas directam<strong>en</strong>te a las terminales. Noobstante, hay muchos c<strong>en</strong>tros <strong>de</strong> cómputo que ofrec<strong>en</strong> una variedad <strong>de</strong> computadorasanfitrión. En tales casos, la terminal podría estar conectada a una computadora especial,<strong>de</strong>nominada servidor.Casi todas las computadoras anfitrión cu<strong>en</strong>tan con un teclado y una pantalla, queson parte <strong>de</strong> la computadora. Para UNIX, teclado y pantalla son sólo otra terminal. Sinembargo, dichas partes recib<strong>en</strong> el nombre especial <strong>de</strong> consola.Un sistema UNIX clásico pue<strong>de</strong> usar una computadora anfitrión que se <strong>en</strong>cu<strong>en</strong>tre<strong>en</strong> la oficina <strong>de</strong>l administrador <strong>de</strong>l sistema. Dicha computadora podría estar conectadaa una sala ll<strong>en</strong>a <strong>de</strong> terminales o computadoras al otro extremo <strong>de</strong>l corredor o <strong>en</strong> otropiso e incluso <strong>en</strong> otro edificio.Básicam<strong>en</strong>te, todos los sistemas UNIX aceptan varios usuarios a la vez. No obstante,algunas computadoras UNIX sólo pue<strong>de</strong>n ser usadas por una persona simultáneam<strong>en</strong><strong>en</strong>tey son mejor conocidas como estaciones <strong>de</strong> trabajo 4 .4 Esto no significa que la estación <strong>de</strong> trabajo no t<strong>en</strong>ga capacida<strong>de</strong>s multiusuario o multitarea; la esta-


1.3 Inicio <strong>de</strong> sesión 51.3. Inicio <strong>de</strong> sesiónD<strong>en</strong>tro <strong>de</strong> los sistemas UNIX, todos los usuarios <strong>de</strong>l sistema, sea éste uniusuario omultiusuario, se i<strong>de</strong>ntifican con un nombre <strong>de</strong> usuario, también conocido como su logino logname, que será provisto por el administrador <strong>de</strong>l sistema. La clave <strong>de</strong> usuariog<strong>en</strong>eralm<strong>en</strong>te está relacionada con el nombre y apellido <strong>de</strong>l usuario. Dos usos comuneses la <strong>de</strong> dar al usuario la primera letra <strong>de</strong> su nombre junto con su apellido, o las tres iniciales<strong>de</strong> su nombre y dos apellidos. Por ejemplo, supongamos que el nombre completo<strong>de</strong> un usuario es Juan Pérez y su nombre <strong>de</strong> usuario podría ser juan o jp. En este libro,utilizaremos juan como tu nombre <strong>de</strong> usuario.Para usar un sistema UNIX, <strong>en</strong> primer lugar <strong>de</strong>bes iniciar una sesión con un nombre<strong>de</strong> usuario; el sistema pedirá este nombre por medio <strong>de</strong>l programa login; <strong>de</strong>berás teclearla clave que te fue asignada, respetando minúsculas y mayúsculas 5 . Al terminar con loscarácteres que compon<strong>en</strong> tu clave, <strong>de</strong>berás oprimir la tecla Enter , para que el sistemareciba la clave y la procese. Supongamos que la clave <strong>de</strong> acceso es juanPerez123. Lapantalla <strong>de</strong> la computadora se ve como <strong>en</strong> la figura 1.1, esperando a que le <strong>de</strong>s lacontraseña correcta.Figura 1.1Acceso al sistema.Red Hat <strong>Linux</strong> release 6.2 ( Zoot )Kernel 2.2.14 −5.0 on an i686l o g i n : juanPassword :En este punto <strong>de</strong>l proceso <strong>de</strong> iniciar una sesión, <strong>de</strong>berás teclear la contraseña <strong>de</strong>acceso que ti<strong>en</strong>es registrada <strong>en</strong> el sistema. Nota que, por seguridad, la contraseña no semuestra <strong>en</strong> la pantalla, por lo cual se <strong>de</strong>berá teclear con cuidado, también respetandomayúsculas y minúsculas. Si la clave <strong>de</strong> acceso correspon<strong>de</strong> con la registrada <strong>en</strong> elsistema, podrás iniciar una sesión.Si Juan ingresa correctam<strong>en</strong>te su contraseña, la pantalla <strong>de</strong> la computadora lucirácomo <strong>en</strong> la figura 1.2, don<strong>de</strong> estNum es el nombre <strong>de</strong> la computadora <strong>en</strong> la que se estáiniciando la sesión. La forma precisa <strong>de</strong> cómo aparece la combinación <strong>de</strong>l nombre <strong>de</strong>lusuario y el nombre <strong>de</strong> la máquina pue<strong>de</strong> variar, pero usualm<strong>en</strong>te aparec<strong>en</strong> <strong>en</strong> don<strong>de</strong> elción <strong>de</strong> trabajo es una máquina con capacida<strong>de</strong>s limitadas tanto <strong>en</strong> espacio <strong>en</strong> disco como <strong>en</strong> velocidad<strong>de</strong> procesami<strong>en</strong>to, razón por la cual es conv<strong>en</strong>i<strong>en</strong>te que sólo una persona la utilice.5 UNIX es s<strong>en</strong>sible al uso <strong>de</strong> mayúsculas y minúsculas.


6 Introducción a Unixsistema espera que le <strong>de</strong>s instrucciones una vez iniciada la sesión.Figura 1.2Inicio <strong>de</strong> una sesión <strong>en</strong> un sistema UNIX.Fedora Core release 2 ( Tettnang )Kernel 2.6.5 −1.385 on an i686l o g i n : juanPassword :Last l o g i n : Tue Nov 28 11:20:54 from bar . f c i e n c i a s . unam .mx[ juan@estNum j d] %Es común equivocarse al teclear la contraseña. Si esto suce<strong>de</strong>, el sistema respon<strong>de</strong>rácon un m<strong>en</strong>saje <strong>de</strong> contraseña inválida y proce<strong>de</strong>rá a pedirte nuevam<strong>en</strong>te el inicio <strong>de</strong>sesión, <strong>de</strong>s<strong>de</strong> la clave <strong>de</strong> usuario:Figura 1.3Equivocación al teclear la contraseña.I n c o r r e c t password . Try againl o g i n :1.4. EmacsPue<strong>de</strong>s corregir la contraseña mi<strong>en</strong>tras no hayas oprimido la tecla Enter , si oprimessimultáneam<strong>en</strong>te las teclas Control – u 6 , lo que borra todos los carácteres tecleadoshasta ese mom<strong>en</strong>to y pue<strong>de</strong>s volver a empezar a teclearla. Esto es conv<strong>en</strong>i<strong>en</strong>te por dosrazones: la primera <strong>de</strong> ellas, para ahorrarte el t<strong>en</strong>er que volver a teclear la clave <strong>de</strong>usuario y la segunda porque el sistema te dará un número máximo <strong>de</strong> oportunida<strong>de</strong>s(g<strong>en</strong>eralm<strong>en</strong>te <strong>en</strong>tre tres y cinco) para <strong>en</strong>trar <strong>en</strong> sesión, por lo que es <strong>de</strong>seable evitarintroducir mal la contraseña.1.4.1. Introducción a EmacsEmacs es un editor <strong>de</strong> pantalla avanzado, auto–docum<strong>en</strong>tado, configurable, ext<strong>en</strong>sibley <strong>de</strong> tiempo real.Decimos que Emacs es un editor <strong>de</strong> pantalla porque normalm<strong>en</strong>te el texto que queremoseditar es visible <strong>en</strong> la pantalla y se actualiza automáticam<strong>en</strong>te mi<strong>en</strong>tras tecleas loscomandos; es por esto último que <strong>de</strong>cimos que es <strong>de</strong> tiempo real. El nombre “Emacs”fue escogido como abreviatura <strong>de</strong> “Editor MACros”.6 Usaremos <strong>en</strong> a<strong>de</strong>lante la notación C-u , que <strong>de</strong>berá leerse como control u, para <strong>de</strong>notar la combinación<strong>de</strong> la tecla Control oprimida al mismo tiempo que u .


1.4 Emacs 7C-h esControljunto con hDecimos que es avanzado porque ti<strong>en</strong>e muchas más funciones <strong>de</strong> las que comúnm<strong>en</strong>te<strong>en</strong>contramos <strong>en</strong> editores <strong>de</strong> pantalla, como son control <strong>de</strong> subprocesos, facilida<strong>de</strong>spara la edición <strong>de</strong> archivos fu<strong>en</strong>te <strong>de</strong> varios l<strong>en</strong>guajes <strong>de</strong> programación, así comouna gran cantidad <strong>de</strong> utilerías para hacer nuestra vida más fácil.El que sea auto-docum<strong>en</strong>tado significa que <strong>en</strong> cualquier mom<strong>en</strong>to pue<strong>de</strong>s teclearuna secu<strong>en</strong>cia especial, que es C-h, y saber cuáles son tus opciones; también pue<strong>de</strong>s<strong>en</strong>contrar qué hace cualquier comando o <strong>en</strong>contrar docum<strong>en</strong>tación específica <strong>de</strong> untema.El que sea configurable significa que pue<strong>de</strong>s cambiar las <strong>de</strong>finiciones <strong>de</strong> los comandos<strong>de</strong> Emacs, es <strong>de</strong>cir, controlar su comportami<strong>en</strong>to para que se adapte a tus necesida<strong>de</strong>so tus prefer<strong>en</strong>cias.Ext<strong>en</strong>sible significa que pue<strong>de</strong>s ir más allá <strong>de</strong> la simple configuración y escribir comandoscompletam<strong>en</strong>te nuevos, usando un l<strong>en</strong>guaje <strong>de</strong> programación llamado Emacs-Lisp, <strong>de</strong>l cual también apr<strong>en</strong><strong>de</strong>rás algo <strong>en</strong> estas notas <strong>en</strong> la Sección 9.2.1.4.2. Emacs y túSi hay algo que <strong>de</strong>bes apr<strong>en</strong><strong>de</strong>r y atesorar <strong>de</strong> este libro, es Emacs. Una situación quele ocurre a todas las aplicaciones <strong>de</strong> software <strong>en</strong> <strong>Linux</strong> y <strong>en</strong> prácticam<strong>en</strong>te cualquiersistema operativo es que pasan <strong>de</strong> moda, pier<strong>de</strong>n vig<strong>en</strong>cia rápidam<strong>en</strong>te. Es probableincluso que para el mom<strong>en</strong>to que leas algunos capítulos <strong>de</strong> este trabajo, las aplicacionesaquí revisadas hayan sido reemplazadas por otras o que existan versiones nuevas y, conalta probabilidad por <strong>de</strong>sgracia, serán distintas.Emacs ti<strong>en</strong>e una historia <strong>de</strong> muchos años, más <strong>de</strong> tres décadas <strong>en</strong> circulación, y algoimportante es que no ha cambiado significativam<strong>en</strong>te y, estamos seguros, será el caso<strong>en</strong> este mom<strong>en</strong>to que tú te inicias <strong>en</strong> Emacs. Esto es importante porque la inversiónintelectual que realizas al apr<strong>en</strong><strong>de</strong>r y dominar este editor te redituará por muchos años.Por este motivo, a lo largo <strong>de</strong> todo el libro, <strong>en</strong>contrarás una sección titulada así:Emacs. En cada una <strong>de</strong> estas secciones te mostraremos qué hace tan interesante a esteeditor y <strong>de</strong>scubriremos juntos muchas <strong>de</strong> las tareas que pue<strong>de</strong>n at<strong>en</strong><strong>de</strong>rse a través <strong>de</strong>Emacs, por ejemplo: editar diversos archivos, programar <strong>en</strong> distintos l<strong>en</strong>guajes, acce<strong>de</strong>ra tu correo electrónico, <strong>en</strong>tre otras acciones y todo esto al mismo tiempo.Si bi<strong>en</strong> es cierto que pue<strong>de</strong>s ejecutar distintas aplicaciones (explicadas <strong>en</strong> este mismolibro) para realizar muchas tareas <strong>de</strong> manera simultánea, cuando utilizas Emacs pararealizar algunas o todas esas tareas, obti<strong>en</strong>es ciertas v<strong>en</strong>tajas: memoria compartida, unexcel<strong>en</strong>te sistema <strong>de</strong> respaldo para copiar, pegar o reor<strong>de</strong>nar datos, <strong>en</strong>tre otras v<strong>en</strong>tajas.Tu productividad se increm<strong>en</strong>tará notablem<strong>en</strong>te, te lo garantizamos.


Ambi<strong>en</strong>tes2gráficos <strong>en</strong> <strong>Linux</strong>2.1. Ambi<strong>en</strong>tes <strong>de</strong> escritorioUn escritorio ofrece una interfaz gráfica <strong>de</strong> usuario 1 para interactuar con la computadora.La otra opción para interactuar con la computadora es mediante una interfaz <strong>de</strong>línea <strong>de</strong> comandos 2 . Para la mayoría <strong>de</strong> las personas el escritorio más común es Windows<strong>de</strong> Microsoft, para otras cuantas MAC OS. En <strong>Linux</strong> se ti<strong>en</strong><strong>en</strong> muchos escritoriosque pue<strong>de</strong>s utilizar <strong>en</strong> tu computadora. La base <strong>de</strong> todos estos escritorios es el sistema<strong>de</strong> v<strong>en</strong>tanas X, que es un sistema que provee los elem<strong>en</strong>tos básicos para que se dibuj<strong>en</strong>las v<strong>en</strong>tanas y se interactúe con ellas. La interacción más común <strong>en</strong>tre el servidor <strong>de</strong> Xy el usuario es cuando el cli<strong>en</strong>te está corri<strong>en</strong>do <strong>en</strong> la misma computadora que el servidor.Esto es lo que ocurre cuando inicias tu computadora <strong>de</strong> forma normal. Exist<strong>en</strong>otras posibilida<strong>de</strong>s como exportar todo tu escritorio <strong>de</strong>s<strong>de</strong> otra computadora o exportaralgunas v<strong>en</strong>tanas.Tomando como base a X, exist<strong>en</strong> varios escritorios para <strong>Linux</strong>. Como <strong>en</strong> la mayoría<strong>de</strong> las aplicaciones <strong>en</strong> UNIX, exist<strong>en</strong> más <strong>de</strong> una para realizar la misma tarea. Algunos<strong>de</strong> los más comunes son:KDEGNOME1 GUI, <strong>de</strong>l inglés Graphic User Interface2 CLI, <strong>de</strong>l inglés, Command Line Interface


10 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>Enlight<strong>en</strong>m<strong>en</strong>tXfce2.2. KDEKDE es un escritorio libre para estaciones <strong>de</strong> trabajo UNIX. La motivación <strong>de</strong> los<strong>de</strong>sarrolladores es t<strong>en</strong>er un escritorio para UNIX con el que sea fácil trabajar, y quet<strong>en</strong>ga una aplicación equival<strong>en</strong>te a las disponibles <strong>en</strong> los sistemas operativos propietarios.KDE hace uso <strong>de</strong> QT, una caja <strong>de</strong> herrami<strong>en</strong>tas (toolkit) gráfico <strong>de</strong> la compañiaTrolltech. Cuando se tomó esta <strong>de</strong>cisión <strong>en</strong> 1996, por el autor Matthias Ettrich 3 , hubovarias críticas por esa <strong>de</strong>cisión. El problema es que <strong>en</strong> esas fechas QT no t<strong>en</strong>ía unalic<strong>en</strong>cia <strong>de</strong> software libre y a la g<strong>en</strong>te <strong>de</strong>l proyecto GNU le preocupaba que se usaraalgo así para crear un escritorio que quería ser libre. Dada esta situación se inició otroproyecto, GNOME, que no haría uso <strong>de</strong> QT y sería totalm<strong>en</strong>te libre. En Noviembre <strong>de</strong>1998 Trolltech creó una nueva lic<strong>en</strong>cia Q Public Lic<strong>en</strong>se bajo la cual distribuía a QT.Finalm<strong>en</strong>te <strong>en</strong> Septiembre <strong>de</strong>l 2000, Trolltech liberó la versión <strong>de</strong> QT para UNIX bajola GPL, a<strong>de</strong>más <strong>de</strong> la QPL, por lo que ahora KDE es totalm<strong>en</strong>te libre.2.2.1. Configuración <strong>de</strong> KDEEl comportami<strong>en</strong>to <strong>de</strong> KDE lo pue<strong>de</strong>s configurar mediante el uso <strong>de</strong>l c<strong>en</strong>tro <strong>de</strong>control <strong>de</strong> KDE, el cual pue<strong>de</strong>s ejecutar mediante el comando kcontrol. Para ejecutaruna aplicación sin t<strong>en</strong>er que hacer uso <strong>de</strong> la consola pue<strong>de</strong>s utilizar el atajo por omisiónAlt+F2. En la figura 2.1 se muestra la v<strong>en</strong>tana inicial <strong>de</strong>l c<strong>en</strong>tro <strong>de</strong> control, dividida <strong>en</strong> 2secciones. En la sección 1 se muestran las categorías mediante las cuales se pue<strong>de</strong> configurara KDE. En la sección 2 se pres<strong>en</strong>ta la información pertin<strong>en</strong>te al módulo que seestá configurando. Al iniciar, KControl nos pres<strong>en</strong>ta <strong>en</strong> esta sección cierta informaciónelem<strong>en</strong>tal:1. Versión <strong>de</strong> KDE2. Nombre <strong>de</strong>l sistema3. Nombre <strong>de</strong>l usuario4. Versión <strong>de</strong>l núcleo <strong>de</strong>l sistema3 El correo que inició todo lo pue<strong>de</strong>s ver <strong>en</strong>http://groups.google.com/group/<strong>de</strong>.comp.os.linux.misc/msg/cb4b2d67ffc3ffce


2.2 KDE 11Figura 2.1KControlAdministración <strong>de</strong> usuariosEn la categoría Administración <strong>de</strong>l sistema se <strong>en</strong>cu<strong>en</strong>tra el módulo Administración<strong>de</strong> usuarios. Des<strong>de</strong> ahí es posible revisar los <strong>de</strong>talles <strong>de</strong> los usuarios exist<strong>en</strong>tes y agregarnuevos usuarios. Cuando se int<strong>en</strong>ta modificar la configuración <strong>de</strong>l sistema es necesariocontar con los permisos a<strong>de</strong>cuados y presionar el botón Modo administrador; <strong>de</strong> noser así sólo pue<strong>de</strong>s modificar los datos que pert<strong>en</strong>ec<strong>en</strong> a tu propia cu<strong>en</strong>ta. Para agregarun nuevo usuario es necesario el botón Nuevo. El c<strong>en</strong>tro <strong>de</strong> control nos pres<strong>en</strong>tará eldiálogo que se muestra <strong>en</strong> la figura 2.2. En él es necesario ingresar los datos que correspon<strong>de</strong>nal nuevo usuario <strong>en</strong>tre los que se <strong>en</strong>cu<strong>en</strong>tran el nombre <strong>de</strong> usuario, su grupoprimario, los grupos a los que pert<strong>en</strong>ece, su directorio personal y el intérprete que va autilizar.Como se ve <strong>en</strong> la figura 2.3 <strong>en</strong> la pestaña Contraseña y Seguridad se pue<strong>de</strong>n establecerdifer<strong>en</strong>tes opciones para la caducidad <strong>de</strong> la contraseña. Pue<strong>de</strong>s <strong>de</strong>cidir si es quela contraseña caduca o no, y cuáles son las acciones que el sistema <strong>de</strong>be tomar <strong>en</strong> caso<strong>de</strong> que esto ocurra.


12 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>Figura 2.2Administración <strong>de</strong> usuariosFigura 2.3Administración <strong>de</strong> contraseñas


2.2 KDE 13Escritorios múltiplesAccesos rápidosEn la categoría Regional y Accesibilidad, se <strong>en</strong>cu<strong>en</strong>tra el módulo Accesos rápidos<strong>de</strong> teclado. Mediante ellos es posible asociar una acción a una combinación <strong>de</strong> teclas. Es<strong>de</strong> esa forma que al presionar las teclas Alt+Tab cambias <strong>de</strong> una v<strong>en</strong>tana a otra. Exist<strong>en</strong>varias combinaciones pre<strong>de</strong>terminadas como Alt+F4 para cerrar una v<strong>en</strong>tana. Des<strong>de</strong>aquí pue<strong>de</strong>s crear combinaciones <strong>de</strong> teclas para ejecutar tus acciones más comunes sint<strong>en</strong>er que separar las manos <strong>de</strong>l teclado.InternacionalizaciónHay ocasiones <strong>en</strong> las que pue<strong>de</strong>s <strong>de</strong>sear t<strong>en</strong>er más <strong>de</strong> una idioma configurado <strong>en</strong>tu sistema. De esa forma pue<strong>de</strong>s hacer que KDE <strong>de</strong>spliegue todos sus m<strong>en</strong>sajes <strong>en</strong> elidioma <strong>de</strong> tu prefer<strong>en</strong>cia. Para po<strong>de</strong>r hacer eso es necesario que instales el paquete <strong>de</strong>internacionalización <strong>de</strong> KDE que correspon<strong>de</strong> al idioma que quieres utilizar. El nombre<strong>de</strong> estos paquetes es <strong>de</strong> la forma k<strong>de</strong>-i18n-XX <strong>en</strong> don<strong>de</strong> XX es el código <strong>de</strong> dos letraspara el idioma que quieres instalar. Para español el nombre <strong>de</strong>l archivo es k<strong>de</strong>-i18n-esmi<strong>en</strong>tras que para italiano es k<strong>de</strong>-i18n-i t. Para instalar dicho paquete es necesario queejecutes apt-get install k<strong>de</strong>-i18n-es. Una vez hecho eso pue<strong>de</strong>s regresar al c<strong>en</strong>tro <strong>de</strong>control y <strong>de</strong>ntro <strong>de</strong> la categoría Regional y Accesibilidad, <strong>en</strong> el módulo País/Región eidioma podrás agregar el idioma que acabas <strong>de</strong> instalar.Disposición <strong>de</strong>l tecladoA<strong>de</strong>más <strong>de</strong> cambiar el idioma con el que se pres<strong>en</strong>ta KDE, también pue<strong>de</strong>s cambiarla disposición <strong>de</strong>l teclado. De esa forma es posible que tu teclado se comporte como sifuera un teclado <strong>en</strong> un idioma distinto. Para hacer eso es necesario que vayas a la categoríaRegional y Accesibilidad y ahí vayas al módulo Disposición <strong>de</strong>l teclado, tal comose muestra <strong>en</strong> la figura 2.4. Deberás seleccionar la opción Activar diseños <strong>de</strong> teclado yluego seleccionar los idiomas que <strong>de</strong>seas <strong>en</strong> tu teclado. En la pestaña Opciones <strong>de</strong> cambiopue<strong>de</strong>s seleccionar cómo quieres que KDE te muestre la ban<strong>de</strong>ra que correspon<strong>de</strong>al teclado que estás utilizando. A<strong>de</strong>más pue<strong>de</strong>s seleccionar si cada vez que cambias ladisposición <strong>de</strong>l teclado afecta a todas las aplicaciones o sólo a la aplicación que estáactiva <strong>en</strong> el mom<strong>en</strong>to <strong>en</strong> el que realizas el cambio. Para cambiar la disposición <strong>de</strong>l teclado<strong>de</strong> forma rápida pue<strong>de</strong>s usar el atajo por omisión <strong>de</strong> KDE que es CTRL+ALT+K;o si seleccionaste la opción para mostrar la ban<strong>de</strong>ra, pue<strong>de</strong>s hacer click sobre ella.


14 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>Figura 2.4Disposición <strong>de</strong>l teclado2.2.2. KDE <strong>en</strong> 1, 2, 3Cuando acabas <strong>de</strong> <strong>en</strong>trar a KDE, verás el escritorio que se muestra <strong>en</strong> la figura 2.5.Ahí hemos resaltado algunas secciones, <strong>en</strong> la sección 1 se resalta el M<strong>en</strong>ú K, a partir <strong>de</strong>él pue<strong>de</strong>s acce<strong>de</strong>r a las aplicaciones que estén instaladas <strong>en</strong> tu sistema. En la sección2 ti<strong>en</strong>es accesos rápidos a aplicaciones utilizadas frecu<strong>en</strong>tem<strong>en</strong>te. En la sección 3 semuestra el navegador <strong>de</strong> los escritorios virtuales (que veremos un poco más a<strong>de</strong>lante).En 4 se muestran las aplicaciones que estén ejecutándose <strong>en</strong> un mom<strong>en</strong>to dado. Finalm<strong>en</strong>te<strong>en</strong> 5 pue<strong>de</strong>s ver applets <strong>de</strong> aplicaciones que están ejecutándose <strong>en</strong> el background.Veamos ahora cómo realizar algunas <strong>de</strong> las tareas comunes <strong>en</strong> KDE.2.2.3. Quemado <strong>de</strong> discos con K3bDes<strong>de</strong> hace algunos años la forma <strong>de</strong> transmitir información <strong>en</strong> un medio físicoha cambiado radicalm<strong>en</strong>te; las computadoras actuales ya no ti<strong>en</strong><strong>en</strong> bahías para discosflexibles y, aunque <strong>en</strong> los últimos años las memorias flash son cada vez más populares,los CD’s prevalec<strong>en</strong> como un medio útil. D<strong>en</strong>tro <strong>de</strong> KDE la aplicación para quemardiscos es K3b, este provee al usuario <strong>de</strong> una interfaz s<strong>en</strong>cilla para po<strong>de</strong>r quemar CD o


2.2 KDE 15DVD. Hay que señalar que K3b es sólo la interfaz gráfica ya que el trabajo real lo llevana cabo las aplicaciones cdrecord, cdrdao y growisofs. En la figura 2.6 se muestra lav<strong>en</strong>tana inicial <strong>de</strong> K3b.Figura 2.5El escritorioQuemado <strong>de</strong> un disco <strong>de</strong> datosAl seleccionar la opción Nuevo proyecto <strong>de</strong> CD <strong>de</strong> Datos, K3b te pres<strong>en</strong>ta conuna interfaz para navegar el sistema <strong>de</strong> archivos y seleccionar cuáles archivos son losque <strong>de</strong>seas incluir <strong>en</strong> tu CD. Para agregar un archivos nuevo a la compilación sólo esnecesario <strong>en</strong>contrarlos <strong>en</strong> el navegador que está <strong>en</strong> la parte superior y seleccionarlo,como se muestra <strong>en</strong> la figura 2.7. Otra opción es arrastrarlos <strong>de</strong>s<strong>de</strong> Konqueror o <strong>de</strong>s<strong>de</strong>el escritorio hacia la parte baja <strong>de</strong> K3b.


16 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>Figura 2.6K3bFigura 2.7Quemado <strong>de</strong> un disco <strong>de</strong> datosCuando ya seleccionaste todo lo que <strong>de</strong>seas agregar al CD, basta presionar el botónGrabar para seleccionar las opciones con las que <strong>de</strong>seas crear el CD. Las pestañas


2.2 KDE 17más importantes son Grabando y Descripción <strong>de</strong>l volum<strong>en</strong>. En la primera es necesarioseleccionar cuál dispositivo se va a usar para quemar el disco y a qué velocidad,qué modo <strong>de</strong> grabación y qué opciones queremos emplear. En los modos <strong>de</strong> grabaciónpue<strong>de</strong>s seleccionar uno <strong>de</strong> los sigui<strong>en</strong>tes:DAOTAOEn brutoDisc at once, copia todo el disco <strong>en</strong> una sola pasada.Track at once, g<strong>en</strong>era pausas <strong>en</strong>tre cada una <strong>de</strong> las pistas <strong>de</strong>l disco.No procesa los datos (útil para copiar imág<strong>en</strong>es).Entre las opciones que pue<strong>de</strong>s seleccionar están:Simular No lleva a cabo la copia, sólo la simula, para ver si no hay problemas.Al vuelo Copia los datos directam<strong>en</strong>te, sin g<strong>en</strong>erar una imag<strong>en</strong> intermedia.Sólo crear imag<strong>en</strong> En lugar <strong>de</strong> quemar el disco crea una imag<strong>en</strong>, para ser quemadaposteriorm<strong>en</strong>te.Eliminar imag<strong>en</strong> Si se creó la imag<strong>en</strong> para quemarla, se pue<strong>de</strong> eliminar una vez completadoel proceso.Verificar los datos grabados Una vez terminado el proceso <strong>de</strong> quemado, se comparanlos datos para ver que hayan sido copiados exitosam<strong>en</strong>te.En la pestaña Descripción <strong>de</strong>l volum<strong>en</strong> pue<strong>de</strong>s ingresar los datos con los que quieresque se i<strong>de</strong>ntifique al disco. Pue<strong>de</strong>s ingresar la etiqueta <strong>de</strong>l disco, el nombre <strong>de</strong> la personaque preparó los datos, el nombre <strong>de</strong> la persona que los editó, <strong>en</strong> qué sistema operativose realizó la copia y con qué aplicación.Quemado <strong>de</strong> un disco <strong>de</strong> músicaAl seleccionar la opción Nuevo proyecto <strong>de</strong> CD <strong>de</strong> audio, K3b te pres<strong>en</strong>ta una interfazsimilar a la utilizada para quemar datos; la difer<strong>en</strong>cia es cómo pres<strong>en</strong>ta la informaciónque quieres quemar <strong>en</strong> el disco. Ahora pres<strong>en</strong>ta cada uno <strong>de</strong> los tracks que quieresgrabar y la duración <strong>de</strong> cada uno <strong>de</strong> ellos, como se muestra <strong>en</strong> la figura 2.8. Para po<strong>de</strong>rutilizar archivos mp3 <strong>de</strong>ntro <strong>de</strong> k3b es necesario instalar una biblioteca adicional.Debes instalar el paquete libk3b2-mp3, y lo haces con el comando sudo apt-get installlibk3b2-mp3. El resto <strong>de</strong> las opciones para grabar son similares a las pres<strong>en</strong>tadascuando quemas un disco <strong>de</strong> datos.


18 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>Figura 2.8Quemado <strong>de</strong> un disco <strong>de</strong> audio2.2.4. AmarokA<strong>de</strong>más <strong>de</strong> usar la computadora para trabajar o para jugar, una <strong>de</strong> las tareas máscomunes es la <strong>de</strong> escuchar música. Para po<strong>de</strong>r hacer eso <strong>de</strong>ntro <strong>de</strong> KDE pue<strong>de</strong>s usarAmarok. Amarok se <strong>en</strong>carga <strong>de</strong> t<strong>en</strong>er un solo lugar <strong>en</strong> don<strong>de</strong> pue<strong>de</strong>s escuchar música<strong>de</strong> CD, archivos .mp3, archivos .ogg e incluso flujos <strong>de</strong>s<strong>de</strong> internet. Cuando Amarokinicia por primera vez se ve como <strong>en</strong> la figura 2.9. Para agregar archivos que <strong>de</strong>sees escuchares necesario que vayas al m<strong>en</strong>ú Lista <strong>de</strong> reproducción y selecciones el elem<strong>en</strong>toAñadir medio. Después <strong>de</strong>berás navegar el sistema <strong>de</strong> archivos hasta que <strong>en</strong>cu<strong>en</strong>tres losarchivos que quieres agregar.Cuando Amarok inicia por primera vez te pedirá que crees una colección <strong>de</strong> música;si aceptas te pres<strong>en</strong>tará una vista <strong>en</strong> la que pue<strong>de</strong>s construir tu colección <strong>de</strong> música,<strong>de</strong>cidi<strong>en</strong>do <strong>en</strong> qué directorios <strong>de</strong>seas buscar. Ésta es una parte es<strong>en</strong>cial para que puedasutilizar todos los b<strong>en</strong>eficios que te ofrece Amarok. Cuando Amarok termine <strong>de</strong> g<strong>en</strong>erartu colección podrás agregar cualquier canción que ahí aparezca a la lista <strong>de</strong> música que<strong>de</strong>seas escuchar 4 .4 Si cuando int<strong>en</strong>tas escuchar la música te hace falta alguna biblioteca, Amarok te lo indicará y lainstalará por ti


2.3 Emacs 19Figura 2.9AmarokNavegadoresLos navegadores <strong>en</strong> Amarok te permit<strong>en</strong> acce<strong>de</strong>r a tus canciones <strong>de</strong> distintas formas.Éstos se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> la parte izquierda <strong>de</strong> Amarok, como se muestra <strong>en</strong> la sección 1<strong>de</strong> la figura 2.9.Contexto Aquí Amarok te pres<strong>en</strong>ta información acerca <strong>de</strong> la canción que estás escuchando<strong>en</strong> ese mom<strong>en</strong>to. Pue<strong>de</strong>s navegarla y revisar la letra <strong>de</strong> la canción, el disco<strong>en</strong> don<strong>de</strong> aparece o la biografía <strong>de</strong>l artista.Colección Te permite navegar tu colección <strong>de</strong> música.Listas <strong>de</strong> reproducción Aquí pue<strong>de</strong>s administrar las difer<strong>en</strong>tes listas <strong>de</strong> música, paraque puedas cargar la música que quieres <strong>de</strong> forma rápida.Dispositivo <strong>de</strong> medios Si conectas un reproductor <strong>de</strong> MP3 a tu computadora, <strong>de</strong>s<strong>de</strong>aquí pue<strong>de</strong>s hacer que Amarok toque esa música <strong>en</strong> tu computadora.


20 Ambi<strong>en</strong>tes gráficos <strong>en</strong> <strong>Linux</strong>2.3. EmacsCada vez, a partir <strong>de</strong> este capítulo, que te <strong>en</strong>cu<strong>en</strong>tres con una sección titulada Emacs,te recom<strong>en</strong>damos iniciar el editor y probar todo lo que te vamos explicando. La mayoría<strong>de</strong> las secciones sobre Emacs te muestran una faceta completam<strong>en</strong>te distinta; porejemplo, Emacs como editor <strong>de</strong> texto (Sección 4.3); o cómo ejecutar comandos; o unintérprete <strong>de</strong> comandos <strong>de</strong> Unix <strong>de</strong>ntro <strong>de</strong> Emacs (Sección 3.6). En esta sección simplem<strong>en</strong>tete mostramos como iniciar Emacs <strong>de</strong>s<strong>de</strong> el m<strong>en</strong>ú <strong>de</strong> KDE.Figura 2.10Emacs <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE2.4. Com<strong>en</strong>zando con Emacs$ smart Primero que nada, <strong>de</strong>bes saber cuál Emacs está instalado <strong>en</strong> tu sistema, porque hayinstall emacs muchas implem<strong>en</strong>taciones <strong>de</strong> editores parecidos a Emacs.


2.4 Com<strong>en</strong>zando con Emacs 21La versión más importante y reconocida <strong>de</strong> Emacs es la <strong>de</strong>l proyecto GNU 5 , lacual, junto con XEmacs 6 – otra versión muy popular y completa <strong>de</strong> Emacs – son lasopciones más comunes hoy <strong>en</strong> día; si tu sistema operativo es algún Unix <strong>de</strong> distribuciónlibre (<strong>Linux</strong>, FreeBSD, Hurd, etc.) muy probablem<strong>en</strong>te ya ti<strong>en</strong>es instalado uno o amboseditores.El lugar usual para Emacs <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE es <strong>en</strong> la sección <strong>de</strong> <strong>de</strong>sarrollo, reafirmandoque Emacs es una bu<strong>en</strong>a opción para <strong>de</strong>sarrolladores y diseñadores <strong>de</strong> sistemas.5 Para mayor información sobre Emacs y el proyecto GNU, visita http://www.gnu.org.6 XEmacs es otra versión <strong>de</strong> Emacs. Su énfasis está <strong>en</strong> el soporte <strong>de</strong> interfaces gráficas <strong>de</strong> usuario.Algunos <strong>de</strong> los autores <strong>de</strong>l pres<strong>en</strong>te trabajo usamos XEmacs y otros Emacs; sin embargo, prácticam<strong>en</strong>tetodo lo que veremos aquí pue<strong>de</strong> ser usado, sin cambio alguno, <strong>en</strong> ambas versiones. Si quieres másinformación sobre XEmacs visita el sitio, http://www.xemacs.org.


Sistema <strong>de</strong>Archivos 33.1. El sistema <strong>de</strong> archivosEl sistema <strong>de</strong> archivos <strong>de</strong> Unix es la forma <strong>en</strong> la que los usuarios y el sistemaoperativo organizan su información. Éste consiste <strong>de</strong> un conjunto <strong>de</strong> archivos, cada uno<strong>de</strong> los cuales ti<strong>en</strong>e un nombre llamado nombre <strong>de</strong> archivo. Hay tres clases <strong>de</strong> archivos:Archivos regulares, que conti<strong>en</strong><strong>en</strong> información.Directorios 1 , que conti<strong>en</strong><strong>en</strong> un conjunto <strong>de</strong> archivos. Los conjuntos <strong>de</strong> archivosse i<strong>de</strong>ntifican por el nombre <strong>de</strong>l directorio que los agrupa.Archivos especiales <strong>de</strong> varias clases:• Archivos especiales <strong>de</strong> dispositivo, que prove<strong>en</strong> acceso a dispositivos talescomo terminales o impresoras.• Archivos especiales FIFO (First In First Out, cola), algunas veces llamadosnamed pipes, que prove<strong>en</strong> un canal para comunicación <strong>en</strong>tre procesosin<strong>de</strong>p<strong>en</strong>di<strong>en</strong>tes y que ti<strong>en</strong><strong>en</strong> un nombre asociado.Como la mayoría <strong>de</strong> los sistemas operativos mo<strong>de</strong>rnos, Unix organiza su sistema<strong>de</strong> archivos como una jerarquía <strong>de</strong> directorios. La jerarquía <strong>de</strong> directorios es un árbol(tree), pero dibujado como un árbol <strong>de</strong> cabeza o <strong>de</strong> lado. Un directorio especial, root,1 Los directorios también se conoc<strong>en</strong> como carpetas.


24 Sistema <strong>de</strong> Archivoses la raíz <strong>de</strong> la jerarquía. Más a<strong>de</strong>lante veremos comandos para navegar y modificar elárbol <strong>de</strong> directorios.Un directorio pue<strong>de</strong> cont<strong>en</strong>er subdirectorios, archivos regulares y archivos especiales.Unix trata a los subdirectorios como tipos particulares <strong>de</strong> archivos. Si uno <strong>de</strong>spliegalos cont<strong>en</strong>idos <strong>de</strong> un directorio, los subdirectorios se listan junto con los <strong>de</strong>más archivos.Unix ve a un archivo, no importando su tipo, como una sucesión <strong>de</strong> bytes, almac<strong>en</strong>ados<strong>en</strong> dispositivos externos como un disco duro, un diskette, un CD, un DVD ouna unidad <strong>de</strong> almac<strong>en</strong>ami<strong>en</strong>to USB. Los programas que usan al archivo i<strong>de</strong>ntificancualquier estructura interna que el archivo pueda t<strong>en</strong>er.Un nombre <strong>de</strong> archivo pue<strong>de</strong> t<strong>en</strong>er hasta 255 carácteres <strong>en</strong> la mayoría <strong>de</strong> los sistemas;antes se limitaba el tamaño <strong>de</strong> un nombre a 14 carácteres.El nombre <strong>de</strong> un archivo pue<strong>de</strong> cont<strong>en</strong>er cualquier carácter excepto ‘/’ o el carácternulo; sin embargo, algunos otros como ‘&’ y ’ ’ (espacio <strong>en</strong> blanco) pue<strong>de</strong>ncausar problemas por sus significados especiales para su interpretación <strong>en</strong> la línea <strong>de</strong>comandos. Si tu sistema permite carácteres fuera <strong>de</strong>l conjunto ASCII, tales como letrasac<strong>en</strong>tuadas (como nuestra letra ñ), también se pue<strong>de</strong>s usarlas para nombrar archivos.Los nombres <strong>de</strong> archivos son s<strong>en</strong>sibles a las mayúsculas y minúsculas, esto es, archivoy Archivo i<strong>de</strong>ntifican a dos archivos distintos. Por conv<strong>en</strong>ción, los archivos cuyonombre comi<strong>en</strong>za con un punto (‘.’), llamados dot files, por lo g<strong>en</strong>eral se usan comoarchivos <strong>de</strong> configuración para programas.Algunos programas esperan que sus archivos <strong>de</strong> <strong>en</strong>trada y salida estén compuestos<strong>de</strong> un i<strong>de</strong>ntificador seguido <strong>de</strong> un punto y luego una ext<strong>en</strong>sión. En g<strong>en</strong>eral es una conv<strong>en</strong>ciónmuy útil para el usuario utilizar ext<strong>en</strong>siones <strong>en</strong> los nombres <strong>de</strong> sus archivospara i<strong>de</strong>ntificarlos fácilm<strong>en</strong>te. Por ejemplo:txtjpgjavacctexcSe refiere a archivos <strong>de</strong> textoSe refiere a imág<strong>en</strong>es <strong>en</strong> formato JPEGProgramas <strong>de</strong> JavaProgramas <strong>de</strong> C++Docum<strong>en</strong>tos para L A TEXProgramas <strong>de</strong> CEn el caso <strong>de</strong> los sistemas Unix, el número <strong>de</strong> carácteres <strong>en</strong> la ext<strong>en</strong>sión no estálimitado, más que <strong>en</strong> cuanto a que el nombre total <strong>de</strong>l archivo no pue<strong>de</strong> t<strong>en</strong>er más <strong>de</strong>255 carácteres.En Unix, como ya m<strong>en</strong>cionamos y al igual que <strong>en</strong> otros sistemas operativos, losarchivos se almac<strong>en</strong>an <strong>en</strong> una estructura jerárquica <strong>de</strong> árbol, cuyo primer nivel es eldirectorio raíz, el cual se <strong>de</strong>nota por el carácter ‘/’. Dicho directorio almac<strong>en</strong>a todoslos archivos <strong>de</strong>l sistema, que a su vez pue<strong>de</strong>n ser directorios.En los sistemas Unix, cada usuario ti<strong>en</strong>e un directorio personal, <strong>en</strong> el cual almac<strong>en</strong>asus archivos. Dicho directorio se conoce como el hogar (home). Una vez que <strong>en</strong>tres <strong>en</strong>


3.1 El sistema <strong>de</strong> archivos 25sesión, cada programa que se ejecuta se <strong>en</strong>cu<strong>en</strong>tra situado <strong>en</strong> un directorio <strong>de</strong> trabajo.El shell inicia, por omisión, <strong>en</strong> el directorio hogar <strong>de</strong>l usuario. Un ejemplo simplificado<strong>de</strong> un directorio <strong>en</strong> un sistema Unix se muestra <strong>en</strong> la figura 3.1. En esta figura <strong>en</strong>cerraremos<strong>en</strong> óvalos a los directorios y <strong>en</strong> rectángulos a los archivos. Mostramos puntossusp<strong>en</strong>sivos cuando suponemos que <strong>en</strong> ese lugar aparec<strong>en</strong> un número consi<strong>de</strong>rable <strong>de</strong>archivos y/o directorios, pero por falta <strong>de</strong> espacio no los mostramos.Figura 3.1Sistema <strong>de</strong> archivos <strong>en</strong> un sistema Unixarchbinashrmzsh-3.0.7<strong>de</strong>vMAKEDEVzqft3.emacselisaalgoritmoscapit1/homefulanovarios•tareas•Tarea1vaz••sbinwin98


26 Sistema <strong>de</strong> Archivos3.1.1. Rutas absolutas y relativasLas rutas son expresiones que se usan para i<strong>de</strong>ntificar un archivo o un conjunto <strong>de</strong>archivos. Se construy<strong>en</strong> bajando por el árbol <strong>de</strong>l sistema <strong>de</strong> archivos, como el que semuestra <strong>en</strong> la figura 3.1.Para referirse al directorio raíz se utiliza el carácter ‘/’; a partir <strong>de</strong>l directorio raíz sepue<strong>de</strong> <strong>de</strong>sc<strong>en</strong><strong>de</strong>r <strong>en</strong> la jerarquía <strong>de</strong> directorios, sigui<strong>en</strong>do ramas <strong>de</strong>l árbol, hasta llegar alarchivo o directorio <strong>de</strong>seado, separando cada directorio con el carácter ‘/’. Por ejemplo,para referirse al archivo llamado ash que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el directorio bin, po<strong>de</strong>mosusar la ruta /bin/ash.Cuando se hace refer<strong>en</strong>cia a un archivo o directorio a partir <strong>de</strong>l directorio raíz utilizandouna ruta, se dice que es una ruta absoluta. No es necesario referirse a un archivoo directorio a partir <strong>de</strong> la raíz, sino que también se pue<strong>de</strong> hacer a partir <strong>de</strong>l directorio<strong>de</strong> trabajo, es <strong>de</strong>cir, <strong>en</strong> el directorio <strong>en</strong> el que el usuario se <strong>en</strong>cu<strong>en</strong>tra parado. Cuandouna refer<strong>en</strong>cia a un archivo o directorio se hace a partir <strong>de</strong>l directorio <strong>de</strong> trabajo, se diceque es una ruta relativa.La forma <strong>de</strong> pres<strong>en</strong>tar una ruta relativa es similar a la usada por las rutas absolutas,con la difer<strong>en</strong>cia <strong>de</strong> que al principio no se pone el símbolo /. Así, el <strong>de</strong>sc<strong>en</strong>so <strong>en</strong> lajerarquía por las ramas <strong>de</strong>l árbol no se lleva a cabo a partir <strong>de</strong> la raíz sino a partir <strong>de</strong>ldirectorio <strong>de</strong> trabajo. Por ejemplo, supón que tu clave <strong>de</strong> usuario es fulanito y tu directoriohogar es /home/fulanito. Al iniciar una sesión te <strong>en</strong>contrarás <strong>en</strong> este directorio.Supongamos que te quieres referir al archivo Tarea1 que está <strong>en</strong> el directorio tareas<strong>de</strong> tu propio directorio. Dicho archivo se repres<strong>en</strong>ta usando la ruta absoluta/home/fulanito/tareas/Tarea1y usando una ruta relativatareas/Tarea1.El directorio actual se <strong>de</strong>nota por ‘.’ y su padre se llama ‘..’. Haci<strong>en</strong>do uso <strong>de</strong> dichanotación pue<strong>de</strong>s usar trayectorias que vayan hacia arriba o hacia abajo <strong>en</strong> la jerarquía<strong>de</strong> directorios. Sigui<strong>en</strong>do con el ejemplo anterior, si el directorio <strong>de</strong> trabajo es /home/fulanito/tareas,<strong>en</strong>tonces la ruta relativa <strong>de</strong>l archivo Ejemplo.java <strong>en</strong> el directorioalgoritmos <strong>de</strong>l usuario fulanito es../algoritmos/Ejemplo.javaEl significado <strong>de</strong> esta ruta es: Estando <strong>en</strong> el directorio tareas vamos al padre <strong>de</strong>l mismoque es fulano utilizando ’..’. De ahí bajamos por la rama algoritmos. Sigui<strong>en</strong>do esaruta es que <strong>en</strong>contramos al archivo Ejemplo.java. A esta ruta relativa es equival<strong>en</strong>te laruta absoluta/home/fulano/algoritmos/Ejemplo.javaNota que si el usuario se <strong>en</strong>contrara <strong>en</strong> otro lugar <strong>de</strong>l árbol, la ruta relativa paraalcanzar a Ejemplo.java sería otra. Es, precisam<strong>en</strong>te, relativa al punto <strong>en</strong> el árbol <strong>en</strong> el


3.2 Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivos 27que se <strong>en</strong>cu<strong>en</strong>tre el usuario.Dado que el concepto <strong>de</strong> directorio base o home es tan importante, hay una notaciónespecial para él, reconocida por cualquier intérprete <strong>de</strong> comandos <strong>de</strong> Unix exceptoBourne: el carácter ‘∼’ al inicio <strong>de</strong> una trayectoria se refiere al directorio home<strong>de</strong>l usuario actual, mi<strong>en</strong>tras que ‘∼vaz’ hace refer<strong>en</strong>cia al directorio home <strong>de</strong>l usuariovaz. También utilizaremos esa notación ext<strong>en</strong>sam<strong>en</strong>te. Por ejemplo, para el usuarioelisa, ‘∼/alguno.txt’ se refiere al archivo /home/elisa/alguno.txt.Una notación m<strong>en</strong>os conv<strong>en</strong>i<strong>en</strong>te para referirte al directorio home es $HOME, qu<strong>en</strong>os regresa el valor <strong>de</strong> la variable <strong>de</strong> ambi<strong>en</strong>te HOME que cualquier intérprete <strong>de</strong> comandos,incluy<strong>en</strong>do Bourne, soporta. Por lo tanto, $HOME/alguno.c se refiere al archivoalguno.c <strong>en</strong> tu directorio home.El sistema <strong>de</strong> archivos <strong>de</strong> Unix se pue<strong>de</strong> dividir <strong>en</strong> distintos discos o particiones<strong>de</strong> un mismo disco o incluso <strong>en</strong> distintos medios <strong>de</strong> almac<strong>en</strong>ami<strong>en</strong>to. El sistema <strong>de</strong>archivos se <strong>en</strong>carga <strong>de</strong> hacer esto transpar<strong>en</strong>te a los usuarios, haci<strong>en</strong>do parecer quetodo vive <strong>en</strong> el mismo lugar. Exist<strong>en</strong> distintas razones para hacer esto:Los discos y <strong>de</strong>más dispositivos que conti<strong>en</strong><strong>en</strong> los directorios y sus archivos pue<strong>de</strong>nser insufici<strong>en</strong>tes para mant<strong>en</strong>er la jerarquía completa, así que pue<strong>de</strong> surgir lanecesidad <strong>de</strong> distribuir la jerarquía <strong>en</strong> varios dispositivos.Para conv<strong>en</strong>i<strong>en</strong>cia <strong>en</strong> la administración, pue<strong>de</strong> ser útil partir un disco muy gran<strong>de</strong><strong>en</strong> varias particiones.Los dispositivos <strong>de</strong> almac<strong>en</strong>ami<strong>en</strong>to pue<strong>de</strong>n no estar perman<strong>en</strong>tem<strong>en</strong>te unidosa la computadora. Un disco flexible pue<strong>de</strong> cont<strong>en</strong>er su propia estructura <strong>de</strong> directorios.El sistema <strong>de</strong> archivos <strong>de</strong> red permite que si las computadoras estánconectadas <strong>en</strong>tre sí t<strong>en</strong>gan un sistema <strong>de</strong> archivos compartido.Unix acomoda los sistemas <strong>de</strong> archivos externos asociándoles puntos <strong>de</strong> montaje.Un punto <strong>de</strong> montaje es un directorio <strong>en</strong> un sistema <strong>de</strong> archivos que correspon<strong>de</strong> aldirectorio raíz <strong>de</strong>l sistema <strong>de</strong> archivos externo. El sistema <strong>de</strong> archivos primario es elque emana <strong>de</strong>l directorio raíz real y se llama ’/’. Un sistema <strong>de</strong> archivos externo seliga al sistema primario por medio <strong>de</strong>l comando mount. G<strong>en</strong>eralm<strong>en</strong>te, todo esto estranspar<strong>en</strong>tes para los usuarios comunes, así que no <strong>de</strong>bes preocuparte <strong>de</strong>masiado alrespecto, aunque es bu<strong>en</strong>o saberlo.3.2. Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivosPor omisión, el shell no muestra <strong>en</strong> qué directorio estás trabajando. Es conv<strong>en</strong>i<strong>en</strong>tepo<strong>de</strong>r preguntar cuál es el directorio <strong>de</strong> trabajo (o directorio actual) y esto se hace conel comando:pwd


28 Sistema <strong>de</strong> Archivos(Print Working Directory), a lo que el sistema respon<strong>de</strong> con la ruta absoluta <strong>de</strong>l directorio<strong>en</strong> el que te <strong>en</strong>cu<strong>en</strong>tras.Para cambiarte <strong>de</strong> directorio pue<strong>de</strong>s utilizar rutas relativas, si es que a don<strong>de</strong> tequieres mover está hacia abajo <strong>en</strong> el árbol <strong>de</strong>s<strong>de</strong> el directorio <strong>de</strong> trabajo; o bi<strong>en</strong>, utilizaruna ruta absoluta para moverte arbitrariam<strong>en</strong>te a cualquier otro directorio <strong>de</strong> trabajo. Elcomando que te permite cambiar <strong>de</strong> directorio <strong>de</strong> trabajo escd [ruta](Change Directory). Es importante m<strong>en</strong>cionar que no te pue<strong>de</strong>s mover a un archivo, sinoúnicam<strong>en</strong>te a un directorio. Esto es porque al moverte, lo que se pret<strong>en</strong><strong>de</strong> es cambiar<strong>de</strong> directorio <strong>de</strong> trabajo.Por ejemplo, si estando <strong>en</strong> el directorio <strong>de</strong> trabajo home quieres ubicarte <strong>en</strong> eldirectorio varios <strong>de</strong>l usuario elisa, lo pue<strong>de</strong>s hacer <strong>de</strong> las dos maneras sigui<strong>en</strong>tes:cd elisa/varios/cd /home/elisa/varios/El primer comando usa una ruta relativa, mi<strong>en</strong>tras que el segundo comando usa una rutaabsoluta.Actividad 3.1 Cámbiate a los sigui<strong>en</strong>tes directorios. Después <strong>de</strong> cada cambio, preguntapor el directorio <strong>de</strong> trabajo:(a) Directorio raíz(b) Directorio sbin(c) Directorio hogar con tu clavePara listar el cont<strong>en</strong>ido <strong>de</strong> un directorio usaa:ls [parámetros] [ARCHIVOS]Ambos modificadores se pue<strong>de</strong>n omitir. Los [parámetros] se refier<strong>en</strong> al formato quepue<strong>de</strong>s querer para la lista <strong>de</strong> archivos, mi<strong>en</strong>tras que [archivos] se refiere al lugar <strong>en</strong> elárbol <strong>de</strong>l sistema <strong>de</strong> archivos <strong>de</strong>l que quieres la lista. Si omites los [parámetros] la listaque se muestre será breve, sin mayor información más que el nombre <strong>de</strong>l archivo o <strong>de</strong>los archivos <strong>de</strong>l directorio <strong>de</strong> trabajo. Dos <strong>de</strong> los parámetros más comunes se refier<strong>en</strong>a pedir una lista ext<strong>en</strong>dida, que cont<strong>en</strong>ga, <strong>en</strong>tre otra información, el tipo <strong>de</strong> archivo, sudueño, su tamaño, el día <strong>de</strong> su última modificación. Pue<strong>de</strong>s querer que se list<strong>en</strong> tambiénaquellos archivos que empiezan con algo que no es una letra, como un punto. Para ello,tecleamos el comando <strong>de</strong> la sigui<strong>en</strong>te manera:ls -al /home/fulanito/y se mostrará <strong>en</strong> pantalla la lista <strong>de</strong> archivos y directorios que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el directorio/home/fulanito/, pero únicam<strong>en</strong>te los que cuelgan directam<strong>en</strong>te <strong>de</strong> ese nodo. Siomites [archivos], la lista que se dará será <strong>de</strong> los archivos y directorios inmediatam<strong>en</strong>tecolgando <strong>de</strong>l directorio <strong>de</strong> trabajo.Actividad 3.2 Pi<strong>de</strong> la lista breve <strong>de</strong> archivos que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> /usr/local/


3.2 Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivos 29Actividad 3.3 Pi<strong>de</strong> la lista ext<strong>en</strong>sa <strong>de</strong> archivos que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> /bin/. ¿Cuál es lainformación que aparece?Como pue<strong>de</strong>s ver <strong>de</strong> la actividad anterior, muchas veces los archivos y directorios<strong>en</strong> un directorio son tantos, que si pi<strong>de</strong>s la lista ext<strong>en</strong>sa pudieses no alcanzar a verlacompleta. Para ello, haces lo que se llama <strong>en</strong>tubar (<strong>en</strong> inglés, pipe), que consiste <strong>en</strong> redirigirla salida <strong>de</strong> un comando y usarla como <strong>en</strong>trada <strong>de</strong> un segundo comando. Quieresque el segundo comando sea uno que nos <strong>en</strong>señe la información por páginas. T<strong>en</strong>emosdos <strong>de</strong> estos comandos, que se usan precedidos por el símbolo <strong>de</strong> <strong>en</strong>tubami<strong>en</strong>to ’|’:lessmoreSi utilizas el comando less para <strong>en</strong>tubar:fulanito@[estnum fulanito] % ls -al /bin | lessla respuesta se muestra “por páginas”, esto es, muestra el número <strong>de</strong> r<strong>en</strong>glones que lecabe <strong>en</strong> la pantalla, y se espera <strong>en</strong> la parte inferior <strong>de</strong> la misma a que teclees un espacioo que oprimas la tecla AvPág , para seguir con la sigui<strong>en</strong>te página. Si tecleas q , ellistado se susp<strong>en</strong><strong>de</strong>.Veamos el resultado que se te muestra con el comando anterior <strong>en</strong> la figura 3.2 .Si el comando que se utiliza es less, <strong>en</strong>tonces se podrá regresar sobre el listado,oprimi<strong>en</strong>do RePág ; y avanzar tecleando espacio o AvPág .También pue<strong>de</strong>s “<strong>en</strong>tubar” a que vaya a la impresora, si es que hay alguna conectadaaccesible, con el comando lpr.Actividad 3.4 Utiliza el comando less para <strong>en</strong>tubar el listado <strong>de</strong>l directorio /usr/biny dí cómo respon<strong>de</strong>.Figura 3.2Resultado <strong>de</strong> <strong>en</strong>tubar ls -al con lesst o t a l 6364drwxr−xr−x 2 r o o t r o o t 4096 Apr 19 2000 .drwxr−xr−x 22 r o o t r o o t 4096 Jun 6 05:08 . .−rwxr−xr−x 1 r o o t r o o t 2612 Mar 7 2000 arch−rwxr−xr−x 1 r o o t r o o t 60592 Feb 3 2000 ash−rwxr−xr−x 1 r o o t r o o t 263064 Feb 3 2000 ash . s t a t i c−rwxr−xr−x 1 r o o t r o o t 9968 Feb 3 2000 aumix−minimallrwxrwxrwx 1 r o o t r o o t 4 Feb 17 2000 awk −> gawk−rwxr−xr−x 1 r o o t r o o t 5756 Mar 7 2000 bas<strong>en</strong>ame−rwxr−xr−x 1 r o o t r o o t 316848 Feb 27 2000 bash−rwxr−xr−x 1 r o o t r o o t 446800 Feb 2 2000 bash2lrwxrwxrwx 1 r o o t r o o t 3 Feb 17 2000 bsh −> ash−rwxr−xr−x 1 r o o t r o o t 9528 Feb 7 2000 catContinúa <strong>en</strong> la sigui<strong>en</strong>te página


30 Sistema <strong>de</strong> ArchivosFigura 3.2 Resultado <strong>de</strong> <strong>en</strong>tubar ls -al con more Continúa <strong>de</strong> la página anterior−rwxr−xr−x 1 r o o t r o o t 12044 Mar 7 2000 chgrp−rwxr−xr−x 1 r o o t r o o t 13436 Mar 7 2000 chmod−rwxr−xr−x 1 r o o t r o o t 11952 Mar 7 2000 chown−rwxr−xr−x 1 r o o t r o o t 49680 Mar 6 2000 consolechars−rwxr−xr−x 1 r o o t r o o t 33392 Mar 7 2000 cp−rwxr−xr−x 1 r o o t r o o t 45712 Feb 9 2000 cpiol i n e s 1−183.2.1. Permisos <strong>de</strong> archivosLos permisos <strong>de</strong> acceso a un archivo, o simplem<strong>en</strong>te permisos, especifican quiénpue<strong>de</strong> hacer qué a un archivo. Los permisos <strong>de</strong> un archivo son asignados por su dueñoy se pue<strong>de</strong>n ver con el comando ls -l y modificarlos con el comando chmod.Dado que los permisos <strong>de</strong> un archivo son un atributo <strong>de</strong>l archivo mismo, todas lasligas a ese archivo ti<strong>en</strong><strong>en</strong> los mismos permisos.Permisos para operaciones básicasLas tres operaciones básicas que pue<strong>de</strong>s llevar a cabo <strong>en</strong> un archivo son lectura(read), escritura (write) y ejecución (execute). Los permisos requeridos para realizarestas operaciones están <strong>de</strong>notados por ‘r’, ‘w’ y ‘x’ respectivam<strong>en</strong>te. El permiso x esnecesario para programas compilados y cualquier guión <strong>de</strong> shell que int<strong>en</strong>tes usar comocomando. Por ejemplo, si el archivo qq conti<strong>en</strong>e un guión <strong>de</strong> shell pero no ti<strong>en</strong>e elpermiso x, no pue<strong>de</strong>s ejecutar el comando qq por sí mismo. Si lo int<strong>en</strong>tas, obt<strong>en</strong>drás unm<strong>en</strong>saje <strong>de</strong> error como:command not found: qqSin embargo, pue<strong>de</strong>s ejecutar qq con el comandosh qqaun cuando qq no t<strong>en</strong>ga permiso <strong>de</strong> ejecución. En este ejemplo también necesitas queel archivo qq t<strong>en</strong>ga permisos <strong>de</strong> lectura para po<strong>de</strong>r ejecutar el script ya sea directa oindirectam<strong>en</strong>te.Los permisos r, w y x pue<strong>de</strong>n especificarse in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te para el dueño <strong>de</strong>larchivo, para aquellos que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el mismo grupo que el dueño y para todoslos <strong>de</strong>más. Estas clases están repres<strong>en</strong>tadas simbólicam<strong>en</strong>te por u (user), g (group) y o(others).Los permisos que asignas a un archivo pue<strong>de</strong>n protegerlo no sólo <strong>de</strong> acceso no<strong>de</strong>seado sino también <strong>de</strong> tus propios errores. Por ejemplo, pue<strong>de</strong>s proteger un archivocontra modificaciones no int<strong>en</strong>cionales o <strong>de</strong> borrarlo acci<strong>de</strong>ntalm<strong>en</strong>te suprimi<strong>en</strong>do supermiso w.


3.2 Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivos 31Permisos para directoriosLos permisos <strong>de</strong> archivos también se aplican a los directorios.El permiso r para un directorio te permite ver qué hay <strong>de</strong>ntro, pero es insufici<strong>en</strong>tepara acce<strong>de</strong>r a los archivos que se <strong>en</strong>cu<strong>en</strong>tran <strong>de</strong>ntro.El permiso w para un directorio se requiere para po<strong>de</strong>r añadir o borrar archivos<strong>de</strong> él. Sin embargo, w no es necesario para modificar un archivo listado <strong>en</strong> eldirectorio o borrar su cont<strong>en</strong>ido.El permiso x para un directorio te permite operar con los nombres <strong>en</strong> ese directoriosi los conoces, pero no te permite ver cuáles son si no los conoces. Normalm<strong>en</strong>tesiempre que r se conce<strong>de</strong>, también es así con el permiso x.Otros permisos <strong>de</strong> archivosA<strong>de</strong>más <strong>de</strong> los permisos rwx, Unix ti<strong>en</strong>e otras clases <strong>de</strong> permisos usados principalm<strong>en</strong>te(pero no exclusivam<strong>en</strong>te) por el administrador <strong>de</strong>l sistema. Los <strong>de</strong>scribimos acontinuación.El set-uid bit. El bit set-uid le permite a un programa correr con los permisos <strong>de</strong> sudueño <strong>en</strong> lugar <strong>de</strong> con los permisos <strong>de</strong>l usuario que lo llama. Pue<strong>de</strong>s especificarel bit set-uid con s cuando usas el comando chmod. En un listado, se indicareemplazando la x con una s.Normalm<strong>en</strong>te, cuando llamas un programa y ese programa acce<strong>de</strong> a un archivo,los privilegios <strong>de</strong> acceso <strong>de</strong>l programa son los mismos que tú ti<strong>en</strong>es. Comoejemplo, supón lo sigui<strong>en</strong>te:El usuario patito es dueño <strong>de</strong>l ejecutable qq.El programa qq utiliza el archivo privado <strong>de</strong> patito llamado tarea.El usuario mamá-pato ejecuta el programa qq.Los permisos que se aplican a tarea durante la ejecución son aquéllos <strong>de</strong> “otros”(ya que mamá-pato no es dueña <strong>de</strong> tarea); no se utilizan los permisos <strong>de</strong>l usuariopatito. 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 pue<strong>de</strong> acce<strong>de</strong>r a él.Una posible solución a esto es que patito le dé permisos <strong>de</strong> acce<strong>de</strong>r al archivotarea a todo el mundo, pero <strong>en</strong>tonces mamá-pato podría hacer cualquier cosacon el archivo (incluso, cosas que patito no t<strong>en</strong>ía int<strong>en</strong>sión <strong>de</strong> permitir.)El bit set-uid es una solución a esto. Cuando un proceso ejecuta un programa,invoca la función exec <strong>de</strong>l sistema, especificándole a ésta la ruta <strong>de</strong>l programaa ser llamado. Si los permisos <strong>de</strong>l programa incluy<strong>en</strong> el bit set-uid, <strong>en</strong>tonces el


32 Sistema <strong>de</strong> ArchivosID efectivo <strong>de</strong>l proceso se convierte <strong>en</strong> aquél <strong>de</strong>l dueño <strong>de</strong>l programa, así que elprograma se ejecuta con los privilegios <strong>de</strong>l dueño <strong>de</strong>l programa.En efecto, el bit set-uid habilita a un usuario para acce<strong>de</strong>r a un archivo comotarea indirectam<strong>en</strong>te – con mamá-pato como ag<strong>en</strong>te – pero no directam<strong>en</strong>te.El ejemplo clásico <strong>de</strong>l uso <strong>de</strong>l bit set-uid es el comando passwd. El dueño <strong>de</strong>larchivo /etc/passwd es root (el superusuario) y <strong>de</strong>be ser escrito solam<strong>en</strong>te por elprograma passwd. Los usuarios ordinarios <strong>de</strong>b<strong>en</strong> ser capaces <strong>de</strong> po<strong>de</strong>r ejecutarel comando passwd, pero no <strong>de</strong> modificar directam<strong>en</strong>te el archivo passwd. Porlo tanto, el bit set-uid está <strong>en</strong>c<strong>en</strong>dido 2 para el programa passwd, lo que le permiteescribir <strong>en</strong> el archivo /etc/passwd, mi<strong>en</strong>tras que esa habilidad permanec<strong>en</strong>egada para usuarios ordinarios.El bit set-gid. El bit set-gid es como el set-uid excepto que se aplica a los permisos<strong>de</strong> grupo <strong>en</strong> lugar <strong>de</strong> a los permisos <strong>de</strong> dueño. El bit set-gid se especifica con unas <strong>en</strong> la posición <strong>de</strong> la x <strong>en</strong> los permisos <strong>de</strong>l grupo.El locking bit. Si el locking bit <strong>de</strong> un archivo está pr<strong>en</strong>dido, un programa que estéley<strong>en</strong>do o escribi<strong>en</strong>do el archivo pue<strong>de</strong> bloquear otros int<strong>en</strong>tos <strong>de</strong> leer o escribir<strong>en</strong> él al mismo tiempo. Pr<strong>en</strong><strong>de</strong>r este bit previ<strong>en</strong>e que accesos simultáneos a unarchivo puedan corromper su significado y <strong>de</strong>jarlo <strong>en</strong> un estado inconsist<strong>en</strong>te. Ellocking bit está repres<strong>en</strong>tado por una l reemplazando a la x <strong>en</strong> los permisos <strong>de</strong>lgrupo.El sticky bit. Cuando se aplica a un directorio, el sticky bit previ<strong>en</strong>e que los archivos<strong>de</strong>ntro <strong>de</strong> él sean borrados o r<strong>en</strong>ombrados por otra persona que no sea su dueño.Cuando se aplica a un archivo ejecutable, es la herrami<strong>en</strong>ta a<strong>de</strong>cuada para ret<strong>en</strong>eral programa <strong>en</strong> memoria cuando dicho programa pue<strong>de</strong> ser compartido por variosusuarios. Sólo el superusuario o el dueño <strong>de</strong>l archivo pue<strong>de</strong> activar el sticky bit.Este bit está indicado por una t <strong>en</strong> el lugar <strong>de</strong> la x <strong>en</strong> los permisos <strong>de</strong> otros.Construcción <strong>de</strong> permisosLos comandos chmod, umask y find hac<strong>en</strong> uso <strong>de</strong> la habilidad para construir conjuntos<strong>de</strong> permisos simbólicam<strong>en</strong>te. Esto lo pue<strong>de</strong>s lograr especificando un modo simbólicoque les indique cómo modificar un conjunto exist<strong>en</strong>te, posiblem<strong>en</strong>te vacío, <strong>de</strong>permisos.Un modo simbólico consiste <strong>de</strong> una o más cláusulas separadas por comas. Cadacláusula, <strong>en</strong> turno, consiste <strong>de</strong> cero o más letras “quién” seguidas por una secu<strong>en</strong>cia<strong>de</strong> una o más acciones a aplicar a la categoría <strong>de</strong>signada por las letras “quién”. Cada2 En este contexto, utilizaremos indistintam<strong>en</strong>te pr<strong>en</strong>dido, <strong>en</strong>c<strong>en</strong>dido, arriba o puesto, para indicar queese bit ha sido activado por medio <strong>de</strong> alguna utilería válida como el comando chmod.


3.2 Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivos 33acción consiste <strong>de</strong> un operador seguido ya sea <strong>de</strong> una o más letras <strong>de</strong> permisos, <strong>de</strong> unaletra “quién” o <strong>de</strong> nada <strong>en</strong> absoluto. Estas son las letras “quién”:u Permiso para el usuario <strong>de</strong>l archivo.g Permiso para el grupo <strong>de</strong>l archivo.o Permiso para otros (i.e. el resto <strong>de</strong>l mundo.)a Permiso para cualquiera (equival<strong>en</strong>te a ugo.)Si omites las letras “quién” que prece<strong>de</strong>n al operador, se supone a y la máscara <strong>de</strong>creación (<strong>de</strong> la cual hablaremos más a<strong>de</strong>lante). Éstos son los operadores:+ Aña<strong>de</strong> estos permisos.- Quita estos permisos.= Pr<strong>en</strong><strong>de</strong> exactam<strong>en</strong>te estos permisos, quitando cualquier otro para las letras “quién”indicadas.Éstas son las letras <strong>de</strong> los permisos:r Lecturaw Escriturax EjecuciónX Ejecución sólo si el archivo es un directorio o algún permiso x ya está puestos Establece el ID <strong>de</strong> usuario o grupot Bit pegajosol Bloqueo durante el accesoSi especificas una letra “quién” <strong>de</strong>spués <strong>de</strong> un operador, <strong>en</strong>tonces se copian lospermisos asociados con la letra indicada.Repres<strong>en</strong>tación octal <strong>de</strong> los permisosLos permisos para un archivo pue<strong>de</strong>n ser especificados como un número octal. Estaforma es obsoleta y no recom<strong>en</strong>dada, pero mucha docum<strong>en</strong>tación antigua <strong>de</strong> Unixutiliza la forma octal muy seguido; también algunos sistemas (no nuestro caso, <strong>en</strong> laLic<strong>en</strong>ciatura <strong>en</strong> Ci<strong>en</strong>cias <strong>de</strong> la Computación) no soportan aún la forma simbólica <strong>en</strong>todos los contextos. El número octal se obti<strong>en</strong>e sumando lógicam<strong>en</strong>te los números <strong>de</strong>la sigui<strong>en</strong>te lista:4000 Establece el ID <strong>de</strong>l usuario <strong>en</strong> ejecución.20d0 Establce el ID <strong>de</strong>l grupo <strong>en</strong> ejecución si d es 7,5,3 o 1 (permiso <strong>de</strong> ejecuciónotrogado); habilitar el bloque <strong>de</strong> otra forma.1000 Habilita el bit pegajoso.0400 Establece el permiso <strong>de</strong> lectura para el dueño.


34 Sistema <strong>de</strong> Archivos0200 Establece el permiso <strong>de</strong> escritura para el dueño.0100 Establece el permiso <strong>de</strong> ejecución para el dueño.0040,0020,0010 Establece permisos <strong>de</strong> lectura, escritura o ejecución para el grupo.0004,0002,0001 Establece permisos <strong>de</strong> lectura, escritura o ejecución para el resto <strong>de</strong>los usuarios.Permisos para archivos recién creadosCuando un programa crea un archivo, especifica un conjunto <strong>de</strong> permisos para esearchivo. Conjuntos típicos son u=rw g=rw o=rw (rw-rw-rw-, o 666 <strong>en</strong> octal) para archivos<strong>de</strong> datos y u=rwx g=rwx o=rwx (rwxrwxrwx, o 777 <strong>en</strong> octal) para archivosejecutables. Los permisos iniciales son pocos <strong>de</strong>bido a la máscara <strong>de</strong> creación <strong>de</strong> archivos,también conocida como la umask (“user mask”).Tú pue<strong>de</strong>s cambiarla con elcomando umask. En otras palabras, los bits <strong>en</strong> la máscara <strong>de</strong> creación <strong>de</strong> archivosrepres<strong>en</strong>tan permisos que serán negados a los archivos recién creados.Los permisos <strong>de</strong> un archivo recién creado se calculan restando lógicam<strong>en</strong>te los bits<strong>en</strong> la máscara <strong>de</strong> creación <strong>de</strong> archivos <strong>de</strong> los permisos especificados por el programaque lo crea. Por lo tanto, si tu máscara vale algo como rwxrwxr-x (octal 002), queexcluye el permiso <strong>de</strong> escritura <strong>de</strong> otros, aquéllos fuera <strong>de</strong> tu grupo no podrán escribiro borrar archivos que tú crees a m<strong>en</strong>os que les cambies los permisos más tar<strong>de</strong> (conchmod, por ejemplo).Un valor típico para umask es rwxr-xr-x (octal 022), que niega los permisos <strong>de</strong>escritura a todos m<strong>en</strong>os a ti. Con este valor <strong>de</strong> máscara, un archivo creado con permisosespecificados como u=rw g=rw o=rw es <strong>en</strong> realidad creado con permisos u=rw g=ro=r. La reducción <strong>de</strong> permisos por el valor <strong>de</strong> umask se aplica tanto a la creación <strong>de</strong>nuevos directorios como <strong>de</strong> nuevos archivos.3.2.2. Archivos estándar y redireccionami<strong>en</strong>toMuchos comandos <strong>de</strong> Unix le<strong>en</strong> su <strong>en</strong>trada <strong>de</strong> la <strong>en</strong>trada estándar a m<strong>en</strong>os queespecifiques archivos <strong>de</strong> <strong>en</strong>trada; y escrib<strong>en</strong> su salida a la salida estándar. Por omisión,tanto la <strong>en</strong>trada como la salida están asociados a tu terminal (g<strong>en</strong>eralm<strong>en</strong>te la salidaes el monitor y la <strong>en</strong>trada es el teclado). Otro archivo estándar es el error estándar,que se usa para m<strong>en</strong>sajes <strong>de</strong> error y otra información acerca <strong>de</strong>l funcionami<strong>en</strong>to <strong>de</strong> uncomando. La información <strong>en</strong>viada al error estándar también llega a la terminal.Esta conv<strong>en</strong>ción funciona bi<strong>en</strong> porque pue<strong>de</strong>s redireccionar tanto la salida como la<strong>en</strong>trada estándar. Cuando redireccionas la <strong>en</strong>trada estándar para ser tomada <strong>de</strong>l archivoarchivo, el programa que lee la <strong>en</strong>trada estándar leerá <strong>de</strong>l archivo archivo <strong>en</strong> lugar <strong>de</strong>hacerlo <strong>de</strong>s<strong>de</strong> la terminal. Algo similar suce<strong>de</strong> cuando redireccionas la salida estándar.


3.2 Moviéndose <strong>en</strong> el árbol <strong>de</strong>l sistema <strong>de</strong> archivos 35Cuando se redirecciona la <strong>en</strong>trada se usa el operador < precedi<strong>en</strong>do a una trayectoria,mi<strong>en</strong>tras que para el redireccionami<strong>en</strong>to <strong>de</strong> la salida se usa el operador >.Por ejemplo, el comando cat copia la <strong>en</strong>trada estándar a la salida estándar, por lotanto el comandocat < felix > gatocopia el archivo felix al archivo gato 3 . Si utilizas el operador >> antes <strong>de</strong> una trayectoria,<strong>en</strong>tonces la salida es agregada al final <strong>de</strong>l archivo <strong>en</strong> lugar <strong>de</strong> escrita directam<strong>en</strong>te.En el ejemplo anterior, el cont<strong>en</strong>ido <strong>de</strong> gato es sobrescrito con el cont<strong>en</strong>ido <strong>de</strong> felix;pero si haces <strong>en</strong> su lugarcat < felix >> gatoel cont<strong>en</strong>ido <strong>de</strong> felix es agregado al final <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong> gato. Discutiremos másformas <strong>de</strong> redireccionami<strong>en</strong>to <strong>en</strong> breve.El error estándar también se pue<strong>de</strong> redireccionar pero la sintaxis para hacerlo es<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong>l tipo <strong>de</strong> shell que se utilice.Para el shell Bourne (sh) y la mayoría <strong>de</strong> los que pert<strong>en</strong>ec<strong>en</strong> a su familia, comozsh, bash, korn, etc., la construcción ‘2> archivo’ especifica que cualquier cosaque sea <strong>en</strong>viada al error estándar será redireccionada al archivo archivo.Para el shell C, se utiliza la construcción > & archivo, que manda tanto la salidaestándar como el error estándar al archivo archivo. Este shell (y <strong>de</strong> su familiasólo tcsh) no permite <strong>en</strong>viar la salida estándar y el error estándar a distintosarchivos. De hecho, el uso <strong>de</strong>l shell C está <strong>en</strong> <strong>de</strong>ca<strong>de</strong>ncia, pero aún ti<strong>en</strong>e algunosseguidores.Una propiedad importante y valiosa <strong>de</strong>l redireccionami<strong>en</strong>to es que un programacuya <strong>en</strong>trada o salida es redireccionada no ti<strong>en</strong>e por qué saberlo. En otras palabras, unprograma escrito bajo la suposición <strong>de</strong> que lee <strong>de</strong> la <strong>en</strong>trada estándar y escribe a lasalida estándar también lee y escribe a archivos, siempre y cuando estos últimos seanpasados como redireccionami<strong>en</strong>tos. La misma propiedad se aplica a guiones <strong>de</strong> shell.Un uso común <strong>de</strong> cat es la creación <strong>de</strong> archivos nuevos, que g<strong>en</strong>eralm<strong>en</strong>te conti<strong>en</strong><strong>en</strong>unas pocas líneas que se pue<strong>de</strong>n teclear directam<strong>en</strong>te <strong>de</strong> la pantalla. Por ejemplo,fulanito@ [ estnum f u l a n i t o] % cat > f e l i xEsta es una prueba <strong>de</strong> catpara ver exactam<strong>en</strong>te como funciona^Dcrea al archivo felix <strong>en</strong> el directorio <strong>de</strong> trabajo, y el cont<strong>en</strong>ido <strong>de</strong>l archivo se tomó <strong>de</strong>la <strong>en</strong>trada estándar, que se dio por terminada al teclear C-d (repres<strong>en</strong>tado por ^D <strong>en</strong> ellistado), que correspon<strong>de</strong> a un fin <strong>de</strong> archivo.Otra manera <strong>de</strong> crear archivos es mediante el comando3 Nota que como no das más que el nombre <strong>de</strong>l archivo, la trayectoria se refiere al directorio <strong>de</strong> trabajo.


36 Sistema <strong>de</strong> Archivostouch mimosaEn realidad este comando lo que hace es actualizar la fecha <strong>de</strong> última modificación<strong>de</strong>l archivo mimosa. Sin embargo, si el archivo no existe lo crea.Nota: A lo largo <strong>de</strong> estas notas diremos que un programa produce un resultadocuando manda algo a la salida estándar. En la terminología tradicional <strong>de</strong> Unix se diceque imprime el resultado. Esta terminología vi<strong>en</strong>e <strong>de</strong> los días <strong>en</strong> los que la mayoría <strong>de</strong>las estaciones <strong>de</strong> trabajo estaban conectadas a un teletipo <strong>en</strong> lugar <strong>de</strong> un monitor, perono <strong>de</strong>be confundirse con la acción <strong>de</strong> <strong>en</strong>viar un archivo a la impresora.Actividad 3.5 Crea el archivo felix, con el cont<strong>en</strong>ido que tú quieras, y luego ejecutalos ejemplos que dimos para este comando, <strong>en</strong> el or<strong>de</strong>n dado.Actividad 3.6 Ve con ls -al gato los parámetros y la fecha <strong>de</strong> última modificación<strong>de</strong>l archivo gato. Ejecuta touch sobre el archivo gato. Obtén nuevam<strong>en</strong>te un listadoext<strong>en</strong>dido y <strong>de</strong>scribe la difer<strong>en</strong>cia <strong>en</strong>tre ambos listados.Entubami<strong>en</strong>tos y filtrosPue<strong>de</strong>s usar la salida <strong>de</strong> un comando como la <strong>en</strong>trada <strong>de</strong> otro comando, conectandoambos comandos con un tubo (pipe). La construcción resultante es un pipeline o <strong>en</strong>tubami<strong>en</strong>to.Al igual que con las formas <strong>de</strong> redireccionami<strong>en</strong>to discutidas anteriorm<strong>en</strong>te,los programas conectados no ti<strong>en</strong><strong>en</strong> por qué saber <strong>de</strong> dichas conexiones.Sintácticam<strong>en</strong>te, creas un <strong>en</strong>tubami<strong>en</strong>to escribi<strong>en</strong>do dos comandos con un pipe (elsímbolo |) <strong>en</strong>tre ellos. Por ejemplo, la línea <strong>de</strong> comandosgrep pest phones | sortllama al programa grep, que extrae <strong>de</strong>l archivo phones todas las líneas que cont<strong>en</strong>ganla ca<strong>de</strong>na pest y produce esas líneas como su salida estándar. Esta salida se <strong>en</strong>tuba a la<strong>en</strong>trada <strong>de</strong>l programa sort, que ve dicha salida como su <strong>en</strong>trada. La salida <strong>de</strong> la línea <strong>de</strong>comandos completa es una lista or<strong>de</strong>nada <strong>de</strong> todas las líneas <strong>en</strong> phones que conti<strong>en</strong><strong>en</strong>pest.En una línea que cont<strong>en</strong>ga tanto redireccionami<strong>en</strong>tos como <strong>en</strong>tubami<strong>en</strong>tos, los redireccionami<strong>en</strong>tosti<strong>en</strong><strong>en</strong> mayor prece<strong>de</strong>ncia: primero los redireccionami<strong>en</strong>tos se asociancon comandos y <strong>de</strong>spués los comandos con sus redireccionami<strong>en</strong>tos se pasan por los<strong>en</strong>tubami<strong>en</strong>tos.La creación <strong>de</strong> un <strong>en</strong>tubami<strong>en</strong>to implica la creación <strong>de</strong> un par <strong>de</strong> procesos, uno parael comando que produce la información <strong>en</strong>tubada y otro para el proceso que consumeesta información. Estos procesos los crea el shell que interpreta la línea <strong>de</strong> comandos.Un filtro es un programa que lee datos <strong>de</strong> la <strong>en</strong>trada estándar, los transforma <strong>de</strong>alguna manera y luego escribe esta información transformada a la salida estándar. Unopue<strong>de</strong> construir un <strong>en</strong>tubami<strong>en</strong>to como una sucesión <strong>de</strong> filtros; estas sucesiones prove<strong>en</strong>una forma muy po<strong>de</strong>rosa y flexible <strong>de</strong> usar comandos simples para que al combinarlos


3.3 Otros comandos <strong>de</strong> Unix 37alcanzar gran<strong>de</strong>s metas, posiblem<strong>en</strong>te muy complejas. G<strong>en</strong>eralm<strong>en</strong>te este tipo <strong>de</strong> <strong>en</strong>tubami<strong>en</strong>tosse citan como ejemplos <strong>de</strong> la filosofía Unix.Hay otras herrami<strong>en</strong>tas <strong>en</strong> los Unix estándar para simular estos <strong>en</strong>tubami<strong>en</strong>tos: archivosespeciales FIFO, sockets y streams. Pero son mucho más específicos y sofisticadosy <strong>de</strong>finitivam<strong>en</strong>te fuera <strong>de</strong>l alcance <strong>de</strong>l pres<strong>en</strong>te trabajo.3.3. Otros comandos <strong>de</strong> UnixUn comando es una instrucción que le dice a Unix que haga algo. La forma usual<strong>de</strong> pasar un comando a Unix es a través <strong>de</strong>l shell, como respuesta a un prompt que ést<strong>en</strong>os proporciona.El término comando se utiliza también para referirse a instrucciones que esperanlos editores <strong>de</strong> texto como vi o emacs y otro tipo <strong>de</strong> programas.3.3.1. Sintaxis estándar <strong>de</strong> comandosPOSIX 4 <strong>de</strong>fine una sintaxis estándar para comandos, pero no todos los comandos lasigu<strong>en</strong>. Muchos comandos <strong>de</strong>finidos por POSIX ti<strong>en</strong><strong>en</strong> una forma mo<strong>de</strong>rna y una sintaxisobsoleta, por compatibilidad con sistemas viejos. La razón <strong>de</strong> esto es que muchosprogramas importantes – y muy viejos – que aún están <strong>en</strong> uso, sigu<strong>en</strong> sintaxis vieja <strong>de</strong>algunos comandos. Siempre que hablemos <strong>de</strong> la sintaxis <strong>de</strong> un comando, trataremos <strong>de</strong>apegarnos a la sintaxis mo<strong>de</strong>rna <strong>de</strong> POSIX, pero m<strong>en</strong>cionaremos <strong>de</strong> vez <strong>en</strong> cuando lasintaxis vieja para algunos <strong>de</strong> ellos.Aun <strong>en</strong> sistemas mo<strong>de</strong>rnos hay una gran cantidad <strong>de</strong> comandos que no se apeganal estándar. Por ejemplo, el estándar especifica que las opciones <strong>de</strong> los comandos (noasí, los operandos) pue<strong>de</strong>n aparecer <strong>en</strong> cualquier or<strong>de</strong>n, pero algunos comandos pue<strong>de</strong>nrequerir que las opciones aparezcan <strong>en</strong> un or<strong>de</strong>n particular y muchas veces esto no estám<strong>en</strong>cionado explícitam<strong>en</strong>te <strong>en</strong> la página <strong>de</strong>l manual <strong>de</strong>l comando. En estos y otroscasos hacer experim<strong>en</strong>tos siempre es una bu<strong>en</strong>a i<strong>de</strong>a.Un comando consiste <strong>de</strong> una sucesión <strong>de</strong> palabras separadas por espacios <strong>en</strong> blanco(estos espacios <strong>en</strong> blanco pue<strong>de</strong>n ser espacios s<strong>en</strong>cillos, tabuladores e incluso – <strong>en</strong>algunos shell, solam<strong>en</strong>te – nuevas líneas escapadas 5 ). La primera palabra es el nombre<strong>de</strong>l comando y las palabras subsecu<strong>en</strong>tes son sus argum<strong>en</strong>tos u opciones. El nombre<strong>de</strong>l comando se refiere a un programa o guión <strong>de</strong> shell a ser ejecutado. Los operandosconsist<strong>en</strong> <strong>de</strong> las opciones <strong>de</strong>l programa, si hay alguna, seguidas <strong>de</strong> sus operandos, si4 Portable Operating System Interfaz es un estándar <strong>de</strong>finido por la IEEE – Institute of Electrical andElectronics Engineers – y ANSI – American National Standards Institute –. POSIX ti<strong>en</strong>e como finalidad<strong>de</strong>finir un sistema operativo que se comporte como Unix, sea o no Unix. Han existido varias versiones<strong>de</strong> POSIX, si<strong>en</strong>do la más importante POSIX.2, parte 2.


38 Sistema <strong>de</strong> Archivoshay alguno. Las opciones controlan o modifican lo que el comando hace. Los operandosespecifican nombres <strong>de</strong> trayectorias o con lo que va a trabajar el comando.Especificación <strong>de</strong> opciones. Las opciones se especifican con una sucesión <strong>de</strong> palabras.Cada palabra es un grupo <strong>de</strong> opciones o una opción argum<strong>en</strong>to. Las opcionesg<strong>en</strong>eralm<strong>en</strong>te se <strong>de</strong>notan por letras. Se pue<strong>de</strong>n escribir <strong>en</strong> cualquier or<strong>de</strong>n y sepue<strong>de</strong>n combinar varias opciones <strong>en</strong> un solo grupo (siempre y cuando no recibanningún argum<strong>en</strong>to). Cada grupo <strong>de</strong> opciones está precedido por un guión (-). Porejemplo, los comandosls -alls -l -ason equival<strong>en</strong>tes e indican que el comando ls (list archives) sea llamado con lasopciones a (all files) y l (long listing).La última (o única opción) <strong>de</strong> un grupo <strong>de</strong> opciones pue<strong>de</strong> ir seguida por unapalabra que especifique uno o más argum<strong>en</strong>tos opcionales para ella. Por ejemplo,el comandosed -f qqscript qqarchivocausa que el editor sed edite el archivo qqarchivo usando el guión <strong>de</strong> shell qqscript;<strong>en</strong> este caso, qqscript es un argum<strong>en</strong>to para la opción -f y qqarchivo es unargum<strong>en</strong>to para el comando sed mismo.Cuando se recib<strong>en</strong> varios argum<strong>en</strong>tos para una misma opción, g<strong>en</strong>eralm<strong>en</strong>te seseparan por comas, pero se pue<strong>de</strong>n separar por blancos siempre y cuando se <strong>en</strong>cierrela lista <strong>de</strong> argum<strong>en</strong>tos <strong>en</strong>tre comillas (dobles o s<strong>en</strong>cillas), o si se pone unadiagonal inversa fr<strong>en</strong>te a cada espacio <strong>en</strong> blanco (escapando los espacios <strong>en</strong> blanco).En cualquier caso, los argum<strong>en</strong>tos <strong>de</strong>b<strong>en</strong> formar una sola palabra. Los dosejemplos que sigu<strong>en</strong> muestran ambas conv<strong>en</strong>ciones:prog −o zed1,zed2 −y "eres o no eres"o alternativam<strong>en</strong>te,prog −o zed1,zed2 −y eres\ o\ no\ eresOtras conv<strong>en</strong>ciones para argum<strong>en</strong>tos. Hay otras dos conv<strong>en</strong>ciones muy comunes paraespecificar argum<strong>en</strong>tos:’- -’ Indica el final <strong>de</strong> las opciones. Esto es muy útil cuando quieres pasar argum<strong>en</strong>tosque empiezan con - a un comando. Por ejemplo,rm - - -qq5 Una nueva línea “escapada” es una que está precedida por una diagonal invertida (\).


3.3 Otros comandos <strong>de</strong> Unix 39es una forma <strong>de</strong> indicar que -qq es un archivo y no una opción, por lo queel comando borrará el archivo -qq. Si sólo se escribe rm -qq, obt<strong>en</strong>dríamosun error sobre una opción q que no reconoce.- Un solo guión repres<strong>en</strong>ta a la <strong>en</strong>trada estándar <strong>en</strong> un contexto <strong>en</strong> que el programaespera una trayectoria. Por ejemplo, el comandodiff - qqCitas (quotations)<strong>en</strong>cu<strong>en</strong>tra las difer<strong>en</strong>cias <strong>en</strong>tre la <strong>en</strong>trada estándar y el comando qqTodos los shells estándar asignan significados especiales a ciertos carácteres, llamadosmeta-carácteres. Para usar estos carácteres como carácteres ordinarios <strong>en</strong> la línea<strong>de</strong> comandos, <strong>de</strong>bes citarlos (marcarlos <strong>de</strong> manera especial para que el shell no losinterprete). Cada shell ti<strong>en</strong>e su propio conjunto <strong>de</strong> meta-carácteres y sus propias conv<strong>en</strong>ciones<strong>de</strong> cita, pero algunas reglas g<strong>en</strong>erales siempre se cumpl<strong>en</strong>:Una diagonal inversa (\) siempre sirve como carácter <strong>de</strong> escape para uno o máscarácteres que le sucedan, lo cual le da a esos carácteres un significado especial.Si un carácter es un meta-carácter, el significado especial es – g<strong>en</strong>eralm<strong>en</strong>te – elcarácter mismo. Por ejemplo, \\ usualm<strong>en</strong>te significa una sola \ y \$ el signo <strong>de</strong>pesos. En estos casos, la diagonal inversa le quita su significado a los carácteres,g<strong>en</strong>eralm<strong>en</strong>te llamados carácteres escapados. La diagonal inversa misma es elcarácter <strong>de</strong> escape.Cuando un texto se <strong>en</strong>cierra <strong>en</strong>tre comillas (" "), la mayoría <strong>de</strong> los meta-carácteresque estén <strong>en</strong> dicho texto son tratados como carácteres normales, excepto por$, que g<strong>en</strong>eralm<strong>en</strong>te indica sustituciones a realizar.Otra forma <strong>de</strong> citar muy similar a la anterior, pero más fuerte es usar comillass<strong>en</strong>cillas ya que ni siquiera el carácter $ es interpretado.Los espacios y tabuladores, si se <strong>en</strong>cu<strong>en</strong>tran <strong>de</strong>ntro <strong>de</strong> algún texto citado, siempreson tratados como carácteres normales.A continuación damos una breve lista <strong>de</strong> algunos comandos <strong>de</strong> Unix que consi<strong>de</strong>ramosmuy importantes.Tabla 3.1Comandos <strong>de</strong> Unix importantesComandocatDescripciónEl comando cat copia y concat<strong>en</strong>a archivos. Ti<strong>en</strong>e algunos usos comunesque no implican concat<strong>en</strong>ación y que lo hac<strong>en</strong> uno <strong>de</strong> los comandosmás útiles <strong>de</strong> Unix (<strong>en</strong> prácticas posteriores lo usaremos exhaustivam<strong>en</strong>te).La forma g<strong>en</strong>eral <strong>de</strong> cat es:Continúa <strong>en</strong> la sigui<strong>en</strong>te página


40 Sistema <strong>de</strong> ArchivosTabla 3.1 Comandos <strong>de</strong> Unix importantes Continúa <strong>de</strong> la página anteriorComandoDescripcióncat [-estuv] [archivo. . . ]lnmvcprmEl comando ln crea una liga a uno o más archivos exist<strong>en</strong>tes. Las nuevasligas prove<strong>en</strong> nombres adicionales para esos archivos. La forma<strong>de</strong>l comando ln es:ln [-f s] archivo rutaln [-f s] archivo. . . dirEl comando mv mueve uno o más archivos <strong>de</strong> un directorio, el directoriofu<strong>en</strong>te (source), a otro directorio, el directorio <strong>de</strong>stino (target).Si tanto el fu<strong>en</strong>te como el <strong>de</strong>stino están <strong>en</strong> el mismo sistema <strong>de</strong> archivos,mv simplem<strong>en</strong>te cambia sus ligas y no mueve ningún dato <strong>de</strong>lugar. La forma <strong>de</strong>l comando mv es:mv [-i f] archivo rutamv [-i f] archivo. . . dirEl comando cp copia uno o más archivos. A difer<strong>en</strong>cia <strong>de</strong> ln y mv, cpsí copia los datos y no sólo cambia las ligas <strong>de</strong> los archivos involucrados.cp no es la única forma <strong>de</strong> copiar archivos <strong>en</strong> Unix, ya que catprovee un método alternativo. Más a<strong>de</strong>lante les diremos cómo. paxcon las opciones -rw es otra forma (pero no lo veremos aquí); cpiocon la opción -p es otra (tampoco lo veremos) y tar también proveeotra opción (éste sí lo veremos, pero con un propósito distinto al <strong>de</strong>copiar archivos). La forma <strong>de</strong> cp es:cp [-fip] iarchivo oarchivocp [-fiprR] iname. . . odirEl comando rm borra ligas a archivos, ya sean archivos ordinarios odirectorios. Un archivo es eliminado cuando todas sus ligas han sidoborradas, así que borrar la única liga a un archivo (el caso más común)borra el archivo mismo. La forma <strong>de</strong>l comando rm es:rm [-firR] archivo. . .rmdirEl comando rmdir borra ligas a directorios. La forma <strong>de</strong> la línea <strong>de</strong>comandos es:rmdir [-ps] dir. . .don<strong>de</strong> dir. . . es una lista <strong>de</strong> directorios.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


3.3 Otros comandos <strong>de</strong> Unix 41Tabla 3.1 Comandos <strong>de</strong> Unix importantes Continúa <strong>de</strong> la página anteriorComandomorelessmostlpr (lp)lpstatlpclpqlprmfindDescripciónEl comando more te permite examinar uno o más archivos <strong>en</strong> tu terminaluna página a la vez. También lo pue<strong>de</strong>s usar para examinar la<strong>en</strong>trada estándar y por lo tanto examinar la salida <strong>de</strong> un programahaci<strong>en</strong>do un <strong>en</strong>tubami<strong>en</strong>to hacia more (espero que <strong>de</strong>spués <strong>de</strong> estepárrafo te <strong>de</strong>s cu<strong>en</strong>ta <strong>de</strong> la cantidad <strong>de</strong> terminología que ya <strong>de</strong>bes máso m<strong>en</strong>os manejar; si no has leído el material que se <strong>en</strong>cu<strong>en</strong>tra antes <strong>de</strong>esta sección, estás <strong>en</strong> problemas). La forma <strong>de</strong> la línea <strong>de</strong> comandospara more es:more [-ceisu] [-n number] [-t tag] [-p cmd] [archivo. . . ]Nota que todos los parámetros son opcionales.Hace lo mismo que more, pero exti<strong>en</strong><strong>de</strong> algunas <strong>de</strong> las capacida<strong>de</strong>sinteractivas <strong>de</strong> more.Hace lo mismo que more, pero con una interfaz parecida a emacs.También exti<strong>en</strong><strong>de</strong> las capacida<strong>de</strong>s <strong>de</strong> more utilizando comandos y<strong>en</strong>laces <strong>de</strong> teclas “a la” Emacs.Este comando ocasiona que un conjunto <strong>de</strong> archivos sea <strong>en</strong>viado ala cola <strong>de</strong> impresión. Recibe varias opciones, pero la forma usual <strong>de</strong>usarlo es:lpr archivo. . .Despliega el estado <strong>de</strong> las solicitu<strong>de</strong>s <strong>de</strong> impresión.Hace lo mismo que lpstat.Muestra la cola <strong>de</strong> impresión.Borra un archivo <strong>de</strong> la cola <strong>de</strong> impresión (<strong>de</strong>bes ser dueño <strong>de</strong>l archivoo el superusuario para po<strong>de</strong>r eliminar un archivo <strong>de</strong> la cola <strong>de</strong> impresión).El programa find busca <strong>en</strong> partes especificadas <strong>de</strong>l sistema <strong>de</strong> archivos<strong>de</strong> Unix, archivos que cas<strong>en</strong> con un cierto criterio. La forma <strong>de</strong>lcomando es:find ruta. . . [criterio]Continúa <strong>en</strong> la sigui<strong>en</strong>te página


42 Sistema <strong>de</strong> ArchivosTabla 3.1 Comandos <strong>de</strong> Unix importantes Continúa <strong>de</strong> la página anteriorComandowhichfilecmpdiffchmodDescripciónAquí ruta. . . es una lista <strong>de</strong> trayectorias <strong>de</strong> archivos y directorios(usualm<strong>en</strong>te sólo directorios). En el caso más simple, el criterio <strong>de</strong>búsqueda es una sucesión <strong>de</strong> patrones básicos, cada uno indicado conun guión. Cada patrón primario prueba si un archivo candidato cumplecierta propiedad; algunas <strong>de</strong> estas pruebas primarias siempre sesatisfac<strong>en</strong> (son tautologías, :-)) y se ejecutan sólo por sus efectos secundarios.En g<strong>en</strong>eral, un criterio es una combinación lógica arbitraria<strong>de</strong> patrones que se construye a partir <strong>de</strong> los patrones primarios.La prueba primaria -print es muy útil. Siempre es verda<strong>de</strong>ra y, comoefecto secundario, ocasiona que la ruta absoluta <strong>de</strong> los archivos<strong>en</strong>contrados (casados, apareados) sea <strong>en</strong>viada a la salida estándar.El comando which te permite localizar un programa ejecutable; estoes, <strong>de</strong>termina su trayectoria absoluta. La forma <strong>de</strong> la línea <strong>de</strong> comandospara which es:which progname. . .El comando file (archivo) int<strong>en</strong>ta clasificar un archivo examinando susprimeros bytes. La forma <strong>de</strong>l comando es:archivo [-cL] [-f archivo] [-m archivo] archivo. . .El comando cmp compara dos archivos. La forma <strong>de</strong>l comando cmpes:cmp [-l | -s] archivo1 archivo2El comando diff analiza las difer<strong>en</strong>cias <strong>en</strong>tre dos archivos, tales comodifer<strong>en</strong>tes versiones <strong>de</strong>l mismo docum<strong>en</strong>to. La forma <strong>de</strong>l comandodiff es:diff [-bcefhr] [-C n] archivo1 archivo2El comando chmod cambia los permisos <strong>de</strong> un archivo. Para que estecomando funcione, necesitas permiso <strong>de</strong> búsqueda <strong>en</strong> el directorioque cont<strong>en</strong>ga al archivo (lee lo relativo a permisos si algo <strong>de</strong> esto note quedó claro). La forma <strong>de</strong>l comando chmod (change mo<strong>de</strong>) es:chmod [-Rf] perms archivo. . .Continúa <strong>en</strong> la sigui<strong>en</strong>te página


3.3 Otros comandos <strong>de</strong> Unix 43Tabla 3.1 Comandos <strong>de</strong> Unix importantes Continúa <strong>de</strong> la página anteriorComandoumaskchownchgrpwcDescripciónEl comando umask te permite cambiar o examinar la máscara <strong>de</strong>creación <strong>de</strong> archivos, también llamada umask value. El comandoumask está incluido <strong>en</strong> el shell <strong>en</strong> lugar <strong>de</strong> ser un programa in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te(<strong>de</strong> hecho, <strong>en</strong> shells avanzados, como bash o zsh, la mayoría <strong>de</strong>los comandos <strong>de</strong> esta sección están incluidos <strong>en</strong> el shell). La sintaxis<strong>de</strong> la línea <strong>de</strong> comandos es:umask [-S] [perm]Los comandos chown y chgrp te permit<strong>en</strong> transferir la propiedadpersonal y grupal <strong>de</strong> un conjunto <strong>de</strong> archivos y directorios a algui<strong>en</strong>más. La forma g<strong>en</strong>eral <strong>de</strong> estos comandos es:chown [-R] owner[.group] archivo. . .chgrp [-R] group archivo. . .El comando wc cu<strong>en</strong>ta el número <strong>de</strong> carácteres, palabras y líneas <strong>en</strong>un archivo o conjunto <strong>de</strong> éstos. Una palabra es consi<strong>de</strong>rada como unasecu<strong>en</strong>cia (no vacía) <strong>de</strong> carácteres <strong>de</strong>limitada por espacio <strong>en</strong> blanco.La forma <strong>de</strong> la línea <strong>de</strong> comandos <strong>de</strong> wc es:wc [-clw] [archivo. . . ]touchEl comando touch (toca) un archivo, actualizando sus tiempos <strong>de</strong> accesoy modificación. Si el archivo no existe, se crea a m<strong>en</strong>os que seespecifique lo contrario. Tocar un archivo es una forma fácil <strong>de</strong> crearun archivo nuevo. La forma <strong>de</strong> la línea <strong>de</strong> comandos <strong>de</strong> touch es:touch [-acm] [-r ref-archivo | -t fecha] archivo. . .teeEl comando tee provee una forma <strong>de</strong> capturar los cont<strong>en</strong>idos <strong>de</strong> un<strong>en</strong>tubami<strong>en</strong>to <strong>en</strong> un archivo, sin perturbar el flujo <strong>de</strong> información através <strong>de</strong>l <strong>en</strong>tubami<strong>en</strong>to. Toma su nombre por la similitud con unaconexión “T” como las <strong>de</strong> las tuberías <strong>de</strong> agua <strong>en</strong> tu casa. La forma<strong>de</strong>l comando es:tee tee [-ai] [archivo. . . ]tee copia la <strong>en</strong>trada estándar a la salida estándar y también a los archivosarchivo. . . . Por ejemplo, si tecleas:cat hola.txt | tee adios.txt | moreContinúa <strong>en</strong> la sigui<strong>en</strong>te página


44 Sistema <strong>de</strong> ArchivosTabla 3.1 Comandos <strong>de</strong> Unix importantes Continúa <strong>de</strong> la página anteriorComandoDescripciónverás el cont<strong>en</strong>ido <strong>de</strong>l archivo hola.txt por páginas (que es lo quehace more) y <strong>en</strong>contrarás <strong>en</strong> tu directorio actual un archivo llamadoadios.txt que será una copia exacta <strong>de</strong> hola.txt.3.4. Agrupando nombres <strong>de</strong> archivosUsualm<strong>en</strong>te, es necesario hacer refer<strong>en</strong>cia a un conjunto <strong>de</strong> archivos o directorios.Para este propósito se utilizan construcciones con comodines. Un comodín es una construcciónque se pue<strong>de</strong> remplazar por un conjunto o secu<strong>en</strong>cia <strong>de</strong> carácteres.El comodín ‘?’ se usa para repres<strong>en</strong>tar un carácter cualquiera. Por ejemplo, todoslos archivos <strong>en</strong> el directorio /bin/ que empiezan con cualquier carácter al que le sigu<strong>en</strong>ada más sh se pue<strong>de</strong>n referir por medio <strong>de</strong> la expresión /bin/?sh.Actividad 3.7 Ejecuta ls dándole como parámetro la expresión /bin/?sh. ¿Cuál es elresultado?.El carácter ‘∗’ es otro comodín que se reemplaza por cualquier secu<strong>en</strong>cia <strong>de</strong> carácteres,incluso la secu<strong>en</strong>cia vacía, que es aquella que no ti<strong>en</strong>e ningún carácter.Actividad 3.8 Ejecuta otra vez el comando ls, pero ahora con el parámetro /bin/*sh.¿Cuál es el resultado? ¿Cuáles son las difer<strong>en</strong>cias <strong>en</strong> el listado <strong>de</strong> archivos con laconstrucción /bin/?sh?La tercera y última forma <strong>de</strong> expresiones con comodines son las que usan la expresión[. . . ]. Los carácteres <strong>de</strong>ntro <strong>de</strong> los corchetes proporcionan una lista para que setrate <strong>de</strong> casar con alguno (y sólo uno) <strong>de</strong> ellos.Actividad 3.9 Ejecuta otra vez el comando ls, pero ahora ejecútalo con el parámetro/bin/[abc]sh. ¿Cuál es el resultado? ¿Cuáles son las difer<strong>en</strong>cias <strong>en</strong> el listado <strong>de</strong> cuandose utilizó con la construcción /bin/?sh?Actividad 3.10 Escribe la ruta absoluta para referirte a todos los archivos que iniciancon m y terminan con .ps <strong>en</strong> el directorio /usr/share/texmf/doc/metapost/base/.Actividad 3.11 Escribe las rutas relativas para referirte a los mismos archivos anteriores,<strong>de</strong>s<strong>de</strong> los directorios /, /usr/share/, /facultad/calculo/ayudantia/ y /usr/local/bin.


3.5 Konqueror: administrador <strong>de</strong> archivos y algo más 45Actividad 3.12 Crea un directorio llamado miPractica que cont<strong>en</strong>ga dos subdirectoriosllamados usuarios y archivo y que estén <strong>en</strong> tu directorio base.Actividad 3.13 Crea un archivo llamado raizArchivos.dat <strong>en</strong> el subdirectorio archivos<strong>de</strong>l directorio miPractica que cont<strong>en</strong>ga un listado <strong>de</strong> los archivos y directorios <strong>en</strong> eldirectorio raíz. Utiliza ls redireccionando la salida.Actividad 3.14 A todos los directorios que haz creado asígnales permisos <strong>de</strong> lecturay escritura para ti y sólo <strong>de</strong> lectura a los <strong>de</strong>más.Actividad 3.15 A todos los archivos que haz creado asígnales todos los permisos parati y ningún permiso para los <strong>de</strong>más.Actividad 3.16 Crea una copia <strong>de</strong>l directorio miPractica y todo su cont<strong>en</strong>ido, llámaleejercicios.Actividad 3.17 Elimina el directorio miPractica y todo su cont<strong>en</strong>ido.3.5. Konqueror: administrador <strong>de</strong> archivos y algo másKonqueror se podría <strong>de</strong>finir como un administrador <strong>de</strong> archivos, pero es una <strong>de</strong>finiciónbastante pobre, ya que es capaz <strong>de</strong> realizar muchas más cosas. Se trata <strong>de</strong> una<strong>de</strong> las aplicaciones estrella <strong>de</strong> KDE. Con esta aplicación se ha int<strong>en</strong>tado y conseguidot<strong>en</strong>er una única aplicación que recoja todas las necesida<strong>de</strong>s <strong>de</strong> un usuario.Konqueror es:Un manejador <strong>de</strong> archivos: proporciona funciones <strong>de</strong> administración <strong>de</strong> archivos,que van <strong>de</strong>s<strong>de</strong> las operaciones simples <strong>de</strong> cortar, copiar y pegar hasta búsqueda<strong>de</strong> archivos a través <strong>de</strong> una red local y remota. Permite previsualizar el cont<strong>en</strong>ido<strong>de</strong> los archivos y directorios, examinar sus propieda<strong>de</strong>s e iniciar aplicaciones <strong>de</strong>una forma simple.Un navegador web que cumple las especificaciones <strong>de</strong> HTML como son:• Soporte para JavaScript.• CSS (hojas <strong>de</strong> estilo).• Escrituras bidireccionales (árabe y hebreo).• Soporte para ejecución <strong>de</strong> applets <strong>de</strong> Java.• Ext<strong>en</strong>siones <strong>de</strong> Netscape para visualizar Flash, RealAudio y RealVi<strong>de</strong>o.• Comunicaciones seguras mediante SSL.• Ll<strong>en</strong>ado automático <strong>de</strong> URL y formularios.Un cli<strong>en</strong>te FTP totalm<strong>en</strong>te equipado.


46 Sistema <strong>de</strong> ArchivosUna aplicación <strong>de</strong> visualización universal, capaz <strong>de</strong> mostrar imág<strong>en</strong>es y docum<strong>en</strong>tossin necesidad <strong>de</strong> iniciar otras aplicaciones. Esto lo hace integrando compon<strong>en</strong>tes<strong>de</strong> otras aplicaciones: <strong>de</strong> KView para visualización <strong>de</strong> imág<strong>en</strong>es; <strong>de</strong>KDVI para visualizar DVIs; <strong>de</strong> KGhostView para docum<strong>en</strong>tos PostScript; y aplicaciones<strong>de</strong> Koffice.Un emulador <strong>de</strong> terminal, que funciona <strong>de</strong> la misma manera que una terminalnormal.3.1 Administrador <strong>de</strong> archivosEl navegadores <strong>de</strong> directorios e Internet <strong>de</strong>ntro <strong>de</strong> gnome es Nautilus.3.5.1. Iniciando KonquerorHay varias formas <strong>de</strong> iniciar la aplicación <strong>de</strong> konqueror:Para iniciar konqueror como un administrador <strong>de</strong> archivos se pue<strong>de</strong> seleccionarel icono con una casita <strong>en</strong> el panel o <strong>en</strong> el escritorio.Para iniciar konqueror como un navegador se pue<strong>de</strong> seleccionar el icono <strong>en</strong> forma<strong>de</strong> globo terráqueo <strong>en</strong> el panel.Des<strong>de</strong> el m<strong>en</strong>ú, seleccionando Internet->Navegador web Konqueror para iniciarlocomo navegador o Inicio para iniciarlo <strong>en</strong> modo <strong>de</strong> administrador <strong>de</strong> archivos.Simplem<strong>en</strong>te tecleando konqueror para iniciarlo como administrador <strong>de</strong> archivos.3.5.2. Konqueror como administrador <strong>de</strong> archivosKonqueror se ve como un administrador <strong>de</strong> archivos común:Lista los archivos y directorios cont<strong>en</strong>idos <strong>de</strong>ntro <strong>de</strong> una carpeta dada y proporcionainformación sobre ellos. La “ruta” <strong>de</strong> la carpeta actual se muestra <strong>en</strong> labarra <strong>de</strong> dirección.A<strong>de</strong>más muestra los archivos y directorios utilizando:• Vista <strong>de</strong> iconos.• Vista multicolumna.• Vista <strong>de</strong> árbol.• Vista <strong>de</strong> lista informativa.• Vista <strong>de</strong> lista <strong>de</strong>tallada.


3.5 Konqueror: administrador <strong>de</strong> archivos y algo más 47• Vista <strong>de</strong> texto.• Vista <strong>de</strong> tamaño <strong>de</strong> archivo.• Álbum <strong>de</strong> fotos.La figura 3.3 muestra la funcionalidad estándar <strong>de</strong> konqueror como un administrador<strong>de</strong> archivos.Figura 3.3Konqueror como un administrador <strong>de</strong> archivosPermite ver dispositivos <strong>de</strong> montaje como CD-ROM, floppy o usb.Permite copiar, mover o borrar uno o varios archivos y directorios utilizandodirectivas <strong>de</strong> copiar, cortar y pegar o con “drag and drop”.Permite crear nuevos archivos y directorios; ver y cambiar sus nombres, propieda<strong>de</strong>sy atributos.Dispone <strong>de</strong> otra característica muy práctica, la opción Herrami<strong>en</strong>tas->Abrir terminal<strong>de</strong> la barra <strong>de</strong> m<strong>en</strong>ú, que abre una terminal <strong>de</strong>ntro <strong>de</strong> Konqueror don<strong>de</strong>pue<strong>de</strong>s introducir instrucciones básicas.En la figura 3.4 se muestra konqueror con un emulador <strong>de</strong> terminal.


48 Sistema <strong>de</strong> ArchivosFigura 3.4Konqueror con un emulador <strong>de</strong> terminal3.5.3. Konqueror como un navegador webPue<strong>de</strong>s utilizar Konqueror para navegar por la red muy fácilm<strong>en</strong>te. Simplem<strong>en</strong>teintroduce una URL <strong>en</strong> la barra <strong>de</strong> dirección, presiona Enter , y ¡ya estás fuera!El navegador <strong>de</strong> Konqueror permite:Navegar <strong>de</strong>ntro <strong>de</strong> Konqueror igual que se haría <strong>en</strong> cualquier otro navegador.Incluso permite cargar varias páginas web <strong>en</strong> la misma v<strong>en</strong>tana.Crear y utilizar accesos rápidos a sitios web, <strong>en</strong>viando directam<strong>en</strong>te peticiones aun buscador sin t<strong>en</strong>er que visitar primero el sitio.Por ejemplo, si tecleas gg:konqueror <strong>en</strong> la barra <strong>de</strong> direcciones y presionas latecla Enter le pedirás a Google que busque todo lo relacionado con Konqueror.Guardar e imprimir páginas web, ya sean imág<strong>en</strong>es, paginas HTML, macros,<strong>en</strong>laces y otros tipos más.Transferir archivos y directorios a través <strong>de</strong> la red utilizando el protocolo <strong>de</strong> FTP.Para ver un poco más <strong>de</strong> este protocolo pue<strong>de</strong>s revisar la sección 5.8.Contar con soporte para ext<strong>en</strong>siones <strong>de</strong> Netscape.La figura 3.5 muestra Konqueror como un navegador <strong>de</strong> Internet.


3.5 Konqueror: administrador <strong>de</strong> archivos y algo más 49Figura 3.5Konqueror como un navegador <strong>de</strong> Internet3.5.4. Konqueror como una aplicación integradaKonqueror pue<strong>de</strong> servir como un visor <strong>de</strong> muchos tipos <strong>de</strong> archivos. Es <strong>de</strong>cir, siseleccionas una imag<strong>en</strong> la <strong>de</strong>splegará <strong>en</strong> la misma vista; Si seleccionas un archivo <strong>de</strong>texto, <strong>en</strong>tonces te mostrará su cont<strong>en</strong>ido y lo mismo ocurrirá no importando si el tipo<strong>de</strong> archivo es postscript, dvi, KOffice o casi cualquier otro tipo <strong>de</strong> archivo. La figura 3.6muestra una imag<strong>en</strong> <strong>de</strong>ntro <strong>de</strong> Konqueror.Figura 3.6Konqueror <strong>de</strong>plegando una imag<strong>en</strong>


50 Sistema <strong>de</strong> ArchivosEn la figura 3.7 aparece un docum<strong>en</strong>to postscript <strong>de</strong>ntro <strong>de</strong> konqueror sin necesidad<strong>de</strong> instalar la aplicación.Figura 3.7Konqueror <strong>de</strong>plegando un docum<strong>en</strong>to postscrip.3.6. EmacsEs interesante ver como estos visores no son parte <strong>de</strong>l navegador y no fueron diseñadospara eso; sin embargo, es posible integrar compon<strong>en</strong>tes <strong>de</strong> otras aplicaciones. Elvisor <strong>de</strong> imág<strong>en</strong>es es parte <strong>de</strong> KView; el visor <strong>de</strong> texto es parte <strong>de</strong> KWrite; el visor <strong>de</strong>DVI es parte <strong>de</strong> KDVI; el visor <strong>de</strong> postscript es parte <strong>de</strong> KGhostview; etc.3.6.1. Ejecutando Emacs <strong>de</strong>s<strong>de</strong> la línea <strong>de</strong> comandosXEmacs,<strong>en</strong>carnación<strong>de</strong> Emacs:xemacsLa forma más s<strong>en</strong>cilla <strong>de</strong> iniciar Emacs, es ejecutando el comando (sin opciones),que correspon<strong>de</strong> al nombre <strong>de</strong>l editor: emacs. Sin embargo, Emacs reconoce una sintaxismás compleja para su línea <strong>de</strong> comandos; las sigui<strong>en</strong>tes son algunas <strong>de</strong> las opcionesmás importantes:


3.6 Emacs 51Tabla 3.2Emacs: opciones <strong>de</strong> inicioOpción-batch-nw-<strong>de</strong>bug-initDescripciónEdición <strong>en</strong> lote. Con esta opción el editor mandará m<strong>en</strong>sajesa la salida estándar. Debes usar las opciones -l, -f y eval paraespecificar archivos a ejecutar y funciones a llamar. Duranteel curso <strong>de</strong> este trabajo, no habrá necesidad <strong>de</strong> usar esto ypue<strong>de</strong> ser consi<strong>de</strong>rada una opción avanzada.Utiliza la terminal actual (TTY), sin llamar el código <strong>de</strong> tumanejador <strong>de</strong> v<strong>en</strong>tanas.Si ocurre algún error mi<strong>en</strong>tras Emacs está arrancando, iniciaráel <strong>de</strong>purador. Esta opción es útil cuando agregas cosas a tuarchivo <strong>de</strong> configuración <strong>de</strong> Emacs y no están funcionandobi<strong>en</strong>.-q No carga ningún archivo <strong>de</strong> inicio.-user -u Lo mismo que -user.-help-versionCarga el archivo <strong>de</strong> inicio <strong>de</strong>l usuario especificado <strong>en</strong> lugar<strong>de</strong>l tuyo.Imprime el m<strong>en</strong>saje <strong>de</strong> uso <strong>de</strong> Emacs y sale.Imprime información sobre la versión <strong>de</strong> Emacs y sale.-V Lo mismo que -version.-funcall Ejecuta la función <strong>de</strong> Lisp nombrada sin pasarle ningún argum<strong>en</strong>to.-f Lo mismo que -funcall .-eval -load Evalúa la forma <strong>de</strong> Lisp pasada como parámetro a eval. T<strong>en</strong>la precaución <strong>de</strong> escapar a<strong>de</strong>cuadam<strong>en</strong>te la expresión paraque el intérprete <strong>de</strong> comandos no la ejecute antes <strong>de</strong> que lleguea Emacs.Carga el archivo nombrado <strong>de</strong> código <strong>en</strong> Lisp <strong>en</strong> Emacs.-l Igual que -load .Por ejemplo la sigui<strong>en</strong>te línea ejecutará Emacs <strong>de</strong>ntro <strong>de</strong> la terminal:% emacs -nwEl comando save-buffers-kill-emacs ( C - xC - c ) termina la ejecución <strong>de</strong> Emacs.


52 Sistema <strong>de</strong> Archivos3.6.2. Conceptos es<strong>en</strong>cialesDado que Emacs es más, mucho más, que un editor <strong>de</strong> texto, para integrar tantasoperaciones distintas <strong>en</strong> un único paquete y mostrarlas <strong>en</strong> una sola v<strong>en</strong>tana, se crearonvarios conceptos para referirse a estas distintas partes <strong>de</strong> Emacs.A<strong>de</strong>más, y ésta es la característica que distingue a Emacs como un sistema para increm<strong>en</strong>tarla productividad <strong>de</strong>l programador, todo comando que pue<strong>de</strong> ejecutarse pue<strong>de</strong>y usualm<strong>en</strong>te está asociado a una combinación <strong>de</strong> teclas. Pue<strong>de</strong>s utilizar cualquier teclacomo parte <strong>de</strong> estas combinaciones <strong>de</strong> teclas y a m<strong>en</strong>udo involucran las teclas control( ctrl <strong>en</strong> algunos teclados) y meta ( meta ya no existe <strong>en</strong> teclados mo<strong>de</strong>rnos y usualm<strong>en</strong>tese sustituye por alt ).BuffersEmacs, y <strong>en</strong> g<strong>en</strong>eral cualquier editor, no modifica directam<strong>en</strong>te el archivo, sino quetoman una copia <strong>de</strong>l mismo y la coloca <strong>en</strong> un buffer, el cual conti<strong>en</strong>e toda la información<strong>de</strong>l estado actual <strong>de</strong> la edición. El estado actual <strong>de</strong>l archivo no cambia sino hasta que leindicas a Emacs que <strong>de</strong>seas guardar los cambios <strong>en</strong> el disco.Al igual que los archivos, los buffers también ti<strong>en</strong><strong>en</strong> un nombre, el cual g<strong>en</strong>eralm<strong>en</strong>tese correspon<strong>de</strong> con el <strong>de</strong>l archivo que se está editando. Sin embargo, <strong>en</strong> otros casosel nombre <strong>de</strong> un buffer no correspon<strong>de</strong> con el <strong>de</strong> ningún archivo, sino simplem<strong>en</strong>te conalgún propósito específico; es <strong>de</strong>cir, no todos los buffers están ligados a un archivo sinoque sirv<strong>en</strong> para interactuar con Emacs. En este s<strong>en</strong>tido es importante que <strong>en</strong>ti<strong>en</strong>das ladifer<strong>en</strong>cia <strong>en</strong>tre un buffer y un archivo.Modos mayores y m<strong>en</strong>oresLa versatilidad <strong>de</strong> Emacs se <strong>de</strong>be, <strong>en</strong> bu<strong>en</strong>a medida, a que ti<strong>en</strong>e difer<strong>en</strong>tes modos<strong>de</strong> operación, <strong>de</strong> acuerdo con el tipo <strong>de</strong> texto que se esté editando o proceso que seesté ejecutando. Esto quiere <strong>de</strong>cir que Emacs se adapta a las necesida<strong>de</strong>s <strong>de</strong> edición<strong>de</strong> cada tipo <strong>de</strong> texto. Por ejemplo, para escribir una carta está el modo <strong>de</strong> texto; paraeditar un programa Emacs cu<strong>en</strong>ta con modos para una gran cantidad <strong>de</strong> l<strong>en</strong>guajes <strong>de</strong>programación. Esto le permite a Emacs ser el tipo <strong>de</strong> editor que tú <strong>de</strong>seas.Estos modos <strong>de</strong> operación se conoc<strong>en</strong> simplem<strong>en</strong>te como modos, y vi<strong>en</strong><strong>en</strong> <strong>en</strong> dossabores: exist<strong>en</strong> los modos mayores, que son los que prove<strong>en</strong> características que cambianradicalm<strong>en</strong>te la manera <strong>en</strong> que se edita el texto; por ello un buffer siempre estáasociado exactam<strong>en</strong>te con un modo mayor.Por otro lado exist<strong>en</strong> los modos m<strong>en</strong>ores que aña<strong>de</strong>n comportami<strong>en</strong>tos específicosa un modo mayor. Por ejemplo, si <strong>de</strong>seas que se produzca un cambio <strong>de</strong> línea cuandorebases una cierta cantidad <strong>de</strong> carácteres <strong>en</strong> una línea, pue<strong>de</strong>s usar un modo m<strong>en</strong>or


3.6 Emacs 533.6.3. Diredllamado Auto-fill-mo<strong>de</strong>. A difer<strong>en</strong>cia <strong>de</strong> los modos mayores, un mismo buffer pue<strong>de</strong>utilizar cualquier cantidad <strong>de</strong> modos m<strong>en</strong>ores.La línea que aparece <strong>en</strong> la parte inferior <strong>de</strong> todo buffer se conoce como la línea<strong>de</strong> modo. Esto es porque parte <strong>de</strong> la información que nos proporciona es precisam<strong>en</strong>teel modo o modos <strong>en</strong> el que se está editando el buffer (que aparec<strong>en</strong> <strong>en</strong>tre paréntesis).Lo primero que aparece <strong>en</strong>tre estos paréntesis es el modo mayor, seguido <strong>de</strong> todos losmodos m<strong>en</strong>ores que el buffer <strong>en</strong> cuestión t<strong>en</strong>ga activados.Aparec<strong>en</strong> otros datos <strong>en</strong> la línea <strong>de</strong> modo, como el nombre <strong>de</strong>l buffer, pero no sonrelevantes por el mom<strong>en</strong>to.En el sigui<strong>en</strong>te capítulo, <strong>en</strong> la sección 4.3, explicaremos el resto <strong>de</strong> los conceptosimportantes <strong>de</strong> Emacs y los comandos (y su combinación <strong>de</strong> teclas asociadas) <strong>de</strong>edición. En lo que resta <strong>de</strong> este capítulo te mostraremos cómo Emacs pue<strong>de</strong> ejecutarcomandos <strong>de</strong> <strong>Linux</strong> e incluso un intérprete <strong>de</strong> comandos completo.C-x C-f(find-file)permite abrirarchivosTabla 3.3Es un modo utilitario para manejo <strong>de</strong> directorios. Este modo se activa cuando elarchivo que se int<strong>en</strong>ta abrir es un directorio. Por ejemplo, si ejecutas C-x C-f y luegocompletas o tecleas el nombre <strong>de</strong> un directorio, digamos ∼/pruebas, Emacs abrirádicho directorio <strong>en</strong> el modo dired.En este modo pue<strong>de</strong>ss observar los archivos <strong>en</strong> un directorio, cambiar sus permisosy propietarios, copiar, borrar o mover archivos y directorios. Algunos <strong>de</strong> los comandosque pue<strong>de</strong>s usar <strong>en</strong> este modo son:Emacs: comandos <strong>de</strong>l modo diredCombinaciónvoC-omCRdxDescripciónAbre el archivo únicam<strong>en</strong>te <strong>en</strong> modo <strong>de</strong> lectura.Abre el archivo, pero <strong>en</strong> otra v<strong>en</strong>tana.Abre el archivo <strong>en</strong> otra v<strong>en</strong>tana pero te <strong>de</strong>ja <strong>en</strong> la que actualm<strong>en</strong>teestás.Marca los archivo o directorios (para copiar o mover, porejemplo).Copia los archivos marcados.Mueve los archivos marcados.Marca archivos para eliminación.Elimina archivos marcados.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


54 Sistema <strong>de</strong> ArchivosTabla 3.3 Emacs: comandos <strong>de</strong>l modo dired Continúa <strong>de</strong> la página anteriorCombinación Descripción+ Crea un directorio.EnterAbre el archivo o directorio <strong>en</strong> el que estás parado.3.6.4. Ejecución <strong>de</strong> comandos <strong>de</strong> Unix <strong>de</strong>s<strong>de</strong> EmacsEmacs ofrece varios mecanismos para ejecutar comandos <strong>de</strong>l sistema y procesar losresultados. El más s<strong>en</strong>cillo <strong>de</strong> estos mecanismos lo ofrece el comando shell-commando M-!.Cuando se ejecuta este comando, Emacs solicita se escriba el comando <strong>en</strong> el minibuffer6 , que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la parte más baja <strong>de</strong> la v<strong>en</strong>tana <strong>de</strong> Emacs, justo <strong>de</strong>bajo <strong>de</strong>la línea <strong>de</strong> modo.Por ejemplo, pue<strong>de</strong>s ejecutar un comando para copiar el archivo /etc/passwd aldirectorio /tmp, sigui<strong>en</strong>do esta secu<strong>en</strong>cia:i. Primero ejecutas el comando M-!, tecleando esta combinación.ii. A continuación, <strong>en</strong> el minibuffer, que dice Shell command:, escribes el comando<strong>de</strong> Unix: cp /etc/passwd /tmpEmacs mostrará a continuación <strong>en</strong> la misma línea, pero que ahora se llama área<strong>de</strong> eco, (Shell command succee<strong>de</strong>d with no output), indicando que todo salió bi<strong>en</strong> y laejecución fue exitosa.Otro mecanismo muy utilizado es ejecutar un intérprete <strong>de</strong> comandos completo<strong>de</strong>ntro <strong>de</strong> un buffer <strong>de</strong> Emacs, lo que se logra con el comando shell y pue<strong>de</strong>s ejecutarlocon la secu<strong>en</strong>cia: M-x shell. Emacs te llevará inmediatam<strong>en</strong>te a un nuevo buffer quesimula una terminal <strong>de</strong> <strong>Linux</strong>. Como es obvio, <strong>en</strong> este intérprete <strong>de</strong> comandos (porquees un intérprete <strong>de</strong> comandos <strong>de</strong>ntro <strong>de</strong> Emacs) pue<strong>de</strong>s ejecutar todos los comandos <strong>de</strong>Unix.Actividad 3.18 D<strong>en</strong>tro <strong>de</strong> Emacs ejecuta un shell, con M-x shell y repite todas lasactivida<strong>de</strong>s <strong>de</strong> este capítulo.6 Emacs también utiliza esta área para informar al usuario y <strong>en</strong> este caso se conoce como área <strong>de</strong>eco y no como minibuffer. Por ejemplo, cuando escribes un comando como C-x C-f, si haces una pausaprolongada <strong>de</strong>spués <strong>de</strong> escribir C-x, Emacs pres<strong>en</strong>ta esa parte <strong>en</strong> el área <strong>de</strong> eco como ayuda. Si escribesla secu<strong>en</strong>cia <strong>de</strong>l comando completa muy rápidam<strong>en</strong>te, Emacs no muestra nada <strong>en</strong> el área <strong>de</strong> eco para nodistraerte.


Edición44.1. La guerra <strong>de</strong> los editores <strong>de</strong> textoEn la cultura geek 1 hay un gran <strong>de</strong>bate <strong>en</strong>tre la comunidad <strong>de</strong> programadores sobrecuál editor <strong>de</strong> texto <strong>de</strong> propósito g<strong>en</strong>eral es el mejor. Aunque es una guerra que siempreti<strong>en</strong>e nuevos cont<strong>en</strong>di<strong>en</strong>tes, los gran<strong>de</strong>s campeones hasta la fecha, sobre todo <strong>en</strong> elmundo Unix, son los seguidores <strong>de</strong> Emacs y los <strong>de</strong> Vi.La comunidad <strong>de</strong> hackers 2 trata con rever<strong>en</strong>cia a sus piezas <strong>de</strong> software favoritas,muchas veces rayando <strong>en</strong> el fanatismo, y los editores <strong>de</strong> texto son probablem<strong>en</strong>te laspiezas <strong>de</strong> software más difundidas y apreciadas. Es cierto, hay otras guerras y muyviol<strong>en</strong>tas, como las <strong>de</strong> los sistemas operativos o los l<strong>en</strong>guajes <strong>de</strong> programación, perola <strong>de</strong> los editores Emacs y Vi es digna <strong>de</strong> ley<strong>en</strong>das e historias <strong>de</strong> <strong>en</strong>cu<strong>en</strong>tros salvajes ycru<strong>en</strong>tos <strong>en</strong>tre sus seguidores.Nosotros, los autores <strong>de</strong> este comp<strong>en</strong>dio, nos contamos y a mucha honra <strong>en</strong>tre losseguidores <strong>de</strong> Emacs. Vi es malo, <strong>de</strong> hecho, para los iniciados <strong>en</strong> el arte <strong>de</strong> la edición (lo1 Geek es el sobr<strong>en</strong>ombre que recib<strong>en</strong> aquellas personas fascinadas, probablem<strong>en</strong>te <strong>en</strong> forma obsesiva,con algunos temas específicos u obscuros <strong>de</strong> algún área <strong>de</strong>l conocimi<strong>en</strong>to o <strong>de</strong> la imaginación. En añosreci<strong>en</strong>tes, geek se utiliza g<strong>en</strong>eralm<strong>en</strong>te para los obsesionados con tecnología o computación. Es probableque si estás interesado <strong>en</strong> los temas <strong>de</strong>l pres<strong>en</strong>te libro, tú mismo(a) califiques como geek, ¡bi<strong>en</strong>v<strong>en</strong>ido(a)al club!2 hacker es aquella persona que crea o modifica software o hardware <strong>de</strong> computadora, incluy<strong>en</strong>dotareas <strong>de</strong> programación, administración <strong>de</strong> sistemas y seguridad. Hack, por otro lado, ti<strong>en</strong>e una connotaciónnegativa y es algo así como un chicano fix, una compostura poco elegante para un programa osistema.


56 Edicióncuál serás tú también al final <strong>de</strong> este capítulo); es claro que Vi es el editor <strong>de</strong>l infierno ynos referiremos a él por su nombre completo: vi vi vi (666, <strong>en</strong> romano), el editor <strong>de</strong> labestia. Hablaremos <strong>de</strong> Emacs más a<strong>de</strong>lante, <strong>en</strong> la sección 4.3. <strong>Linux</strong>, y <strong>de</strong> manera másg<strong>en</strong>eral el software libre, te ofrece una única cosa y hay que valorarla: la facultad <strong>de</strong>elegir.4.1.1. Vieja guardia contra nueva guardiaHoy día contamos <strong>en</strong> <strong>Linux</strong> con más editores <strong>de</strong> los que podríamos dominar o explicar<strong>en</strong> una vida, m<strong>en</strong>os aún <strong>en</strong> este capítulo. Sin embargo, <strong>en</strong> KDE existe una nuevacamada <strong>de</strong> editores que han llamado nuestra at<strong>en</strong>ción porque hac<strong>en</strong> lo que un bu<strong>en</strong> editor<strong>de</strong>be hacer, pero a<strong>de</strong>más se integran al resto <strong>de</strong>l ambi<strong>en</strong>te, lo cual, a la larga, ofreceotra gama <strong>de</strong> posibilida<strong>de</strong>s.En este capítulo revisamos los editores Kate <strong>en</strong> la sigui<strong>en</strong>te sección y Emacs <strong>en</strong> lasección 4.3. En capítulos subsecu<strong>en</strong>tes revisaremos otros editores especializados, comoKile <strong>en</strong> el capítulo 6. Es importante que tomes <strong>en</strong> cu<strong>en</strong>ta, sin embargo, que durante tuvida académica y profesional te <strong>en</strong>contrarás <strong>en</strong> situaciones don<strong>de</strong> no contarás con unambi<strong>en</strong>te gráfico para trabajar, como KDE, y es aquí don<strong>de</strong> Emacs muestra su superioridad,ya que también pue<strong>de</strong> ejecutarse <strong>en</strong> una terminal o consola <strong>de</strong> texto.4.2. Kate: un editor para programadores4.2.1. Introducción$ smartinstall kateKate es el editor <strong>de</strong> texto preferido por programadores <strong>en</strong> KDE. Algunas características<strong>de</strong> Kate que revisaremos <strong>en</strong> este libro incluy<strong>en</strong> resaltado configurable <strong>de</strong> sintaxispara una gran variedad <strong>de</strong> l<strong>en</strong>guajes, <strong>de</strong>s<strong>de</strong> C o C++ hasta XML o guiones <strong>de</strong> shell; lahabilidad para crear y mant<strong>en</strong>er proyectos; una interfaz para varios docum<strong>en</strong>tos (MDIpor sus siglas <strong>en</strong> inglés) y un emulador <strong>de</strong> terminal integrado.4.1 Editores <strong>de</strong> textoEl editor nativo <strong>en</strong> Gnome es gedit, un editor <strong>de</strong> texto efici<strong>en</strong>te y s<strong>en</strong>cillo. Este editor,sin embargo, no es directam<strong>en</strong>te comparable con Kate, que revisamos <strong>en</strong> esta sección,y tampoco con Emacs, que veremos más a<strong>de</strong>lante.Kate es i<strong>de</strong>al para programadores. Sin embargo, una <strong>de</strong> sus fortalezas más importantesno está relacionada con su manejo <strong>de</strong> archivos fu<strong>en</strong>te <strong>de</strong> diversos l<strong>en</strong>guajes <strong>de</strong> pro-


4.2 Kate: un editor para programadores 57gramación, sino con la facilidad para abrir varios docum<strong>en</strong>tos simultáneam<strong>en</strong>te. Másaún, para programar <strong>en</strong> l<strong>en</strong>guajes mo<strong>de</strong>rnos como Java o C# contamos <strong>en</strong> Unix coneditores más po<strong>de</strong>rosos y revisaremos algunos <strong>en</strong> el capítulo 8.4.2.2. Empezando a utilizar KateEn esta sección te mostraremos las operaciones básicas <strong>de</strong> Kate para que puedasiniciar la edición <strong>de</strong> docum<strong>en</strong>tos. Conforme avances veremos algunas <strong>de</strong> las opcionesavanzadas y las posibilida<strong>de</strong>s <strong>de</strong> configuración <strong>de</strong> Kate.Pue<strong>de</strong>s iniciar Kate <strong>de</strong>s<strong>de</strong> el m<strong>en</strong>ú <strong>de</strong> KDE, como se muestra <strong>en</strong> la figura 4.1, o <strong>en</strong>una terminal con el comando kate. Utilizando el m<strong>en</strong>ú <strong>de</strong> KDE localiza la sección <strong>de</strong>editores, que mostrará todos los editores disponibles <strong>en</strong> tu sistema y selecciona kate.Figura 4.1Kate <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDEPor omisión Kate te mostrará el último archivo que editaste <strong>en</strong> tu sesión anterior. Sieste comportami<strong>en</strong>to no te gusta, lo pue<strong>de</strong>s cambiar <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> prefer<strong>en</strong>cias.Pue<strong>de</strong>s utilizar, como ya m<strong>en</strong>cionamos, el comando kate para iniciar el editor; si leproporcionas el nombre <strong>de</strong> un archivo como parámetro, abrirá el archivo o lo creará sino existe.% kate miarchivo.txtSi ti<strong>en</strong>es una conexión activa a la red y los permisos a<strong>de</strong>cuados, incluso pue<strong>de</strong>s abrirun archivo <strong>en</strong> un servidor remoto con algún protocolo soportado por KDE:% kate ftp://ftp.fci<strong>en</strong>cias.unam.mx/pub/mo<strong>de</strong>rno/prueba


58 EdiciónSesionesEn el capítulo 5 se <strong>de</strong>scrib<strong>en</strong> varios protocolos <strong>de</strong> red; KDE ofrece soporte transpar<strong>en</strong>te3 para varios <strong>de</strong> ellos.Kate soporta sesiones, que son una forma <strong>de</strong> mant<strong>en</strong>er distintas listas <strong>de</strong> archivos yconfiguraciones. Pue<strong>de</strong>s t<strong>en</strong>er tantas sesiones como <strong>de</strong>sees y éstas pue<strong>de</strong>n ser anónimaso t<strong>en</strong>er un nombre.Por omisión, cuando inicias Kate se inicia <strong>en</strong> la sesión pre<strong>de</strong>terminada, pero cuandolo inicias con una sesión, el nombre <strong>de</strong> ésta aparece <strong>en</strong> el título <strong>de</strong> la v<strong>en</strong>tana. Pue<strong>de</strong>siniciar Kate <strong>de</strong>s<strong>de</strong> la línea <strong>de</strong> comandos e indicarle que abra una sesión:% kate -s nombre lista-<strong>de</strong>-archivosSi la sesión llamada nombre no existe, Kate la creará. En caso <strong>de</strong> existir una sesiónabierta con ese nombre, los archivos especificados se anexarán a esa sesión.También se pue<strong>de</strong>n crear y manejar sesiones <strong>de</strong>s<strong>de</strong> un ejemplar <strong>de</strong> Kate <strong>en</strong> ejecucióna través <strong>de</strong>l m<strong>en</strong>ú, eligi<strong>en</strong>do Sesiones.La lista <strong>de</strong> docum<strong>en</strong>tosLa lista <strong>de</strong> archivos muestra todos los docum<strong>en</strong>tos actualm<strong>en</strong>te abiertos <strong>en</strong> Kate.Los archivos que han sido modificados muestran un icono <strong>de</strong> disco magnético a laizquierda para indicar su estado.Si hay dos o maś archivos abiertos con el mismo nombre (que viv<strong>en</strong> <strong>en</strong> distintosdirectorios), Kate antepone al nombre <strong>de</strong>l segundo, al nombre <strong>de</strong>l tercero yasí sucesivam<strong>en</strong>te. La v<strong>en</strong>tana <strong>de</strong> información te mostrará la ruta completa <strong>de</strong>l archivopara que selecciones el a<strong>de</strong>cuado.Para mostrar <strong>en</strong> la v<strong>en</strong>tana activa el archivo <strong>de</strong>seado, basta con que hagas click sobreel nombre <strong>en</strong> la lista.La lista <strong>de</strong> archivos pue<strong>de</strong> or<strong>de</strong>narse <strong>de</strong> distintas formas; para ello Kate ofrece unbotón a la <strong>de</strong>recha que te permite or<strong>de</strong>nar con alguno <strong>de</strong> los sigui<strong>en</strong>tes criterios: poror<strong>de</strong>n <strong>de</strong> apertura, por nombre (alfabético) y por URL.Esta lista aparece por omisión, aunque pue<strong>de</strong> moverse, al lado izquierdo <strong>de</strong> la v<strong>en</strong>tana<strong>de</strong> edición.El selector <strong>de</strong> archivosEl selector <strong>de</strong> archivos es un visor <strong>de</strong> carpetas, que te permite navegar tu espacio <strong>de</strong>archivos y abrir el archivo a<strong>de</strong>cuado. Su funcionami<strong>en</strong>to es idéntico al <strong>de</strong> otras aplicacionesKDE, particularm<strong>en</strong>te Konqueror.3 Cuando <strong>de</strong>cimos que algún proceso es transpar<strong>en</strong>te nos referimos al hecho <strong>de</strong> que funciona como sino estuviera ahí, que no se le ve.


4.2 Kate: un editor para programadores 59Emulador <strong>de</strong> terminalKate integra un emulador <strong>de</strong> terminal que es una copia <strong>de</strong> la aplicación Konsole<strong>de</strong> KDE. Está disponible <strong>de</strong> varias formas, a través <strong>de</strong>l m<strong>en</strong>ú V<strong>en</strong>tana <strong>en</strong> vista <strong>de</strong>herrami<strong>en</strong>tas, a través <strong>de</strong>l botón <strong>en</strong> la parte inferior llamado terminal o bi<strong>en</strong> pulsandola tecla F7 .Esta terminal está aquí para facilitarte acceso a comandos <strong>de</strong> <strong>Linux</strong> y al sistema <strong>de</strong>archivos.Herrami<strong>en</strong>tas externasEn el m<strong>en</strong>ú <strong>de</strong> Herrami<strong>en</strong>tas <strong>en</strong>contrarás uno <strong>de</strong> herrami<strong>en</strong>tas externas, que tepermite invocar aplicaciones externas a Kate con datos relacionados con él o los docum<strong>en</strong>tosactuales, por ejemplo, su URL, directorio, texto.Qué herrami<strong>en</strong>tas se incluy<strong>en</strong> es configurable por el usuario a través <strong>de</strong>l panel <strong>de</strong>configuración <strong>de</strong> herrami<strong>en</strong>tas externas. Las herrami<strong>en</strong>tas que se incluy<strong>en</strong> por omisiónestán relacionadas con el sistema para manejo <strong>de</strong> control <strong>de</strong> versiones CVS, otra que tepermite realizar una búsqueda <strong>en</strong> el web con Google (utiliza Konqueror) con el textoseleccionado <strong>en</strong> el docum<strong>en</strong>to y una más para ejecutar cualquier programa sobre eldocum<strong>en</strong>to.Arrastrar y soltarKate soporta el protocolo <strong>de</strong> KDE para arrastrar (drag) y soltar (drop), por lo quepue<strong>de</strong>s arrastrar un archivo <strong>de</strong>s<strong>de</strong> el escritorio o una v<strong>en</strong>tana <strong>de</strong> konqueror y <strong>de</strong>jarlocaer o soltarlo <strong>en</strong>cima <strong>de</strong> Kate y éste abrirá el archivo.4.2.3. Editando archivosEn la figura 4.2 pue<strong>de</strong>s apreciar la v<strong>en</strong>tana inicial <strong>de</strong> Kate. Notarás que hemos resaltadoalgunas secciones con rojo y están numeradas. La sección 1 es similar <strong>en</strong> variasaplicaciones que funcionan <strong>en</strong> KDE y ofrece varios selectores: <strong>de</strong> docum<strong>en</strong>tos, proyectosy archivos. Cada selector ofrece distintas posibilida<strong>de</strong>s para localizar un archivo oproyecto a editar.La sección marcada con 2, que es la más gran<strong>de</strong> <strong>de</strong> la v<strong>en</strong>tana <strong>de</strong> Kate, es don<strong>de</strong> se<strong>de</strong>spliega el cont<strong>en</strong>ido <strong>de</strong>l archivo que editas. Dado que Kate ti<strong>en</strong>e la facultad <strong>de</strong> editarmás <strong>de</strong> un archivo a la vez, cuando existe más <strong>de</strong> un archivo abierto, <strong>en</strong> la parte superior<strong>de</strong> esta v<strong>en</strong>tana se crean varias pestañas, una por cada archivo abierto.Es posible dividir esta sección <strong>en</strong> dos, ya sea <strong>de</strong> forma horizontal o vertical. Enambos casos, las dos partes o marcos, cont<strong>en</strong>drán el archivo que estés editando, pero


60 Ediciónsólo uno <strong>de</strong> ellos será el marco activo, lo que se repres<strong>en</strong>ta por medio <strong>de</strong> un indicadorver<strong>de</strong>.Figura 4.2V<strong>en</strong>tana <strong>de</strong> Kate cuando iniciaLa sección 3 es la barra <strong>de</strong> herrami<strong>en</strong>tas <strong>de</strong> edición principal y la sección 4 conti<strong>en</strong>eel m<strong>en</strong>ú g<strong>en</strong>eral <strong>de</strong> Kate. Exist<strong>en</strong> otros elem<strong>en</strong>tos <strong>en</strong> la v<strong>en</strong>tana principal; por ejemplo,<strong>en</strong> la parte baja hay un botón marcado Encontrar archivos que te permite localizararchivos <strong>en</strong> tu sistema haci<strong>en</strong>do búsquedas sobre su cont<strong>en</strong>ido; también hay un botónmás para abrir una terminal <strong>de</strong>ntro <strong>de</strong> Kate.Acceso rápidoTeclaControl esC.Kate integra una serie <strong>de</strong> acciones que pue<strong>de</strong>s realizar a través <strong>de</strong> <strong>en</strong>laces <strong>de</strong> teclas yque te permit<strong>en</strong> un acceso rápido. A continuación se muestra una tabla con los <strong>en</strong>lacespor omisión, pero pue<strong>de</strong>s seleccionar otros utilizando el m<strong>en</strong>ú Prefer<strong>en</strong>cias y la opciónConfigurar accesos rápidos.


4.2 Kate: un editor para programadores 61Tabla 4.1Kate: <strong>en</strong>laces <strong>de</strong> tecla para acceso rápidoEnlace←→↑↓AvpágRepágInsBackSpaceInicioFinSuprShift – ←Shift – →F1Shift – F1C–fF3C–bC–cC–nDescripciónMueve el cursor un carácter a la izquierda.Mueve el cursor un carácter a la <strong>de</strong>recha.Mueve el cursor una línea arriba.Mueve el cursor una línea abajo.Mueve el cursor una página hacia arriba.Mueve el cursor una página hacia abajo.Pasa <strong>de</strong> modo inserción a modo sobreescritura y viceversa. Cuandoestá <strong>en</strong> modo inserción el editor añadirá cualquier carácter introducidoal texto y empujará los carácteres previam<strong>en</strong>te introducidosa la <strong>de</strong>recha <strong>de</strong>l cursor <strong>de</strong> texto. El modo <strong>de</strong> sobreescriturahace que la <strong>en</strong>trada <strong>de</strong> cada carácter elimine el carácter inmediatam<strong>en</strong>tea la <strong>de</strong>recha <strong>de</strong>l cursor <strong>de</strong> texto.Borra el carácter a la izquierda <strong>de</strong>l cursor.Mueve el cursor al comi<strong>en</strong>zo <strong>de</strong> la línea.Mueve el cursor al final <strong>de</strong> la línea.Borra el carácter a la <strong>de</strong>recha <strong>de</strong>l cursor (o cualquier texto seleccionado).Marca el texto un carácter a la izquierda.Marca el texto un carácter a la <strong>de</strong>recha.Ayuda.Ayuda: ¿qué es esto?Buscar.Repetir la búsqueda.Insertar un marcador.Copiar el texto marcado al portapapeles.Nuevo docum<strong>en</strong>to.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


62 EdiciónTabla 4.1 Kate: <strong>en</strong>laces <strong>de</strong> tecla para acceso rápido Continúa <strong>de</strong> la página anteriorEnlaceC–pC–qC–rC–sC–vC–xC–zC–Shift–zDescripciónImprimir.Salir - cerrar la copia activa <strong>de</strong>l editor.Reemplazar.Salvar archivo.Pegar.Borrar el texto marcado y copiarlo al portapapeles.Deshacer.Rehacer.Trabajando con la selección <strong>de</strong> textoHay dos formas <strong>de</strong> seleccionar secciones <strong>de</strong> texto <strong>en</strong> Kate, una <strong>de</strong> ellas con el ratóny la otra con el teclado.Para seleccionar con el ratón <strong>de</strong>bes mant<strong>en</strong>er presionado el botón izquierdo y arrastrarel puntero hasta cubrir la región <strong>de</strong>seada. El texto se selecciona mi<strong>en</strong>tras arrastras.Para seleccionar con el teclado <strong>de</strong>bes mant<strong>en</strong>er presionada la tecla Shift y utilizaruna combinación <strong>de</strong> las teclas <strong>de</strong> cursor, Inicio y Fin .Una vez que has creado una selección, pue<strong>de</strong>s por ejemplo copiarla con la opciónEditar ⇒ Copiar o bi<strong>en</strong> C-c y posteriorm<strong>en</strong>te pue<strong>de</strong>s copiar el texto, ahora <strong>en</strong> elportapapeles, con C-v .Para eliminar la selección actual, pue<strong>de</strong>s utilizar alguna <strong>de</strong> las tres opciones: (a) elegir<strong>de</strong>l m<strong>en</strong>ú Editar ⇒ Deseleccionar, (b) C-a o bi<strong>en</strong> (c) hacer click con el botónizquierdo <strong>de</strong>l ratón <strong>en</strong> cualquier parte <strong>de</strong>l editor.Buscando y reemplazandoLos diálogos <strong>de</strong> búsqueda y sustitución <strong>de</strong> Kate son muy similares, salvo porque elsegundo incluye un espacio para indicar la ca<strong>de</strong>na por la que habrá <strong>de</strong> sustituir la o laspres<strong>en</strong>cias <strong>de</strong>l texto buscado.Los diálogos conti<strong>en</strong><strong>en</strong> estas opciones:


4.2 Kate: un editor para programadores 63Tabla 4.2Kate: opciones para buscar y reemplazarEnlaceTexto a buscarExpresión regularMayúsculas y minúsculasDes<strong>de</strong> el cursorBuscar hacia atrásReemplazar conPreguntar al reemplazarDescripciónAquí va la ca<strong>de</strong>na <strong>de</strong> búsqueda.Si está activado, la ca<strong>de</strong>na <strong>de</strong> búsqueda será interpretadacomo una expresión regular.Si está activada, la búsqueda distinguirá <strong>en</strong>tre mayúsculasy minúsculas.Si está marcado, la búsqueda iniciará <strong>de</strong>s<strong>de</strong> el puntoactual <strong>de</strong>l cursor.Si está activado, la búsqueda se hará <strong>de</strong>s<strong>de</strong> el puntoactual hacia el inicio <strong>de</strong>l docum<strong>en</strong>to.Aquí va la ca<strong>de</strong>na <strong>de</strong> sustitución.Si está activado, aparecerá un diálogo preguntandola acción que <strong>de</strong>be llevar a cabo Kate cada vez que<strong>en</strong>cu<strong>en</strong>tre la ca<strong>de</strong>na <strong>de</strong> búsqueda. Las posibles respuestasson: sí, no, todo y cerrar.Para iniciar una búsqueda pue<strong>de</strong>s utilizar el m<strong>en</strong>ú Editar ⇒ Buscar o bi<strong>en</strong> C-f ;para reemplazar <strong>de</strong>bes utilizar Editar ⇒ Reemplazar o C-r .MarcadoresLos marcadores sirv<strong>en</strong> para señalar líneas interesantes <strong>en</strong> el docum<strong>en</strong>to y volvera ellas fácilm<strong>en</strong>te <strong>en</strong> el futuro. Pue<strong>de</strong>s establecer y eliminar marcadores, movi<strong>en</strong>do elcursor a esa línea y activando la opción Marcadores ⇒ Cambiar o presionando C-b .Después, para recorrer los marcadores <strong>en</strong> el docum<strong>en</strong>to pue<strong>de</strong>s utilizar <strong>en</strong> el m<strong>en</strong>úMarcadores ⇒ Sigui<strong>en</strong>te ( C–Avpág ) o ⇒ Anterior ( C–Repág ).Ajustes <strong>de</strong> línea y sangradoKate ti<strong>en</strong>e una opción para que le indiques que <strong>de</strong>be cortar las líneas que sean máslargas que cierto tamaño. Esto lo pue<strong>de</strong>s configurar <strong>en</strong> las prefer<strong>en</strong>cias, <strong>en</strong> la página <strong>de</strong>Editor.Cuando está activada esta opción <strong>de</strong> ajuste <strong>de</strong> línea, al llegar al número máximo <strong>de</strong>carácteres permitidos, Kate insertará (<strong>en</strong> un espacio <strong>en</strong> blanco apropiado) un salto <strong>de</strong>línea.En cuanto al sangrado <strong>de</strong>l docum<strong>en</strong>to, Kate soporta una amplia gama <strong>de</strong> sangradosautomáticos especializados <strong>en</strong> distintos tipos <strong>de</strong> <strong>en</strong>trada. Pue<strong>de</strong>s utilizar uno <strong>de</strong> los


64 Ediciónmodos disponibles a través <strong>de</strong>l m<strong>en</strong>ú Herrami<strong>en</strong>tas ⇒ Sangrado. En la sigui<strong>en</strong>tetabla se muestran algunos <strong>de</strong> los sangrados disponibles <strong>en</strong> Kate:Tabla 4.3Kate: sangrados disponiblesEnlaceNingunoNormalEstilo CSS CPythonXMLDescripciónSeleccionando este modo se <strong>de</strong>sactiva completam<strong>en</strong>te el sangrado automático.Este sangrado simplem<strong>en</strong>te manti<strong>en</strong>e un sangrado similar al <strong>de</strong> la líneaanterior con cualquier cont<strong>en</strong>ido difer<strong>en</strong>te a un espacio <strong>en</strong> blanco.Pue<strong>de</strong>s combinar éste con las acciones sangrar y borrar sangrado parasatisfacer tu gusto personal.Es un sangrado para los l<strong>en</strong>guajes C y similares, como C++, C#, Java,Javascript. Sin embargo, no funciona con l<strong>en</strong>guajes <strong>de</strong> script como Perlo PHP.Es un sangrado alternativo para los l<strong>en</strong>guajes C y similares, con las mismasrestricciones.Un sangrado específico para el l<strong>en</strong>guaje <strong>de</strong> script python.Un sangrado automático para XML. Sin embargo, no int<strong>en</strong>tes utilizarlocon HTML o XHTML, ya que falla con las etiquetas HTML <strong>de</strong> estiloantiguo (etiquetas abiertas como )4.3. EmacsEmacs es el editor <strong>de</strong> los Dioses, por directa contraposición con su odiado archi<strong>en</strong>emigovi (asegúrate <strong>de</strong> leer dos veces la introducción <strong>de</strong> este capítulo, <strong>en</strong> la sección4.1).En el capítulo anterior (sección 3.6.2) te mostramos algunos <strong>de</strong> los conceptos es<strong>en</strong>ciales<strong>de</strong> Emacs y <strong>en</strong> esta sección concluimos la exposición <strong>de</strong> conceptos y te <strong>en</strong>señaremosa utilizar una plétora <strong>de</strong> comandos para edición. No ti<strong>en</strong>es que apr<strong>en</strong><strong>de</strong>rlos todospara utilizar Emacs, pero es importante los conozcas y practiques cada vez que t<strong>en</strong>gasoportunidad.


4.3 Emacs 654.3.1. ComandosMeta – xsirve paraejecutarcomandosLos comandos <strong>en</strong> Emacs ti<strong>en</strong><strong>en</strong> un nombre auto-<strong>de</strong>scriptivo. En muchas ocasionesestos comandos están formados por dos o más palabras separadas por un guióny, como pue<strong>de</strong>s imaginar, ejecutar estos comandos llamándolos por su nombre pue<strong>de</strong>resultar <strong>en</strong>gorroso. Por esta razón, Emacs crea un vínculo <strong>en</strong>tre un comando y una secu<strong>en</strong>cia<strong>de</strong> teclas y pue<strong>de</strong>s ejecutarlo ya sea invocándolos por su nombre, por ejemploMeta – x find-file, o bi<strong>en</strong> tecleando la secu<strong>en</strong>cia asociada, <strong>en</strong> este caso C-x C-f .Las secu<strong>en</strong>cias asociadas luc<strong>en</strong> complicadas al principio, pero <strong>de</strong>spués <strong>de</strong> utilizarlasun tiempo te darás cu<strong>en</strong>ta que están ahí por muy bu<strong>en</strong>as razones. De hecho, notarásque los comandos más usuales ti<strong>en</strong><strong>en</strong> asociadas secu<strong>en</strong>cias <strong>de</strong> teclas cortas. Emacs fuédiseñado por programadores, para programadores, por lo que la efici<strong>en</strong>cia lo es todo.Cada vez que ti<strong>en</strong>es que <strong>de</strong>spegar una <strong>de</strong> tus manos <strong>de</strong> la parte c<strong>en</strong>tral <strong>de</strong>l tecladopara buscar con el ratón un comando <strong>en</strong> los m<strong>en</strong>ús, pier<strong>de</strong>s tiempo valioso. Int<strong>en</strong>ta:compara el tiempo que te toma teclear la secu<strong>en</strong>cia C-x C-f contra el tiempo que tetoma <strong>en</strong>contrar <strong>en</strong> el m<strong>en</strong>ú el mismo comando find-file. Ahora imagina una sesión <strong>de</strong>edición don<strong>de</strong> escribirás una <strong>de</strong>c<strong>en</strong>a <strong>de</strong> cuartillas y ejecutarás varios ci<strong>en</strong>tos <strong>de</strong> comandos.Entre más utilices Emacs m<strong>en</strong>os t<strong>en</strong>drás que p<strong>en</strong>sar <strong>en</strong> las secu<strong>en</strong>cias <strong>de</strong> los comandos,tus manos se harán cargo. Esto se conoce como memoria dactilar. Una vez quete si<strong>en</strong>tas cómodo con los comandos <strong>de</strong> Emacs que dominas, regresa a este capítulo einvestiga algunos <strong>de</strong> las secciones que a continuación pres<strong>en</strong>taremos y apr<strong>en</strong><strong>de</strong> nuevassecu<strong>en</strong>cias.En la sección 3.6.2 te dijimos que las teclas Control y Meta ( alt y alt gr ) sonusualm<strong>en</strong>te utilizadas <strong>en</strong> secu<strong>en</strong>cias <strong>de</strong> teclas. De hecho, ya hemos utilizado algunas<strong>de</strong> éstas a lo largo <strong>de</strong> este material, pero <strong>en</strong> nom<strong>en</strong>clatura <strong>de</strong> Emacs no mostramos elnombre <strong>de</strong> estas teclas completo, sino que las sustituimos así: Ct rl es C y Meta esM. Entonces una secu<strong>en</strong>cia así: C–x , significa mant<strong>en</strong>er presionada Ct rl y sin soltarpresionar x .Suce<strong>de</strong> lo mismo con M, aunque aquí t<strong>en</strong>emos una pequeña variante y es que latecla <strong>de</strong> escape, esc , pue<strong>de</strong> utilizarse <strong>en</strong> sustitución <strong>de</strong> Meta . Cuando se ejecuta unasecu<strong>en</strong>cia M–x utilizando esc , sin embargo, no se manti<strong>en</strong><strong>en</strong> presionadas <strong>de</strong> manerasimultánea. Es <strong>de</strong>cir, primero presionamos esc , soltamos, y a continuación x .El guión nos sirve para indicar que esas teclas se presionan juntas, los espacios <strong>en</strong> lasecu<strong>en</strong>cia nos indican que <strong>de</strong>bemos soltar la(s) tecla(s) anterior(es) antes <strong>de</strong> iniciar conlas teclas <strong>de</strong>spués <strong>de</strong>l espacio. Por ejemplo, C–x C–f se teclea así: simultáneam<strong>en</strong>teCt rl y x , liberamos ambas y <strong>de</strong> manera simultánea presionamos Ct rl y f .


66 EdiciónEscribir texto o ejecutar comandosPue<strong>de</strong>s estarte preguntando si ev<strong>en</strong>tualm<strong>en</strong>te Emacs sirve para editar texto o sólopara ejecutar comandos. Por raro que parezca, Emacs sirve exclusivam<strong>en</strong>te para ejecutarcomandos y el más ejecutado es self-insert-command, que es ejecutado por cadatecla y cuya única función es imprimir el carácter que repres<strong>en</strong>ta la tecla <strong>en</strong> el bufferactual, o sea, la que acabas <strong>de</strong> oprimir.Para redactar una carta, escribir tus tareas, programar o hacer una pres<strong>en</strong>tación,simplem<strong>en</strong>te ti<strong>en</strong>es que ejecutar Emacs, visitar un archivo (con nuestro ya viejo amigo:C-x C-f ) y com<strong>en</strong>zar a teclear. Más a<strong>de</strong>lante te <strong>de</strong>cimos como salvar el cont<strong>en</strong>ido<strong>de</strong>l buffer (sección 4.3.11); recuerda teclear C-x C-c para terminar la ejecución <strong>de</strong>Emacs.4.3.2. Movimi<strong>en</strong>toExiste una posición privilegiada que es don<strong>de</strong> se efectúan las operaciones <strong>de</strong> Emacs,conocida como el punto. G<strong>en</strong>eralm<strong>en</strong>te, este punto está marcado con el principio <strong>de</strong> uncursor, que es un simpático cuadrado que nos indica dón<strong>de</strong> estás parado con respecto albuffer que estás editando. El punto <strong>en</strong> realidad se refiere a la posición <strong>en</strong>tre el caráctercubierto por el cursor y el inmediato anterior.Como es natural, las primeras operaciones que <strong>de</strong>searás hacer son las <strong>de</strong> movimi<strong>en</strong>to<strong>de</strong>l punto <strong>de</strong>ntro <strong>de</strong>l buffer, las cuáles se pue<strong>de</strong>n efectuar a muchos niveles, <strong>de</strong>s<strong>de</strong>carácter por carácter, línea por línea, palabra por palabra, por párrafo o por pantalla.La mayoría <strong>de</strong> las operaciones <strong>de</strong> movimi<strong>en</strong>to se pue<strong>de</strong>n efectuar tanto hacia a<strong>de</strong>lantecomo hacia atrás. A continuación pres<strong>en</strong>taremos una tabla <strong>de</strong> movimi<strong>en</strong>tos tratando<strong>de</strong> explicar, cuando no sea claro, las funciones <strong>de</strong> estos comandos.Tabla 4.4Emacs: comandos <strong>de</strong> movimi<strong>en</strong>toUnidad A<strong>de</strong>lante Atráscarácter C-f C-bpalabra M-f M-blínea C-p C-n<strong>en</strong>unciado M-a M-epárrafo M-{ M-}pantalla C-v M-vEs posible que necesites <strong>de</strong>splazarte <strong>de</strong> manera instantánea a ciertas posiciones pri-


4.3 Emacs 67vilegiadas <strong>de</strong>l texto. Emacs ofrece los sigui<strong>en</strong>tes comandos para realizarlo:Tabla 4.5Emacs: movimi<strong>en</strong>to a lugares especialesElem<strong>en</strong>to Inicio Finlínea C-a C-ebuffer M–< M–>4.3.3. Matando y borrandoHasta el mom<strong>en</strong>to sabes cómo agregar texto al buffer y cómo moverte <strong>en</strong> él, pero¿qué opciones ofrece Emacs para borrar texto? Ésas te las mostramos aquí, pero anteste pres<strong>en</strong>tamos un comando muy útil undo o C-x u , que <strong>de</strong>shace lo que hizo elúltimo comando. Si ejecutas repetidam<strong>en</strong>te este comando pue<strong>de</strong>s retroce<strong>de</strong>r tanto comoquieras <strong>en</strong> el proceso <strong>de</strong> edición <strong>de</strong>l buffer actual.Los comandos <strong>de</strong> Emacs para borrar se divi<strong>de</strong>n <strong>en</strong> dos gran<strong>de</strong>s categorías, los quematan y los que borran. Como una manifestación <strong>de</strong>l optimismo <strong>de</strong> Emacs, la muert<strong>en</strong>o es para siempre, por lo que todo aquello que matas pue<strong>de</strong> re<strong>en</strong>carnar. Para lograresto, Emacs <strong>en</strong>vía a todos los muertos a una estructura conocida como el anillo <strong>de</strong> lamuerte (kill-ring).Por el contrario, cuando borras algo es para siempre, a m<strong>en</strong>os, claro, que utilicesel comando undo. Para evitar que los usuarios <strong>de</strong> Emacs pasemos malos ratos poreliminar cosas sin quererlo, los únicos comandos para borrar que veremos funcionansobre carácteres.En la sigui<strong>en</strong>te tabla te mostramos los comandos para borrar y matar.Tabla 4.6Emacs: comandos para matar y borrarUnidad A<strong>de</strong>lante Atráscarácter (borrado) C-d BackSpacepalabra M–d M–BackSpacelínea C-k C-u 0 C-k<strong>en</strong>unciado M–k C-x Supr


68 Edición4.3.4. Re<strong>en</strong>carnación <strong>de</strong> textoCuando matas alguna sección, los carácteres que la conforman <strong>en</strong>tran al kill-ring.Si eres perspicaz te preguntarás: ¿<strong>de</strong> qué sirve que se vayan a este lugar si no sé comotraerlas <strong>de</strong> regreso? Ésta es una pregunta válida: <strong>en</strong> efecto existe una manera <strong>de</strong> traer <strong>de</strong>regreso aquellos carácteres que han muerto <strong>en</strong> este buffer (o <strong>en</strong> cualquier otro buffer);a esta operación se le conoce como yank y el comando para realizarla es C-y . Laejecución <strong>de</strong> este comando inserta el último texto muerto <strong>en</strong> el punto actual.Como es <strong>de</strong> esperarse, pue<strong>de</strong>s re<strong>en</strong>carnar texto que hayas matado con anterioridad.Esto se logra con el comando M–y , el cual, si el comando inmediato anterior fue unyank, reemplaza el texto que éste insertó con el texto inmediato anterior <strong>en</strong> el kill-ring.Esto último se pue<strong>de</strong> repetir sacando sucesivam<strong>en</strong>te lo que esté guardado <strong>en</strong> el kill-ring.Los elem<strong>en</strong>tos <strong>de</strong>l kill-ring son el resultado <strong>de</strong> acomodar a<strong>de</strong>cuadam<strong>en</strong>te bloques <strong>de</strong>operaciones matar; por ejemplo si matas dos líneas seguidas, estas dos líneas formanparte <strong>de</strong> un mismo bloque <strong>en</strong> el kill-ring.4.3.5. RegionesLas divisiones o unida<strong>de</strong>s que hemos revisado no son todas; durante una sesión <strong>de</strong>edición pue<strong>de</strong>s requerir tomar partes arbitrarias <strong>de</strong>l texto y operar sobre ellas. A estasdivisiones se les conoce como regiones.Una región compr<strong>en</strong><strong>de</strong> los carácteres que se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> <strong>en</strong>tre una marca y el punto.La marca es otra posición especial <strong>de</strong>ntro <strong>de</strong>l buffer y se fija por medio <strong>de</strong>l comandoC–Space . El punto es la posición que t<strong>en</strong>ga el cursor. Es <strong>de</strong>cir, se coloca la marca <strong>en</strong>la posición don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra el punto y mueves el punto ampliando o contray<strong>en</strong>do laregión, <strong>de</strong> nuevo <strong>en</strong>t<strong>en</strong>dida como los carácteres <strong>en</strong>tre la posición don<strong>de</strong> está la marca yla posición actual <strong>de</strong>l punto. Emacs indicará visualm<strong>en</strong>te la ext<strong>en</strong>sión <strong>de</strong> la región, yasea mostrándola sombreada o cambiando el color <strong>de</strong>l texto.Exist<strong>en</strong> muchas operaciones que pue<strong>de</strong>s hacer sobre una región. Por el mom<strong>en</strong>tosólo m<strong>en</strong>cionaremos dos. La primera es matar una región, que se lleva a cabo con elcomando C-w y la otra, copiar una región al kill-ring sin matarla, que se lleva a cabocon el comando M–w . Esta última operación sólo mete la región al kill-ring sin quitarla<strong>de</strong> su ubicación actual.4.3.6. RectángulosEn Emacs, a<strong>de</strong>más <strong>de</strong> po<strong>de</strong>r hacer selecciones <strong>de</strong> carácteres contiguos, tambiénpue<strong>de</strong>s seleccionar áreas con forma <strong>de</strong> rectángulos, con la esquina superior izquierda


4.3 Emacs 69<strong>en</strong> la marca y la esquina inferior <strong>de</strong>recha <strong>en</strong> el punto, o viceversa. Los comandos quese usan para lidiar con rectángulos son:Tabla 4.7Emacs: comandos para manejar rectángulosEnlaceOperaciónC-x r k Cortar (kill) un rectánguloC-x r y Pegar (yank) un rectánguloC-x r o Abrir un rectánguloM–x clear-rectangleBorrar un rectángulo4.3.7. RegistrosEn Emacs exist<strong>en</strong> una especie <strong>de</strong> cajones, <strong>en</strong> don<strong>de</strong> pue<strong>de</strong>s guardar ca<strong>de</strong>nas <strong>de</strong>texto, rectángulos o posiciones. Estos cajones recib<strong>en</strong> el nombre <strong>de</strong> registros, y susprincipales comandos son:Tabla 4.8Emacs: comandos para manejar registrosEnlaceOperaciónC-xxC-x r r RCopia la región <strong>en</strong> un registro. Te preguntapor el nombre <strong>de</strong>l registro.Guarda el rectángulo seleccionado <strong>en</strong> el registroR, don<strong>de</strong> R pue<strong>de</strong> ser un carácter oun número.C-x r s R Guarda la selección <strong>en</strong> el registro R.C-x r Space RC-x r i RGuarda la posición <strong>de</strong>l cursor <strong>en</strong> el registroR.Inserta el cont<strong>en</strong>ido <strong>de</strong>l registro R, si éste esun rectángulo o una ca<strong>de</strong>na.C-x r j R Salta al punto guardado <strong>en</strong> el registro R.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


70 EdiciónTabla 4.8 Emacs: comandos para manejar registros Continúa <strong>de</strong> la página anteriorEnlaceC-x r tOperaciónAgrega el texto (que te será pedido <strong>en</strong> elmini-buffer) a todas las líneas <strong>en</strong> la regiónrectangular, <strong>de</strong>splazando el texto hacia la<strong>de</strong>recha.4.3.8. ArchivosComo m<strong>en</strong>cionamos <strong>en</strong> el capítulo anterior (sección 3.6.3), para abrir un archivo<strong>en</strong> Emacs utilizamos la secu<strong>en</strong>cia: C–x C–f (find-file). Si te equivocas <strong>de</strong> archivo,inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> utilizar C–x C–f , pue<strong>de</strong>s utilizar el comando C–x C–v(find-alternate-file).4.3.9. BuscarEmacs incluye varios tipos <strong>de</strong> búsqueda, el comando search-forward utiliza elmini-buffer para solicitarte la ca<strong>de</strong>na que <strong>de</strong>seas buscar.Probablem<strong>en</strong>te el comando más útil para buscar <strong>en</strong> Emacs es isearch-forward (notala “i” al inicio <strong>de</strong>l comando), que sirve para realizar una búsqueda <strong>de</strong> manera increm<strong>en</strong>tal.Esto significa que Emacs comi<strong>en</strong>za a buscar conforme tú escribes la ca<strong>de</strong>na <strong>de</strong>búsqueda. Es más usual utilizar el <strong>en</strong>lace C–s que el comando anterior.Para buscar hacia atrás (o hacia arriba) <strong>de</strong> manera increm<strong>en</strong>tal utilizamos el comandoisearch-backward o C–r .Una vez que inicias una búsqueda increm<strong>en</strong>tal, ya sea hacia a<strong>de</strong>lante o hacia atrás,pue<strong>de</strong>s utilizar nuevam<strong>en</strong>te C–s o C–r para buscar la sigui<strong>en</strong>te pres<strong>en</strong>cia hacia a<strong>de</strong>lanteo hacia atrás, respectivam<strong>en</strong>te. Cuando llegas al final (o inicio) <strong>de</strong>l buffer, Emacsutiliza el área <strong>de</strong> eco para avisarte que no exist<strong>en</strong> más pres<strong>en</strong>cias <strong>de</strong> la ca<strong>de</strong>na buscada;si vuelves a insistir <strong>en</strong> buscar hacia ese mismo lado, Emacs da la vuelta y continúa labúsqueda <strong>de</strong>s<strong>de</strong> el otro extremo <strong>de</strong>l buffer.4.3.10. ReemplazarHabrá ocasiones <strong>en</strong> las que quieras buscar y cambiar una, algunas o todas las pres<strong>en</strong>cias<strong>de</strong> una ca<strong>de</strong>na <strong>de</strong> texto por otra. Realizar esta tarea manualm<strong>en</strong>te es tedioso, auncuando pue<strong>de</strong>s utilizar los comandos <strong>de</strong> búsqueda para localizar rápidam<strong>en</strong>te el texto acambiar.


4.3 Emacs 71Por este motivo Emacs te ofrece dos comandos principales para reemplazar texto.El primero replace-string, cambia todas las ocurr<strong>en</strong>cias <strong>de</strong> una ca<strong>de</strong>na por otra (utilizael mini-buffer para solicitar ambas ca<strong>de</strong>nas).Existe sin embargo, otro comando llamado query-replace-string que se comportasimilar, pero antes <strong>de</strong> realizar cada cambio pres<strong>en</strong>ta una serie <strong>de</strong> opciones para <strong>de</strong>cidirsi esa pres<strong>en</strong>cia particular se cambia o no y también para <strong>de</strong>cidir reemplazar todas laspres<strong>en</strong>cias que se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> más allá <strong>de</strong>l punto actual. Este último comando es máspopular y por ello está asociado a una secu<strong>en</strong>cia corta <strong>de</strong> teclas: M– % .4.3.11. GuardarYa te hemos com<strong>en</strong>tado que mi<strong>en</strong>tras editas un docum<strong>en</strong>to los cambios exist<strong>en</strong>únicam<strong>en</strong>te <strong>de</strong>ntro <strong>de</strong> Emacs, <strong>en</strong> el buffer. Para hacer estos cambios perman<strong>en</strong>tes <strong>de</strong>bessalvar el archivo y esto pue<strong>de</strong>s lograrlo con el comando: save-buffer o C–x C–s .Con el comando save-some-buffers ( C–x s ) Emacs preguntará si <strong>de</strong>seas guardarcada buffer modificado <strong>en</strong> tu sesión. Finalm<strong>en</strong>te, el comando write–file o C-x C-wte permite salvar el cont<strong>en</strong>ido <strong>de</strong>l buffer <strong>en</strong> un archivo distinto. Emacs te preguntará elnombre <strong>de</strong> dicho archivo utilizando el mini-buffer.4.3.12. V<strong>en</strong>tanasUna v<strong>en</strong>tana <strong>en</strong> Emacs es una subdivisión <strong>de</strong>l área <strong>de</strong> trabajo <strong>en</strong> don<strong>de</strong> po<strong>de</strong>mos<strong>de</strong>splegar un buffer. Con C–x 2 , se crea otra v<strong>en</strong>tana <strong>en</strong> forma horizontal. Para crearuna v<strong>en</strong>tana vertical pue<strong>de</strong>s utilizar C–x 3 .Para cambiar <strong>en</strong>tre v<strong>en</strong>tanas <strong>de</strong>bes utilizar C–x o . En cualquiera <strong>de</strong> estas v<strong>en</strong>tanaspue<strong>de</strong>s realizar todo tipo operaciones, ejecutar comandos <strong>de</strong> Emacs, etc.Para cerrar todas las v<strong>en</strong>tanas excepto <strong>en</strong> la que estás parado teclea C–x 1 ; paracerrar la v<strong>en</strong>tana <strong>en</strong> la que estás parado teclea C–x 0 .4.3.13. Marcos (frames)A<strong>de</strong>más <strong>de</strong> las v<strong>en</strong>tanas, <strong>en</strong> X también po<strong>de</strong>mos crear lo que Emacs llama frames,que <strong>en</strong> terminología estándar <strong>de</strong> X se llama v<strong>en</strong>tanas. ¿Confundidos? Es muy fácil:estos frames <strong>de</strong> Emacs luc<strong>en</strong> como ejecuciones distintas <strong>de</strong> Emacs, mi<strong>en</strong>tras que lasv<strong>en</strong>tanas son sub-divisiones <strong>de</strong> un mismo frame.


72 Edición4.3.14. Ayuda <strong>en</strong> líneaNo podríamos <strong>de</strong>cir que Emacs es un editor <strong>de</strong> texto auto–docum<strong>en</strong>tado si no contaracon un sistema <strong>de</strong> ayuda <strong>en</strong> línea. Si tecleas la secu<strong>en</strong>cia C–h ? ? , Emacs temostrará una lista con las opciones <strong>de</strong> ayuda que ti<strong>en</strong>e a tu disposición. Por ejemplo,con la secu<strong>en</strong>cia C–h k , Emacs te pedirá teclear una secu<strong>en</strong>cia <strong>de</strong> teclas y te dirátodo lo que sabe <strong>de</strong> esa secu<strong>en</strong>cia, a qué comando está asociada y la docum<strong>en</strong>tación <strong>de</strong>lcomando.4.3.15. Lista <strong>de</strong> buffersEn Emacs po<strong>de</strong>mos t<strong>en</strong>er una gran cantidad <strong>de</strong> buffers sobre los cuales estamostrabajando, tantos que es fácil per<strong>de</strong>r <strong>de</strong> vista o recordar el nombre exacto <strong>de</strong>l bufferque <strong>de</strong>seamos editar. Para estas situaciones existe el comando list-buffers o su <strong>en</strong>laceC–x C–b , el cual <strong>de</strong>spliega una lista <strong>de</strong> los buffers que t<strong>en</strong>emos abiertos <strong>en</strong> ese mom<strong>en</strong>to.En este buffer se <strong>de</strong>spliega información básica <strong>de</strong> los buffers, su nombre, sutamaño, y, <strong>en</strong> caso <strong>de</strong> estar asociados con un archivo, el nombre <strong>de</strong>l archivo. Otra informaciónmuy útil que nos proporciona este comando es si el buffer ha sido modificado<strong>de</strong>s<strong>de</strong> la última vez que se guardó <strong>en</strong> disco.También <strong>de</strong>s<strong>de</strong> este buffer po<strong>de</strong>mos ir a los difer<strong>en</strong>tes buffers, posicionándonos <strong>en</strong>el reglón correspondi<strong>en</strong>te y presionando Enter .4.3.16. Anzuelos (Hooks), setq y otrosEn esta sección no <strong>en</strong>traremos <strong>en</strong> muchos <strong>de</strong>talles, ya que para <strong>en</strong>t<strong>en</strong><strong>de</strong>r bi<strong>en</strong> serequiere <strong>de</strong> conocimi<strong>en</strong>tos <strong>de</strong> Emacs-Lisp, que es el l<strong>en</strong>guaje para ext<strong>en</strong><strong>de</strong>r Emacs.Muchos <strong>de</strong> los modos mayores, los comandos, etc. que hemos revisado <strong>en</strong> este libroestán escritos <strong>en</strong> Emacs-Lisp.Con los hooks po<strong>de</strong>mos hacer que Emacs ejecute funciones cuando suceda algúnev<strong>en</strong>to. Se usan mucho para llamar a ciertas funciones cuando abrimos un archivo <strong>de</strong>cierto tipo. Por el mom<strong>en</strong>to no <strong>en</strong>traremos <strong>en</strong> <strong>de</strong>talles acerca <strong>de</strong> los hooks.Con setq le <strong>de</strong>cimos el valor que queremos que t<strong>en</strong>ga tal o cuál variable.Cada modo ti<strong>en</strong>e su mapa <strong>de</strong> teclado (por ejemplo, text-mo<strong>de</strong>-map es el mapa parael modo mayor text) para indicar la acción que realiza cada tecla; estos mapas pue<strong>de</strong>nmodificarse para cambiar los comandos a ejecutar por estas teclas.Con require hacemos que Emacs haga un reconocimi<strong>en</strong>to <strong>de</strong> un archivo <strong>de</strong> <strong>de</strong>finiciones.


4.3 Emacs 734.3.17. Ortografía$ smartinstallaspell-esUna carácterística interesante <strong>de</strong> la mayoría <strong>de</strong> los editores <strong>de</strong> texto mo<strong>de</strong>rnos esque te ayudan a revisar la ortografía <strong>de</strong> tus docum<strong>en</strong>tos. Emacs no es la excepción,pero como muchas cosas con este gran editor, y <strong>en</strong> g<strong>en</strong>eral <strong>en</strong> <strong>Linux</strong>, para lograrlo<strong>de</strong>bes utilizar compon<strong>en</strong>tes externos, otros programas.Para lograr que Emacs revise tu ortografía vamos a utilizar la biblioteca ispell.el,que utiliza algún programa <strong>de</strong> <strong>Linux</strong> para realizar la revisión ortográfica. El programapredilecto <strong>en</strong> <strong>Linux</strong> para revisar ortografía se llama Aspell y, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> tuinstalación, pue<strong>de</strong> o no cont<strong>en</strong>er un diccionario <strong>en</strong> español.Con las sigui<strong>en</strong>tes líneas <strong>en</strong> tu ∼/.emacs le vamos a indicar varias cosas a Emacs.En la línea 1 le indicamos que queremos utilizar el programa <strong>de</strong> <strong>Linux</strong> aspell pararevisar ortografía y, <strong>en</strong> las líneas 2 y 3 le indicamos <strong>de</strong>talles sobre el tipo <strong>de</strong> carácteresque incluye el español y algunos argum<strong>en</strong>tos para el programa mismo. Por ejemplo, lasecu<strong>en</strong>cia -d es le indica a aspell que utilice el diccionario llamado es. Finalm<strong>en</strong>te,<strong>en</strong> la última línea le indicamos que utilice por omisión este diccionario <strong>en</strong> todos losbuffers.1 ( setq i s p e l l −program−name " a s p e l l "2 i s p e l l −extra −args ’(" −W" " 3 " )3 i s p e l l −d i c t i o n a r y −a l i s t4 ( cons5 ’ ( " 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 ( set−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 " spanish " )Es importante sepas que con el comando ispell-change-dictionary pue<strong>de</strong>s cambiara otro diccionario. Estos cambios no son globales y funcionarán únicam<strong>en</strong>te para elbuffer actual.Utilizando ispellAhora que hemos configurado un revisor ortográfico <strong>en</strong> Emacs, <strong>en</strong> la sigui<strong>en</strong>te tablate mostramos los comandos más importantes, con los que pue<strong>de</strong>s revisar la ortografía<strong>de</strong> una palabra o <strong>de</strong> una porción <strong>de</strong>l buffer.


74 EdiciónTabla 4.9Emacs: comandos para revisar ortografíaEnlaceM–x flyspell-mo<strong>de</strong>M–$M–TabM–x ispellM–x ispell–bufferM–x ispell–regionOperaciónActiva el modo Flyspell que resalta todas las palabrasincorrectas.Revisa y corrige errores ortográficos <strong>en</strong> la palabra<strong>en</strong> el punto.Completa la palabra antes <strong>de</strong>l punto basado <strong>en</strong>una ortografía <strong>de</strong>l diccionario.Revisa la ortografía <strong>en</strong> la región o buffer activo.Revisa la ortografía <strong>en</strong> el buffer.Revisa la ortografía <strong>de</strong> la región.4.3.18. Ext<strong>en</strong>di<strong>en</strong>do EmacsDado que Emacs es y ha sido utilizado por miles <strong>de</strong> programadores a lo largo <strong>de</strong> variasdécadas, la manera más s<strong>en</strong>cilla <strong>de</strong> ext<strong>en</strong><strong>de</strong>rlo es investigar si esa ext<strong>en</strong>sión <strong>de</strong>seadano fue ya implem<strong>en</strong>tada por algui<strong>en</strong> más. Utiliza un buscador <strong>de</strong> web para localizar ext<strong>en</strong>siones.Una vez localizada la ext<strong>en</strong>sión o paquete, <strong>de</strong>bemos <strong>de</strong>cidir <strong>en</strong>tre realizar una instalaciónglobal (para todos los usuarios <strong>de</strong>l sistema) o una instalación personal. Si esteequipo es utilizado por mucha g<strong>en</strong>te, convi<strong>en</strong>e hacerlo <strong>de</strong> manera global, pero <strong>de</strong>spués,cuando actualices tu sistema operativo, <strong>de</strong>bes repetir todo el procedimi<strong>en</strong>to. En g<strong>en</strong>eral,es más fácil y recom<strong>en</strong>dable instalar ext<strong>en</strong>siones a Emacs <strong>de</strong> manera personal y aquí temostramos cómo hacerlo.PreparatoriosLa variableload-pathLos sigui<strong>en</strong>tes pasos te servirán para instalar cualquier programa para ext<strong>en</strong><strong>de</strong>rEmacs, por lo que es importante realizarlos <strong>de</strong> una vez.i. Crea el directorio ∼/elisp (pue<strong>de</strong>s usar otro nombre, pero <strong>en</strong>tonces recuerda cambiarelisp por el nombre que elegiste más a<strong>de</strong>lante).ii. En tu ∼/.emacs ahora agrega este directorio a la ruta <strong>de</strong> búsqueda <strong>de</strong> Emacs.Esta ruta se parece mucho a la variable <strong>de</strong> ambi<strong>en</strong>te PATH <strong>de</strong> Unix y, <strong>en</strong> realidad,ti<strong>en</strong><strong>en</strong> una función similar:( add−to− l i s t ’ load−path ( expand−f i l e −name "∼ / e l i s p / " ) )


4.3 Emacs 75y listo: a partir <strong>de</strong> ahora, cada vez que <strong>en</strong>tres a Emacs, éste sabrá que todos los programas(archivos que ti<strong>en</strong><strong>en</strong> ext<strong>en</strong>siones .el o .elc <strong>de</strong>ntro <strong>de</strong> el directorio elisp sonext<strong>en</strong>siones.Instalando paquetes <strong>en</strong> 1, 2, 3Aunque el procedimi<strong>en</strong>to para instalar paquetes varía gran<strong>de</strong>m<strong>en</strong>te <strong>de</strong> uno a otro,<strong>en</strong> g<strong>en</strong>eral ti<strong>en</strong>es que seguir los sigui<strong>en</strong>tes pasos:1. Localizar el archivo y <strong>de</strong>scargarlo <strong>de</strong> la red. Si está comprimido, ti<strong>en</strong>es que expandirlo.2. Copiarlo o moverlo a tu directorio ∼/elisp. Si es un archivo con ext<strong>en</strong>sión .el,pasa al sigui<strong>en</strong>te paso; si es un directorio, ti<strong>en</strong>es que agregar el directorio a laruta <strong>de</strong> búsqueda. Por ejemplo, si el directorio se llama foo, agregas esto a tu∼/.emacs:% (add-to-list ’load-path (expand-file-name "∼/elisp/foo"))Usualm<strong>en</strong>te cuando el paquete vi<strong>en</strong>e <strong>en</strong> un directorio, incluye instrucciones especialespara instalación. G<strong>en</strong>eralm<strong>en</strong>te incluy<strong>en</strong> un archivo README o INSTALLcon instrucciones. En estos casos pue<strong>de</strong>s revisar el procedimi<strong>en</strong>to explicado <strong>en</strong>el Anexo B para instalar programas paso a paso.3. Después ti<strong>en</strong>es que leer el archivo principal <strong>de</strong>l paquete y copiar las líneas <strong>de</strong>iniciación a tu ∼/.emacs. G<strong>en</strong>eralm<strong>en</strong>te ti<strong>en</strong><strong>en</strong> la forma: (require ’foo), don<strong>de</strong>foo es el nombre <strong>de</strong>l archivo con ext<strong>en</strong>sión .el.En los sigui<strong>en</strong>tes capítulos <strong>de</strong> este libro utilizaremos este procedimi<strong>en</strong>to para instalaralgunas ext<strong>en</strong>siones importantes <strong>de</strong> Emacs. A manera <strong>de</strong> ejemplo, sin embargo,a continuación agregaremos una ext<strong>en</strong>sión muy s<strong>en</strong>cilla para modificar los colores <strong>de</strong>Emacs.Poni<strong>en</strong>do color a tu vidaDep<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l tipo <strong>de</strong> archivos que editas, Emacs reconoce distintas unida<strong>de</strong>ssintácticas <strong>de</strong> esos archivos. Por ejemplo, cuando programas reconoce palabras reservadas,ca<strong>de</strong>nas, etc. Para activar los colores <strong>de</strong> manera global agrega lo sigui<strong>en</strong>te a∼/.emacs:( r e q u i r e ’ font −lock )( add−hook ’ font −lock−mo<strong>de</strong>−hook ’ turn −on−f a s t −lock )( global −font −lock−mo<strong>de</strong> 1)¿Qué pue<strong>de</strong>s hacer si no te gustan los colores <strong>de</strong> Emacs? La respuesta s<strong>en</strong>cilla seríacambiarlos. Por <strong>de</strong>sgracia, la cantidad <strong>de</strong> variables que controlan los colores <strong>en</strong> Emacses muy gran<strong>de</strong>, por lo que esta tarea sería muy complicada.


76 EdiciónAfortunadam<strong>en</strong>te hay alternativas; por ejemplo, po<strong>de</strong>mos instalar la ext<strong>en</strong>sión <strong>de</strong>Emacs, color-theme, que pue<strong>de</strong>s obt<strong>en</strong>er <strong>de</strong> la sigui<strong>en</strong>te dirección:http://download.gna.org/color-theme/Después <strong>de</strong> instalar y compilar el programa, agrega esto a tu ∼/.emacs:( add−to− l i s t ’ load−path ( expand−f i l e −name " ~ / e l i s p / color −theme " ) )( r e q u i r e ’ color −theme )( color −theme− i n i t i a l i z e )Ahora pue<strong>de</strong>s ejecutar el comando M–x color-theme-select y color-theme crearáun nuevo buffer con una lista <strong>de</strong> los temas disponibles para darle color y vida a tuEmacs. Pue<strong>de</strong>s recorrer la lista y con Enter pue<strong>de</strong>s seleccionar el tema <strong>en</strong> la líneaactual. Cuando seleccionas un tema, inmediatam<strong>en</strong>te Emacs ajustará todos los colores.Recorre la lista y selecciona el tema que más te guste y, una vez que t<strong>en</strong>gas tufavorito, agrega el comando que lo activa a tu ∼/.emacs; así, cada vez que regreses,Emacs recordará tu tema predilecto. Por ejemplo:( color −theme−charcoal−black )


Internet55.1. Re<strong>de</strong>s <strong>de</strong> computadorasLa palabra red, cuando se habla <strong>de</strong> computadoras, hace refer<strong>en</strong>cia a dos o más computadorasconectadas <strong>en</strong>tre sí. Las computadoras se conectan <strong>en</strong> red con el propósito <strong>de</strong>compartir recursos.Cuando las computadoras están conectadas directam<strong>en</strong>te (usando algún tipo <strong>de</strong> cable),el sistema se <strong>de</strong>nomina red <strong>de</strong> área local o LANa (por su nombre <strong>en</strong> inglés LocalArea Network). Una LAN típica se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> un solo edificio o <strong>en</strong> algunas ocasiones<strong>en</strong> el mismo piso. Sin embargo, la conectividad no ti<strong>en</strong>e por qué terminar <strong>en</strong> una redlocal. Varias LAN están conectadas a otras re<strong>de</strong>s, formando lo que se <strong>de</strong>nomina Red <strong>de</strong>Área Amplia o WAN (Wi<strong>de</strong> Area Network).En varias organizaciones las computadoras están conectadas <strong>en</strong>tre sí por re<strong>de</strong>s <strong>de</strong>área local. En ocasiones, estas LAN están conectadas con un <strong>en</strong>lace <strong>de</strong> alta velocidad(<strong>de</strong>nominado soporte principal o backbone) que reúne a las LAN pequeñas para formaruna red <strong>de</strong> área amplia. Las organizaciones gran<strong>de</strong>s, con muchos <strong>de</strong>partam<strong>en</strong>tos, pue<strong>de</strong>nt<strong>en</strong>er más <strong>de</strong> un soporte principal. Esto significa, <strong>en</strong>tre otras cosas, que es posible<strong>en</strong>viar un correo electrónico <strong>de</strong>s<strong>de</strong> cualquier computadora <strong>de</strong>ntro <strong>de</strong> la organizaciónhacia cualquier otra computadora (siempre y cuando estén conectadas por la red). Dehecho, <strong>en</strong>viar un m<strong>en</strong>saje que atraviese todo el país pue<strong>de</strong> ser tan s<strong>en</strong>cillo como <strong>en</strong>viarun m<strong>en</strong>saje hacia el otro extremo <strong>de</strong> un corredor.


78 Internet5.1.1. Relación cli<strong>en</strong>te-servidorEn términos propios <strong>de</strong> una red, cualquier programa que ofrezca un recurso recibeel nombre <strong>de</strong> servidor. Un programa que usa un recurso es un cli<strong>en</strong>te.Si un programa proporciona acceso a los archivos <strong>en</strong> una red, recibe el nombre<strong>de</strong> servidor <strong>de</strong> archivos; un programa que coordina la impresión <strong>de</strong> los datos usandovarias impresoras se <strong>de</strong>nomina servidor <strong>de</strong> impresión; <strong>en</strong> g<strong>en</strong>eral, cualquier programaque ofrece un servicio y recibe solicitu<strong>de</strong>s para el mismo recibe el nombre <strong>de</strong> servidor 1 .Las re<strong>de</strong>s <strong>de</strong> muchas organizaciones están conectadas a re<strong>de</strong>s regionales y nacionalesmuy gran<strong>de</strong>s. D<strong>en</strong>tro <strong>de</strong> estos sistemas, ciertas computadoras, <strong>de</strong>nominadas puertaso pu<strong>en</strong>tes (gateway), actúan como <strong>en</strong>laces <strong>en</strong>tre la red y el mundo exterior.En todo el mundo las re<strong>de</strong>s <strong>de</strong> área amplia más importantes están conectadas aun sistema conocido como Internet. Toda computadora <strong>en</strong> Internet pue<strong>de</strong> conectarse acualquier computadora que también se <strong>en</strong>cu<strong>en</strong>tre <strong>en</strong> Internet.La mayoría <strong>de</strong> los países ti<strong>en</strong><strong>en</strong> re<strong>de</strong>s nacionales gran<strong>de</strong>s que están conectadas aInternet mediante puertas. Con efici<strong>en</strong>cia, este sistema <strong>en</strong>laza ci<strong>en</strong>tos <strong>de</strong> miles <strong>de</strong> computadoras,formando una red mundial <strong>en</strong>orme. Esto significa que uno pue<strong>de</strong>, con pocoesfuerzo, <strong>en</strong>viar correo electrónico y archivos <strong>de</strong> datos a todo el mundo. Exist<strong>en</strong> inclusopuertas para re<strong>de</strong>s <strong>de</strong> cómputo comerciales. Por ejemplo, también se pue<strong>de</strong>n intercambiarm<strong>en</strong>sajes con personas que us<strong>en</strong> América Online, CompuServe, MCI, Mail,Delphi, Prodigy, AT&T Mail, <strong>en</strong>tre otros prestadores <strong>de</strong> servicios.Cuando una computadora da el servicio <strong>de</strong> servidor y permite, a su vez, trabajo <strong>en</strong>ella, a esta computadora se le conoce como anfitrión (host).Son expertos los que configuran y administran las conexiones <strong>de</strong> red <strong>de</strong>scritas anteriorm<strong>en</strong>te.Estas conexiones, por lo g<strong>en</strong>eral, usan cables o líneas telefónicas r<strong>en</strong>tadas.Las conexiones a gran escala usan <strong>en</strong>laces vía satélite. Sin embargo, pue<strong>de</strong> usarse unalínea telefónica común y hacer que una computadora llame por teléfono directam<strong>en</strong>tea la computadora anfitrión o a un ruteador (router), estableciéndose la conexión. Entérminos técnicos, la conversión <strong>de</strong> señales <strong>de</strong> computadora a señales telefónicas sellama modulación. El proceso inverso se <strong>de</strong>nomina <strong>de</strong>modulación. Por tal motivo, eldispositivo que se requiere para conectarse a una computadora se llama mó<strong>de</strong>m (modulador/<strong>de</strong>modulador).Ahora bi<strong>en</strong>, recuerda que la única manera <strong>de</strong> trabajar con una computadora anfitriónUNIX es mediante una terminal. Como la computadora que se ti<strong>en</strong>e <strong>en</strong> casa no es unaterminal, el programa <strong>de</strong> comunicaciones que se utilice <strong>de</strong>be hacer que la computadoracasera actúe como una terminal. Se dice <strong>en</strong>tonces que el programa está emulando unaterminal. Los sistemas UNIX pue<strong>de</strong>n trabajar con muchas marcas y tipos <strong>de</strong> terminales,pero existe una que por costumbre es la que se emula cuando se trabaja con una líneatelefónica. Se trata <strong>de</strong> la terminal tipo VT100.1 En ocasiones el nombre servidor se emplea para referirse a una computadora y no a un programa.


5.1 Re<strong>de</strong>s <strong>de</strong> computadoras 795.1.2. TCP/IPInternet es una colección <strong>de</strong> re<strong>de</strong>s <strong>en</strong> todo el mundo que conti<strong>en</strong>e muchos tipos <strong>de</strong>sistemas. Algo <strong>de</strong>be mant<strong>en</strong>erlos unidos. Ese algo es TCP/IP.Los <strong>de</strong>talles <strong>de</strong> TCP/IP son altam<strong>en</strong>te técnicos y superan las expectativas <strong>de</strong> estematerial. Sin embargo, hablaremos <strong>de</strong> manera g<strong>en</strong>eral sobre el tema.TCP/IP es un nombre común que se aplica a una colección <strong>de</strong> más <strong>de</strong> ci<strong>en</strong> protocolos(un protocolo es un conjunto <strong>de</strong> reglas que permit<strong>en</strong> que difer<strong>en</strong>tes máquinas yprogramas se coordin<strong>en</strong> <strong>en</strong>tre sí). Los protocolos TCP/IP <strong>de</strong>rivan <strong>de</strong> dos protocolos básicos:TCP que es acrónimo <strong>de</strong> Transmition Control Protocol e IP que es acrónimo <strong>de</strong>Internet Protocol. En es<strong>en</strong>cia, estos protocolos se utilizan <strong>en</strong> Internet (y <strong>en</strong> otras re<strong>de</strong>s)para conectar computadoras, equipo <strong>de</strong> comunicaciones y programas. Cabe m<strong>en</strong>cionarque no todas las computadoras <strong>en</strong> Internet ejecutan UNIX, pero lo que es seguro es quetodas usan TCP/IP.D<strong>en</strong>tro <strong>de</strong> un sistema TCP/IP, los datos transmitidos se divi<strong>de</strong>n <strong>en</strong> pequeños paquetes.Cada paquete conti<strong>en</strong>e el domicilio <strong>de</strong> la computadora <strong>de</strong>l receptor junto con unnúmero <strong>de</strong> secu<strong>en</strong>cia. Por ejemplo, el sistema pue<strong>de</strong> dividir un m<strong>en</strong>saje <strong>en</strong> diez paquetes,cada uno con su propio número <strong>de</strong> secu<strong>en</strong>cia. Estos paquetes se <strong>en</strong>vían por la red ycada uno se transporta individualm<strong>en</strong>te hacia su <strong>de</strong>stino. Cuando se han recibido todoslos paquetes, el sistema <strong>de</strong>stino usa los números <strong>de</strong> secu<strong>en</strong>cia para juntarlos. Si por algunarazón uno <strong>de</strong> dichos paquetes llega <strong>en</strong> mal estado, el sistema <strong>de</strong>stino transmite unm<strong>en</strong>saje al emisor señalándole que <strong>de</strong>be volver a <strong>en</strong>viar <strong>de</strong>terminado paquete.Ti<strong>en</strong>e varias v<strong>en</strong>tajas dividir los datos <strong>en</strong> paquetes:Las líneas <strong>de</strong> comunicación se pue<strong>de</strong>n compartir <strong>en</strong>tre varios usuarios.Se pue<strong>de</strong>n transmitir al mismo tiempo distintos tipos <strong>de</strong> paquetes, ya que se or<strong>de</strong>narány combinarán hasta que llegu<strong>en</strong> a su <strong>de</strong>stino.Los datos no ti<strong>en</strong><strong>en</strong> que <strong>en</strong>viarse directam<strong>en</strong>te <strong>en</strong>tre dos computadoras.Cada paquete pasa <strong>de</strong> computadora <strong>en</strong> computadora hasta llegar a su <strong>de</strong>stino.Rapi<strong>de</strong>z, ya que sólo se necesitan unos segundos para <strong>en</strong>viar un archivo <strong>de</strong> grantamaño <strong>de</strong> una máquina a otra, aunque estén separadas por miles <strong>de</strong> kilómetros ypese a que los datos ti<strong>en</strong><strong>en</strong> que pasar por múltiples computadoras. De esta forma,si al <strong>en</strong>viar los paquetes algo sale mal con al m<strong>en</strong>os uno <strong>de</strong> ellos, sólo es necesariovolver a transmitir ese paquete y no todo el m<strong>en</strong>saje.Los paquetes no necesitan seguir la misma trayectoria.La red pue<strong>de</strong> llevar cada paquete <strong>de</strong> un lugar a otro y usar la conexión más idóneaque se <strong>en</strong>cu<strong>en</strong>tre disponible <strong>en</strong> ese preciso mom<strong>en</strong>to. Esto implica que no necesariam<strong>en</strong>telos paquetes <strong>de</strong>b<strong>en</strong> viajar por la misma ruta y por supuesto, tampocoti<strong>en</strong><strong>en</strong> que llegar todos al mismo tiempo a su <strong>de</strong>stino.El proceso que TCP sigue cuando se <strong>en</strong>vía un m<strong>en</strong>saje es el sigui<strong>en</strong>te:


80 Interneti. TCP divi<strong>de</strong> los datos <strong>en</strong> paquetes.ii. Or<strong>de</strong>na éstos <strong>en</strong> secu<strong>en</strong>cia.iii. Agrega cierta información para el control <strong>de</strong> errores.iv. Y <strong>de</strong>spués los distribuye.El proceso <strong>en</strong> el otro extremo es:i. TCP recibe los paquetes.ii. Verifica si hay errores.iii. Y los vuelve a combinar para convertirlo <strong>en</strong> los datos originales.iv. Si existe algún error, el programa TCP <strong>de</strong>stino <strong>en</strong>vía un m<strong>en</strong>saje solicitandoque se vuelvan a <strong>en</strong>viar <strong>de</strong>terminados paquetes.La tarea <strong>de</strong> IP es llevar los datos a granel (es <strong>de</strong>cir, los paquetes), <strong>de</strong> un sitio aotro. Las computadoras que <strong>en</strong>cu<strong>en</strong>tran las vías para llevar los datos <strong>de</strong> una red a otra,ruteadores, utilizan IP para trasladar los datos.Si el usuario está interesado <strong>en</strong> ver la ruta que va <strong>de</strong>s<strong>de</strong> su computadora hasta otra,pue<strong>de</strong> usarse el comando traceroute. El problema es que este comando no se <strong>en</strong>cu<strong>en</strong>tradisponible <strong>en</strong> todos los sistemas. El comando se usa <strong>de</strong> la sigui<strong>en</strong>te manera:% traceroute computadora5.2. WebInternet, como ya m<strong>en</strong>cionamos, es una colección mundial <strong>de</strong> re<strong>de</strong>s que transmit<strong>en</strong>datos usando el protocolo IP. Ahora la pregunta a resolver es ¿qué se pue<strong>de</strong> hacer <strong>en</strong>Internet?Son siete los servicios principales que Internet pue<strong>de</strong> ofrecer:Correo: Se pue<strong>de</strong>n <strong>en</strong>viar y recibir m<strong>en</strong>sajes.Transfer<strong>en</strong>cia <strong>de</strong> archivos: Se pue<strong>de</strong>n copiar archivos <strong>de</strong> una computadora a otra.Entrar a un sistema remoto: Po<strong>de</strong>mos <strong>en</strong>trar a otra computadora y trabajar <strong>en</strong> ellacomo si nuestra terminal estuviera conectada directam<strong>en</strong>te a ella.Grupos <strong>de</strong> interés (Us<strong>en</strong>et): Se pue<strong>de</strong>n leer y escribir artículos <strong>en</strong> los miles <strong>de</strong> grupos<strong>de</strong> interés <strong>de</strong> Us<strong>en</strong>et (también llamados foros).Software compartido: Po<strong>de</strong>mos obt<strong>en</strong>er copias gratuitas <strong>de</strong> cualquier tipo <strong>de</strong> softwarey nosotros mismos po<strong>de</strong>mos compartir nuestros programas con otras personas.Acceso a información: Se pue<strong>de</strong> buscar y recuperar cualquier tipo <strong>de</strong> información. Sino se está seguro <strong>de</strong> dón<strong>de</strong> buscar, exist<strong>en</strong> programas especiales que nos pue<strong>de</strong>nayudar.


5.3 Re<strong>de</strong>s y direcciones 81Comunicación con otras personas: Se pue<strong>de</strong> sost<strong>en</strong>er una conversación con otras personasusando el teclado y la pantalla (pue<strong>de</strong> ser una sola persona o incluso ungrupo).5.3. Re<strong>de</strong>s y direccionesUna vez que se nos asigna una cu<strong>en</strong>ta UNIX, po<strong>de</strong>mos comunicarnos con todos losintegrantes <strong>de</strong> la comunidad UNIX y transferir datos a todo el mundo. Lo único que s<strong>en</strong>ecesita es un domicilio y saber usar los programas <strong>en</strong> red.5.3.1. Domicilios estándar <strong>en</strong> InternetLa clave para po<strong>de</strong>r usar el Internet consiste <strong>en</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>r qué son los domicilioso correo electrónico. Lo más asombroso <strong>de</strong>l esquema <strong>de</strong> los domicilios <strong>en</strong> Internet esque cada i<strong>de</strong>ntificador <strong>de</strong> usuario y cada computadora necesitan un solo domicilio, sinimportar el servicio que utilic<strong>en</strong>.Un domicilio <strong>en</strong> Internet consta <strong>de</strong> un i<strong>de</strong>ntificador <strong>de</strong> usuario, seguido por el signo@ y <strong>de</strong>spués el nombre <strong>de</strong> la computadora (compuesto por el mismo nombre <strong>de</strong> lacomputadora y el <strong>de</strong> su dominio). De tal forma que el dominio estándar <strong>de</strong> Internet luceasí: i<strong>de</strong>ntificador@computadora.dominio. Por ejemplo, el correo electrónico <strong>de</strong> nuestrousuario es Juan.Perez@ci<strong>en</strong>cias.unam.mx.En este ejemplo, el i<strong>de</strong>ntificador <strong>de</strong> usuario es Juan.Perez y el dominio (el nombreo domicilio <strong>de</strong> la computadora) es ci<strong>en</strong>cias.unam.mx.Las partes <strong>de</strong>l dominio que están separadas por puntos se llaman subdominios. Eldomicilio anterior ti<strong>en</strong><strong>en</strong> tres subdominios: ci<strong>en</strong>cias.unam.mx. El subdominio más a la<strong>de</strong>recha (<strong>en</strong> este caso, mx) se <strong>de</strong>nomina dominio <strong>de</strong> jerarquía superior.Para leer un domicilio, se examinan los dominios <strong>de</strong> <strong>de</strong>recha a izquierda. Así vamos<strong>de</strong>l nombre más g<strong>en</strong>eral al más particular 2 .5.3.2. Nom<strong>en</strong>clatura antigua e internacionalExist<strong>en</strong> dos tipos <strong>de</strong> dominios <strong>de</strong> jerarquía superior: <strong>en</strong> nom<strong>en</strong>clatura antigua y <strong>en</strong>nom<strong>en</strong>clatura internacional mo<strong>de</strong>rna. El formato antiguo se emplea principalm<strong>en</strong>te <strong>en</strong>Estados Unidos y Canadá y consiste <strong>en</strong> siete dominios <strong>de</strong> jerarquía superior, que son:2 Nota: los domicilios <strong>de</strong> Internet no son s<strong>en</strong>sibles a mayúsculas y minúsculas, por lo que es lo mismoteclear una dirección con letras mayúsculas o con letras minúsculas o con una mezcla <strong>de</strong> ambas. Aunquees una bu<strong>en</strong>a costumbre teclear cualquier dirección sólo <strong>en</strong> minúsculas.


82 InternetTabla 5.1Dominios <strong>de</strong> jerarquía superiorDominiocomedugovintmilnetorgSignificadoOrganización comercialInstitución educativaInstitución gubernam<strong>en</strong>talOrganización internacionalEjércitoOrganización <strong>de</strong> re<strong>de</strong>sOrganización no lucrativaEste tipo <strong>de</strong> domicilio se <strong>de</strong>sarrolló para la antigua red Arpanet, ancestro <strong>de</strong> Internet,y se diseñó sólo para usarse <strong>en</strong> Estados Unidos.Cuando Internet se expandió, fue claro que se necesitaba un mejor sistema. La soluciónconsistió <strong>en</strong> usar dominios <strong>de</strong> jerarquía superior que repres<strong>en</strong>taban a países. Parala mayoría <strong>de</strong> los países, el dominio <strong>de</strong> jerarquía superior es la abreviatura internacional<strong>de</strong> dos letras.Fuera <strong>de</strong> los Estados Unidos, virtualm<strong>en</strong>te todos los sitios <strong>en</strong>lazados con Internetusan la nom<strong>en</strong>clatura <strong>de</strong> domicilios internacional mo<strong>de</strong>rna, don<strong>de</strong> el dominio <strong>de</strong> jerarquíasuperior muestra el código <strong>de</strong>l país. D<strong>en</strong>tro <strong>de</strong> los Estados Unidos (y parte <strong>de</strong>Canadá), la mayoría <strong>de</strong> las computadoras <strong>en</strong> Internet aún utilizan la antigua nom<strong>en</strong>clatura<strong>de</strong> domicilios; es <strong>de</strong>cir el estilo con los dominios <strong>de</strong> jerarquía superior.5.4. WWWWWW significa World Wi<strong>de</strong> Web o simplem<strong>en</strong>te web. Es un proyecto <strong>de</strong>sarrolladopor Tim Berners. El web es una colección <strong>de</strong> docum<strong>en</strong>tos interconectados <strong>en</strong> todo elmundo.Los docum<strong>en</strong>tos <strong>en</strong> el web son usualm<strong>en</strong>te conocidos como páginas web y pose<strong>en</strong>hipervínculos que <strong>en</strong>lazan una porción <strong>de</strong> texto o una imag<strong>en</strong> a otro docum<strong>en</strong>to, normalm<strong>en</strong>terelacionado con el texto o la imag<strong>en</strong>.Para acce<strong>de</strong>r al web <strong>de</strong>bes utilizar un navegador (browser). El navegador lee docum<strong>en</strong>tosdispuestos <strong>en</strong> el web y pue<strong>de</strong> buscar docum<strong>en</strong>tos <strong>de</strong> otras fu<strong>en</strong>tes. La informaciónes provista por los servidores <strong>de</strong> hipertexto <strong>de</strong> los cuales se pue<strong>de</strong>n obt<strong>en</strong>er losdocum<strong>en</strong>tos.Los navegadores pue<strong>de</strong>n también acce<strong>de</strong>r a archivos vía FTP, NNTP, y otros protocolosválidos para Internet. También permit<strong>en</strong> búsquedas <strong>en</strong> docum<strong>en</strong>tos y bases <strong>de</strong>


5.4 WWW 83datos. Los docum<strong>en</strong>tos que los navegadores <strong>de</strong>spliegan son docum<strong>en</strong>tos <strong>de</strong> hipertexto.El término hipertexto se <strong>de</strong>fine como texto con apuntadores a otros textos. Los navegadorestratan con los apuntadores <strong>de</strong> manera transpar<strong>en</strong>te. La v<strong>en</strong>taja <strong>de</strong>l hipertexto esque <strong>en</strong> un docum<strong>en</strong>to <strong>en</strong> hipertexto, si quieres más información acerca <strong>de</strong> un tema <strong>en</strong>particular que fue m<strong>en</strong>cionado, usualm<strong>en</strong>te pue<strong>de</strong>s hacer click sobre el tema para leercon más <strong>de</strong>talle. De hecho, los docum<strong>en</strong>tos pue<strong>de</strong>n estar ligados a otros docum<strong>en</strong>tos <strong>de</strong>autores completam<strong>en</strong>te difer<strong>en</strong>tes, mucho como las refer<strong>en</strong>cias al pie <strong>de</strong> página, peropue<strong>de</strong>s sumergirte <strong>en</strong> ella <strong>de</strong> forma instantánea.El término hipermedia es un super conjunto <strong>de</strong> hipertexto; esto es, cualquier mediocon apuntadores a otro medio. Esto significa que los navegadores pue<strong>de</strong>n <strong>de</strong>splegar nosólo archivos <strong>de</strong> texto, sino imág<strong>en</strong>es, sonidos o animaciones.Exist<strong>en</strong> difer<strong>en</strong>tes sitios don<strong>de</strong> todos los usuarios pue<strong>de</strong>n <strong>en</strong>contrar todo tipo <strong>de</strong>información y hacer búsquedas <strong>en</strong> la red. Por ejemplo:Google: www.google.comYahoo: www.yahoo.com5.4.1. URL: especificación <strong>de</strong> objetos <strong>en</strong> InternetURL significa Uniform Resource Locator. Es un estándar para especificar un objeto<strong>en</strong> Internet, tal como el nombre <strong>de</strong> un archivo. Los URL se v<strong>en</strong> como los que acá sigu<strong>en</strong>:ftp://ftp.fci<strong>en</strong>cias.unam.mx/pub/cursos/677/tarea.txthttp://www.fci<strong>en</strong>cias.unam.mx/admin/directorio.htmlLa primera parte <strong>de</strong>l URL, antes <strong>de</strong> los dos puntos, especifica el método <strong>de</strong> acceso.La parte <strong>de</strong>l URL <strong>de</strong>spués <strong>de</strong> las dos diagonales indica el nombre <strong>de</strong> la máquinay cada diagonal separa la ubicación <strong>de</strong>l archivo <strong>de</strong>ntro <strong>de</strong> dicha máquina; <strong>en</strong> el caso<strong>de</strong>l primer ejemplo m<strong>en</strong>cionado anteriorm<strong>en</strong>te se lee como: <strong>de</strong>ntro <strong>de</strong> la máquinaftp.fci<strong>en</strong>cias.unam.mx, utilizando el protocolo FTP, <strong>en</strong> la ruta pub/cursos/677 <strong>en</strong>contrarásel archivo tarea.txt.El método <strong>de</strong> acceso http es acrónimo <strong>de</strong> HiperText Transfer Protocol y es el método<strong>de</strong> acceso más común, por lo que si no aparece un método <strong>de</strong> acceso explícitam<strong>en</strong>te, lamayoría <strong>de</strong> los sistemas supon<strong>en</strong> que se trata <strong>de</strong> http.5.4.2. NavegadoresEl primer navegador fue <strong>de</strong>sarrollado por Tim Berners-Lee <strong>en</strong> el CERN a finales<strong>de</strong> 1990 y principios <strong>de</strong> 1991. Después surgió el navegador Mosaic, que funcionabainicialm<strong>en</strong>te <strong>en</strong> plataformas UNIX sobre X11; fue el primero que se ext<strong>en</strong>dió <strong>de</strong>bido alas versiones para Windows y Macintosh que había. Después <strong>en</strong>tró al mercado Netscape


84 InternetNavigator, el cual superó <strong>en</strong> capacida<strong>de</strong>s y velocidad a Mosaic. Este navegador ti<strong>en</strong>e lav<strong>en</strong>taja <strong>de</strong> funcionar <strong>en</strong> casi todos los UNIX, así como <strong>en</strong> ambi<strong>en</strong>tes Windows.Microsoft poco <strong>de</strong>spués sacó el navegador Internet Explorer, <strong>de</strong>sbancando así aNetscape Navigator. En años reci<strong>en</strong>tes Netscape Communications Corporation liberó elcódigo fu<strong>en</strong>te <strong>de</strong> su navegador y <strong>de</strong> esta manera nació el proyecto Mozilla. Sin embargoéste fue reescrito <strong>de</strong>s<strong>de</strong> cero tras <strong>de</strong>cidirse a <strong>de</strong>sarrollar y usar como base un nuevoconjunto <strong>de</strong> herrami<strong>en</strong>tas multiplataforma basado <strong>en</strong> XML llamado XUL.A finales <strong>de</strong> 2004 apareció <strong>en</strong> el mercado Firefox, una rama <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> Mozillaque pret<strong>en</strong><strong>de</strong> hacerse con parte <strong>de</strong>l mercado <strong>de</strong> Internet Explorer. Se trata <strong>de</strong> unnavegador más ligero que Mozilla.La comunicación <strong>en</strong>tre el servidor web y el navegador se realiza mediante el protocoloHTTP. Su función principal es mostrar docum<strong>en</strong>tos HTML <strong>en</strong> pantalla. En laactualidad, no solam<strong>en</strong>te se <strong>de</strong>scargan este tipo <strong>de</strong> docum<strong>en</strong>tos sino también docum<strong>en</strong>toscon imág<strong>en</strong>es, sonidos e incluso vi<strong>de</strong>os <strong>en</strong> difer<strong>en</strong>tes formatos. A<strong>de</strong>más, permit<strong>en</strong>almac<strong>en</strong>ar la información <strong>en</strong> el disco o crear marcadores (bookmarks) <strong>de</strong> las páginasmás visitadas.Algunos <strong>de</strong> los navegadores web más populares se incluy<strong>en</strong> <strong>en</strong> lo que se <strong>de</strong>nominauna Suite. Estas Suites dispon<strong>en</strong> <strong>de</strong> varios programas integrados para leer noticias <strong>de</strong>Us<strong>en</strong>et y correo electrónico mediante los protocolos NNTP, IMAP y POP.Actualm<strong>en</strong>te exist<strong>en</strong> difer<strong>en</strong>tes navegadores y todos cumpl<strong>en</strong> con el mismo objetivo:permitir al usuario recuperar y visualizar docum<strong>en</strong>tos <strong>de</strong> hipertexto, comúnm<strong>en</strong>te<strong>de</strong>scritos <strong>en</strong> HTML, <strong>de</strong>s<strong>de</strong> servidores web <strong>de</strong> todo el mundo a través <strong>de</strong> Internet. Algunos<strong>de</strong> los más utilizados <strong>en</strong> el mundo <strong>Linux</strong> son:Firefox: http://www.mozilla.comOpera: http://www.opera.com/Konqueror (integrado con KDE)Galeon (integrado con Gnome)Navegadores web basados <strong>en</strong> texto:Lynx: http://lynx.browser.org/w3m: http://w3m.sourceforge.net/Ya hemos utilizado Konqueror con anterioridad, pero lo hicimos para recorrer elsistema <strong>de</strong> archivos; ahora lo utilizaremos a<strong>de</strong>más para navegar el web.Konqueror te da la oportunidad <strong>de</strong> teclear un URL directam<strong>en</strong>te <strong>en</strong> el campo location(o <strong>en</strong> la v<strong>en</strong>tana <strong>de</strong> dialogo <strong>de</strong> URL File|Op<strong>en</strong>|Location). Al usar el URL,Netscape traerá la página especificada tal como si hubieses hecho click <strong>en</strong> la liga. Notaque la etiqueta <strong>en</strong> el campo location expresa la ubicación <strong>de</strong>spués <strong>de</strong> que trae la página,o Go to si editas el campo.


5.4 WWW 85Actividad 5.1(a) Abre un navegador y visita la página <strong>de</strong> la Facultad <strong>de</strong> Ci<strong>en</strong>cias <strong>de</strong> la U.N.A.M.ubicada <strong>en</strong> http://www.fci<strong>en</strong>cias.unam.mx(b) Localiza los servicios <strong>en</strong> línea para estudiantes.5.4.3. GoogleGoogle es una compañía cuyo principal producto es el motor <strong>de</strong> búsqueda <strong>de</strong>l mismonombre. Fue fundada el 27 <strong>de</strong> septiembre <strong>de</strong> 1998 por dos estudiantes <strong>de</strong> doctorado<strong>de</strong> la Universidad <strong>de</strong> Stanford, Larry Page y Sergey Brin. Aunque su principal productoes el buscador, la empresa también cu<strong>en</strong>ta con otros servicios: un comparador <strong>de</strong>precios llamado Froogle, un motor <strong>de</strong> búsqueda para material almac<strong>en</strong>ado <strong>en</strong> discoslocales llamado Google Desktop Search y un servicio <strong>de</strong> correo electrónico gratuitollamado Gmail, que ha revolucionado los sistemas <strong>de</strong> correo electrónico <strong>en</strong> el web.A continuación se listan algunos <strong>de</strong> los servicios que ofrece Google actualm<strong>en</strong>te:Tabla 5.2Servicios comunes <strong>de</strong> GoogleBuscadoresImág<strong>en</strong>esGruposDirectorioNoticiasServiciosGmailVi<strong>de</strong>oMapsCal<strong>en</strong>darEarthTalkBooks5.4.4. WikipediaLa wikipedia es una <strong>en</strong>ciclopedia gratuita a la cual todos los usuarios <strong>de</strong> Internett<strong>en</strong>emos acceso. Está escrita por todos aquellos voluntarios que quieran colaborar consus conocimi<strong>en</strong>tos y exponerlos <strong>en</strong> este medio. Actualm<strong>en</strong>te existe mucha g<strong>en</strong>te que vamejorando la wikipedia, con ci<strong>en</strong>tos <strong>de</strong> ediciones por hora, que son registradas específicam<strong>en</strong>te<strong>en</strong> el historial y g<strong>en</strong>eralm<strong>en</strong>te <strong>en</strong> los cambios reci<strong>en</strong>tes <strong>de</strong>l sitio. Si algunapersona expone sus i<strong>de</strong>as <strong>en</strong> forma inapropiada o simplem<strong>en</strong>te escribe disparates, laspersonas <strong>en</strong>cargadas <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong>l sitio lo verifican y <strong>de</strong>scartan este tipo <strong>de</strong> información.La wikipedia se <strong>en</strong>cu<strong>en</strong>tra disponible <strong>en</strong> varios idiomas, con distintos niveles <strong>de</strong>


86 Internetavance, ya que la traducción <strong>de</strong> artículos y <strong>en</strong>tradas <strong>de</strong> la <strong>en</strong>ciclopedia la realizan voluntarios.Entre otros idiomas <strong>en</strong>contramos inglés (el <strong>de</strong> mayor cobertura), español,francés y alemán.La carácterística principal <strong>de</strong> la wikipedia es la posibilidad <strong>de</strong> editar los artículos<strong>de</strong> la <strong>en</strong>ciclopedia. En g<strong>en</strong>eral, a los sitios web que permit<strong>en</strong> la edición (<strong>en</strong> línea y sinmayores restricciones) <strong>de</strong> su cont<strong>en</strong>ido se les conoce como wikis.El objetivo <strong>de</strong> la wikipedia es almac<strong>en</strong>ar artículos sobre temas consi<strong>de</strong>rados <strong>en</strong>ciclopédicos;sin embargo <strong>de</strong>ntro <strong>de</strong> ésta pue<strong>de</strong>s <strong>en</strong>contrar otros proyectos <strong>de</strong> cont<strong>en</strong>idodiverso, como:Tabla 5.3Otros servicios <strong>de</strong> la WikipediaServicioWikinoticiasWikiversidadWikilibrosWikisourceWikiquoteMeta-WikiWikiespeciesDescripciónEl noticiario libreLa universidad libreLa casa editorial libreLa biblioteca libreCitas y frases famosasCoordinación <strong>de</strong> proyectosDirectorio <strong>de</strong> especiesCada uno <strong>de</strong> estos sitios se rig<strong>en</strong> bajo la misma filosofía, permitirle a los usuariosque así lo <strong>de</strong>se<strong>en</strong>, colaborar con la ampliación <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong>l mismo, para <strong>de</strong> estaforma ampliar cada uno <strong>de</strong> estos proyectos <strong>en</strong> el web <strong>de</strong> manera gratuita. Los temas ahí<strong>de</strong>scritos son textos originales <strong>de</strong> dominio público.5.5. Los programas <strong>de</strong> correo <strong>de</strong> UnixComo ya habíamos m<strong>en</strong>cionado, Unix vi<strong>en</strong>e con un sistema <strong>de</strong> correo incorporado.La parte más importante <strong>de</strong> este sistema es su interfaz <strong>de</strong> usuario, es <strong>de</strong>cir el programaque se utiliza para <strong>en</strong>viar y leer correo.Originalm<strong>en</strong>te había <strong>en</strong> todo sistema Unix un programa s<strong>en</strong>cillo llamado mail. Eraa<strong>de</strong>cuado aunque con limitaciones. Después fue reemplazado por mailx y Mail, que <strong>en</strong>realidad son bastante similares <strong>en</strong>tre sí.Exist<strong>en</strong> otros más como pine, elm, mush, rmail, y algo que ti<strong>en</strong><strong>en</strong> <strong>en</strong> común estossistemas es que exti<strong>en</strong><strong>de</strong>n <strong>de</strong> gran forma la funcionalidad <strong>de</strong> mail, ofreci<strong>en</strong>do carácterísticasadicionales. Sin embargo nosotros veremos VM como lector <strong>de</strong> correo.


5.6 Netiquete 875.6. NetiqueteLa palabra netiquete se <strong>de</strong>riva <strong>de</strong> dos raices, Net, que significa red y etiquete quese refiere az las reglas <strong>de</strong> etiqueta para comportarse <strong>en</strong> un cierto ámbito, por lo queel término se refiere a la etiqueta que <strong>de</strong>bemos seguir cuando usemos la red, es <strong>de</strong>cir,son ciertas reglas (<strong>de</strong> etiqueta) que sería <strong>de</strong>seable seguir cuando estemos utilizandocualquier forma <strong>de</strong> comunicación a través <strong>de</strong> la red. Estas reglas no son obligatoriaspero si <strong>de</strong>seables. En resum<strong>en</strong> Netiquete se refiere a la forma a<strong>de</strong>cuada <strong>de</strong> comportarse<strong>en</strong> Internet.Antes <strong>de</strong> <strong>en</strong>trar <strong>en</strong> materia, es es<strong>en</strong>cial que cada usuario <strong>en</strong> la red reconozca suresponsabilidad, al t<strong>en</strong>er acceso a servicios, sitios, sistemas vastos y personas, pues eséste el responsable por sus acciones al acce<strong>de</strong>r a servicios <strong>de</strong> la red.“Internet”, o “la red”, no es una simple red; es más que eso: un grupo <strong>de</strong> miles <strong>de</strong>re<strong>de</strong>s individuales que han escogido permitir pasar tráfico <strong>en</strong>tre ellas. El tráfico <strong>en</strong>viadoa Internet pue<strong>de</strong> atravesar varias re<strong>de</strong>s difer<strong>en</strong>tes antes <strong>de</strong> llegar a su <strong>de</strong>stino. Por eso,los usuarios involucrados <strong>en</strong> estas re<strong>de</strong>s interconectadas <strong>de</strong>b<strong>en</strong> <strong>de</strong> estar informados <strong>de</strong>la carga que impon<strong>en</strong> <strong>en</strong> otras re<strong>de</strong>s participantes.Como un usuario <strong>de</strong> la red, se te permite acce<strong>de</strong>r a otras re<strong>de</strong>s (y/o los sistemas<strong>de</strong> computadora unidos a esas re<strong>de</strong>s). Cada red o sistema ti<strong>en</strong>e su propio grupo <strong>de</strong>políticas y procedimi<strong>en</strong>tos. Acciones que están rutinariam<strong>en</strong>te permitidas <strong>en</strong> una redpue<strong>de</strong>n estar controladas, o igualm<strong>en</strong>te prohibidas <strong>en</strong> otra red. Es responsabilidad <strong>de</strong>los usuarios regirse por las políticas y procedimi<strong>en</strong>tos <strong>de</strong> estas otras re<strong>de</strong>s. Recuerda,el hecho que un usuario “pueda” ejecutar una acción particular no implica que “<strong>de</strong>ba”tomar tal acción.El uso <strong>de</strong> la red es un privilegio, no un <strong>de</strong>recho, que pue<strong>de</strong> temporalm<strong>en</strong>te ser revocado<strong>en</strong> cualquier mom<strong>en</strong>to, por conducta abusiva. Tal conducta incluiría el ponerinformación ilegal <strong>en</strong> un sistema; el uso abusivo o <strong>de</strong>, por otra parte, l<strong>en</strong>guaje inaceptabletanto <strong>en</strong> m<strong>en</strong>sajes públicos o privados; el <strong>en</strong>vío <strong>de</strong> m<strong>en</strong>sajes que <strong>de</strong>n como resultadola pérdida <strong>de</strong> trabajo <strong>de</strong>l <strong>de</strong>stinatario o <strong>de</strong> sus sistemas; el <strong>en</strong>vío <strong>de</strong> çartas ca<strong>de</strong>na"; ola "transmisión"<strong>de</strong> m<strong>en</strong>sajes a listas o individuos y cualesquiera otros tipos <strong>de</strong> uso quecaus<strong>en</strong> congestión <strong>de</strong> la red o que interfieran con el trabajo <strong>de</strong> otros.5.6.1. Algunos puntos <strong>de</strong>l netiquete para comunicación electrónicaÉstas son algunas <strong>de</strong> las reglas que todo usuario <strong>de</strong> Internet <strong>de</strong>bería cumplir:El volum<strong>en</strong> y mant<strong>en</strong>imi<strong>en</strong>to <strong>de</strong>l buzón electrónico <strong>de</strong> un usuario es responsabilidad<strong>de</strong>l propio usuario.


88 InternetCuando cites a otra persona, borra cualquier cosa que no sea directam<strong>en</strong>te aplicablea tu respuesta. No permitas que tu email o software <strong>de</strong> Us<strong>en</strong>et cite automáticam<strong>en</strong>tetodo el cuerpo <strong>de</strong> los m<strong>en</strong>sajes que se respon<strong>de</strong>n cuando no sea necesario.Tómate el tiempo <strong>de</strong> editar lo citado a un mínimo como para proveer contextoa la respuesta. A nadie le gusta leer un m<strong>en</strong>saje largo citado tres o cuatro veces,sólo para ser seguido por una línea <strong>de</strong> respuesta como: "Sí, yo también".Usa palabras <strong>en</strong> mayúscula sólo para <strong>de</strong>stacar un punto importante o distinguirun título o cabecera. El usar palabras <strong>en</strong> mayúscula que no sean títulos suele serconsi<strong>de</strong>rado como GRITOS.Nunca man<strong>de</strong>s cartas “ca<strong>de</strong>na” por Internet. El hacerlo pue<strong>de</strong> causarte la pérdida<strong>de</strong> tu acceso a Internet.Sé cuidadoso cuando uses sarcasmo y humor. Sin comunicaciones cara a cara tuchiste pue<strong>de</strong> verse como una crítica. Cuando trates <strong>de</strong> ser gracioso, usa emoticonspara expresar humor. (Voltea tu cabeza hacia la izquierda para ver el emoticonsonrisa: :-) = carita <strong>de</strong> humor feliz).Recuerda que algunas listas <strong>de</strong> discusión y grupos Us<strong>en</strong>et ti<strong>en</strong><strong>en</strong> miembros <strong>de</strong>muchos países.• No <strong>de</strong>s por hecho que ellos van a <strong>en</strong>t<strong>en</strong><strong>de</strong>r una refer<strong>en</strong>cia a un programa <strong>de</strong>TV, películas, cultura popular o hechos actuales <strong>de</strong> tu propio país. Si <strong>de</strong>besusar la refer<strong>en</strong>cia, por favor explícala.• No <strong>de</strong>s por hecho que ellos van a <strong>en</strong>t<strong>en</strong><strong>de</strong>r refer<strong>en</strong>cias geográficas que sonlocales o nacionales.Si algui<strong>en</strong> <strong>en</strong>vía un com<strong>en</strong>tario o pregunta fuera <strong>de</strong>l tema <strong>de</strong> la lista, no respondasa la lista y no mant<strong>en</strong>gas el tema <strong>de</strong> fuera <strong>de</strong> la lista <strong>en</strong> la conversación pública.Los 10 mandami<strong>en</strong>tos <strong>de</strong> ética para lacomputadora1. No <strong>de</strong>berás usar una computadora para dañar a otras personas.2. No <strong>de</strong>berás interferir con el trabajo <strong>de</strong> computadora <strong>de</strong> otras personas.3. No <strong>de</strong>berás <strong>en</strong>trometerte <strong>en</strong> los archivos <strong>de</strong> otras personas.4. No <strong>de</strong>berás usar una computadora para robar.5. No <strong>de</strong>berás usar una computadora para dar falso testimonio.6. No <strong>de</strong>berás usar o copiar software <strong>de</strong> manera que violes su lic<strong>en</strong>cia.7. No <strong>de</strong>berás usar recursos <strong>de</strong> computadora <strong>de</strong> otras personas sin autorización.8. No <strong>de</strong>berás apropiarte <strong>de</strong>l trabajo intelectual <strong>de</strong> otras personas.9. Deberás p<strong>en</strong>sar acerca <strong>de</strong> las consecu<strong>en</strong>cias sociales <strong>de</strong>l programa que escribes.


5.7 KMail: lector <strong>de</strong> correo electrónico 8910. Deberás usar una computadora <strong>en</strong> formas <strong>en</strong> que muestres consi<strong>de</strong>ración y respeto.5.7. KMail: lector <strong>de</strong> correo electrónico5.7.1. Introducción$ smartinstall KMailFigura 5.1KMail es un cli<strong>en</strong>te <strong>de</strong> correo electrónico <strong>de</strong>ntro <strong>de</strong>l ambi<strong>en</strong>te <strong>de</strong> escritorio <strong>de</strong>KDE y parte <strong>de</strong>l sistema Kontact. Soporta carpetas, filtrado, visualización <strong>de</strong> correocon HTML y carácteres internacionales. Permite <strong>en</strong>viar correo a través <strong>de</strong> un servidor<strong>de</strong> correo vía SMTP o S<strong>en</strong>dmail y recibir correo por los protocolos POP3 o IMAP.También ti<strong>en</strong>e compatibilidad para filtrar m<strong>en</strong>sajes <strong>de</strong> correo a través <strong>de</strong> antivirus o antispamque se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> instalados <strong>en</strong> el sistema. En la figura 5.1 pue<strong>de</strong>s ver la pantalla<strong>de</strong> KMail.V<strong>en</strong>tana principal <strong>de</strong> KMail


90 Internet5.7.2. Utilizando KMailSeguram<strong>en</strong>te ya habrás utilizado algún otro lector <strong>de</strong> correo, pero aquí te pres<strong>en</strong>taremosalgunas <strong>de</strong> las v<strong>en</strong>tajas que ti<strong>en</strong>e KMail:Filtros <strong>de</strong> m<strong>en</strong>sajes.Muchas veces se ti<strong>en</strong><strong>en</strong> problemas para or<strong>de</strong>nar los nuevos m<strong>en</strong>sajes cuando llegana la ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada. Los filtros te permit<strong>en</strong> realizar ciertas tareas automáticam<strong>en</strong>tesobre los m<strong>en</strong>sajes <strong>en</strong>trantes y llevar a cabo acciones manualm<strong>en</strong>te sobre losm<strong>en</strong>sajes seleccionados <strong>en</strong> una carpeta.Los filtros constan <strong>de</strong> criterios <strong>de</strong> filtrado, cuyas reglas <strong>de</strong>terminan si un filtro aplicaa un m<strong>en</strong>saje; y una lista <strong>de</strong> acciones <strong>de</strong> filtro, que <strong>de</strong>scribe qué hacer con el m<strong>en</strong>saje.Los filtros se consi<strong>de</strong>ran uno <strong>de</strong>spués <strong>de</strong> otro, com<strong>en</strong>zando por el primero <strong>de</strong> la lista.El primero <strong>en</strong> el que coincida el patrón <strong>de</strong> búsqueda será ejecutado.• Patrones <strong>de</strong> búsqueda: Los criterios por los que un filtro pue<strong>de</strong> buscar:M<strong>en</strong>saje. Busca <strong>en</strong> todo el m<strong>en</strong>saje (es <strong>de</strong>cir cabeceras, cuerpo y adjuntos, si loshay).Cuerpo. Busca <strong>en</strong> el cuerpo <strong>de</strong>l m<strong>en</strong>saje (es <strong>de</strong>cir, todo el m<strong>en</strong>saje salvo las cabeceras).Cualquier cabecera. Busca <strong>en</strong> las cabeceras <strong>de</strong>l m<strong>en</strong>saje.Destinatarios. Busca <strong>en</strong> los campos “Para” y “CC” <strong>de</strong>l <strong>en</strong>cabezado <strong>de</strong>l m<strong>en</strong>saje.Tamaño <strong>en</strong> bytes. Establece los límites inferiores o superiores <strong>de</strong>l tamaño <strong>de</strong>lm<strong>en</strong>saje.Edad <strong>en</strong> días. Establece los límites superiores o inferiores <strong>de</strong> la antigüedad <strong>de</strong>lm<strong>en</strong>saje.Estado. Define las restricciones al estado <strong>de</strong>l m<strong>en</strong>saje.Cualquier otro nombre. Busca el campo <strong>de</strong> la cabera indicado por ese nombre.• Acciones <strong>de</strong> filtrado.El uso más frecu<strong>en</strong>te <strong>de</strong> los filtros es el <strong>de</strong> or<strong>de</strong>nar los m<strong>en</strong>sajes <strong>en</strong>trantes <strong>en</strong> difer<strong>en</strong>tescarpetas. Las posibles acciones son:Mover a carpeta. Esto moverá el m<strong>en</strong>saje a otra carpeta, eliminándolo <strong>de</strong> su carpetaactual si fuera necesario.Copiar <strong>en</strong> carpeta. Copiará el m<strong>en</strong>saje <strong>en</strong> otra carpeta.Definir i<strong>de</strong>ntidad. Definirá la i<strong>de</strong>ntidad que se va a usar si respon<strong>de</strong>s al m<strong>en</strong>saje.Marcar. Esto permite marcar los m<strong>en</strong>sajes como leído, importante, re<strong>en</strong>viado ocontestado.Enviar MDN falso. Enviará un m<strong>en</strong>saje <strong>de</strong> notificación <strong>de</strong> disposición falso (es<strong>de</strong>cir un recibo <strong>de</strong> lectura) al remit<strong>en</strong>te <strong>de</strong>l m<strong>en</strong>saje.Definir transporte. Esto establecerá el método <strong>de</strong> transporte (por ejemplo SMTP)que se va a usar si respon<strong>de</strong>s al m<strong>en</strong>saje.


5.7 KMail: lector <strong>de</strong> correo electrónico 91Definir Respon<strong>de</strong>r. Modificará el campo Respon<strong>de</strong>r-a <strong>de</strong> este m<strong>en</strong>saje. Esto esútil para la listas <strong>de</strong> correo.Re<strong>en</strong>viar. Re<strong>en</strong>viará el m<strong>en</strong>saje <strong>en</strong> la línea a otras direcciones <strong>de</strong> correo electrónico.Redirigir. Redirigirá el m<strong>en</strong>saje como si hubiera sido para otra dirección <strong>de</strong> correoelectrónico.Confirmar <strong>en</strong>trega. Int<strong>en</strong>tará <strong>de</strong>volver un m<strong>en</strong>saje al remit<strong>en</strong>te indicando que elm<strong>en</strong>saje ha sido <strong>en</strong>tregado correctam<strong>en</strong>te, si es que el remit<strong>en</strong>te lo solicitó.Ejecutar or<strong>de</strong>n. Ejecutará un programa, pero no modificará el m<strong>en</strong>saje. Aquí sepue<strong>de</strong>n introducir líneas <strong>de</strong> comando complejas, ya que KMail hace uso <strong>de</strong> unintérprete <strong>de</strong> comandos para ejecutarlas.A través <strong>de</strong> tubería. Esto <strong>en</strong>viará el m<strong>en</strong>saje a un programa.Eliminar cabecera. Eliminará todos los campos <strong>de</strong> la cabecera <strong>de</strong>l m<strong>en</strong>saje quecont<strong>en</strong>gan el nombre dado.Añadir cabecera. Se añadirá un nuevo campo <strong>de</strong> cabecera con el nombre dado yel valor para el m<strong>en</strong>saje.Reescribir cabecera. Buscará el campo <strong>de</strong> cabecera dado, modificará su cont<strong>en</strong>idoy lo volverá a escribir. La ca<strong>de</strong>na <strong>de</strong> búsqueda se interpretará como unaexpresión regular s<strong>en</strong>sible a las mayúsculas.Reproducir sonido. Reproducirá el sonido especificado.• Optimización <strong>de</strong> filtrado.El or<strong>de</strong>n <strong>de</strong> los filtros ti<strong>en</strong>e un impacto sobre la velocidad <strong>de</strong>l proceso <strong>de</strong> filtrado.Algunas formas <strong>de</strong> mejorar el filtrado son:◦ Detén el proceso <strong>de</strong> filtros tan pronto como sea posible.◦ Consi<strong>de</strong>ra el costo <strong>de</strong> la evaluación <strong>de</strong> las reglas <strong>de</strong> filtrado.◦ Comprueba el or<strong>de</strong>n <strong>de</strong> tus filtros.Firmar y cifrar m<strong>en</strong>sajes con PGP o GnuPG.Para configurar y usar el soporte PGP <strong>de</strong> KMail, es necesario t<strong>en</strong>er PGP instalado yconfigurado a<strong>de</strong>cuadam<strong>en</strong>te.Asimismo, es necesario g<strong>en</strong>erar un par <strong>de</strong> claves (clave secreta y clave pública) parasu i<strong>de</strong>ntidad. Pue<strong>de</strong>s hacer esto con la línea <strong>de</strong> comandos pgp –kg o gpg – –g<strong>en</strong>-keyrespectivam<strong>en</strong>te.Para una mejor explicacion <strong>de</strong> este tema pue<strong>de</strong>s revisar la seccion 5.10.Entre las opciones para firmar y cifrar m<strong>en</strong>sajes se <strong>en</strong>cu<strong>en</strong>tran:• Firmar m<strong>en</strong>sajes. Edita tu m<strong>en</strong>saje como <strong>de</strong> costumbre <strong>en</strong> la v<strong>en</strong>tana <strong>de</strong>l editor<strong>de</strong> KMail. Antes <strong>de</strong> <strong>en</strong>viar el m<strong>en</strong>saje, marca el icono Firmar m<strong>en</strong>saje <strong>en</strong> la barra<strong>de</strong> herrami<strong>en</strong>tas <strong>de</strong> la v<strong>en</strong>tana <strong>de</strong>l editor. Luego, pue<strong>de</strong>s <strong>en</strong>viar el m<strong>en</strong>saje.• Cifrar m<strong>en</strong>sajes. Para <strong>en</strong>viar un m<strong>en</strong>saje cifrado a algui<strong>en</strong> <strong>de</strong>l que ti<strong>en</strong>es unaclave pública, simplem<strong>en</strong>te edita el m<strong>en</strong>saje <strong>en</strong> la v<strong>en</strong>tana <strong>de</strong>l editor. Antes <strong>de</strong>


92 Internet<strong>en</strong>viar el m<strong>en</strong>saje, selecciona Cifrar m<strong>en</strong>saje <strong>en</strong> la barra <strong>de</strong> herrami<strong>en</strong>tas <strong>de</strong> lav<strong>en</strong>tana <strong>de</strong>l editor. Luego <strong>en</strong>vía el m<strong>en</strong>saje.• Enviar tu clave pública. Elije <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> la v<strong>en</strong>tana <strong>de</strong>l editor el subm<strong>en</strong>úAdjunt->Adjuntar clave pública. Esto adjuntará la clave pública que hayas <strong>de</strong>finidopara la i<strong>de</strong>ntidad <strong>de</strong> ese m<strong>en</strong>saje.• Recibir un m<strong>en</strong>saje cifra. Selecciona el m<strong>en</strong>saje y escribe tu frase <strong>de</strong> paso.Luego, KMail int<strong>en</strong>tará <strong>de</strong>scifrar el m<strong>en</strong>saje y lo mostrará <strong>en</strong> texto plano si haconseguido <strong>de</strong>scifrarlo con tu clave pública.• Recibir una clave pública. Pue<strong>de</strong>s recibir una clave pública como un adjunto,o vía http o ftp, para cifrar un m<strong>en</strong>saje al propietario <strong>de</strong> la clave. Luego pue<strong>de</strong>sañadir esta clave junto con el resto <strong>de</strong> claves públicas tecleandopgp – –ka nombre_archivo<strong>en</strong> la línea <strong>de</strong> ór<strong>de</strong>nes (usando PGP) o tecleandogpg – –import nombre_archivo<strong>en</strong> la línea <strong>de</strong> ór<strong>de</strong>nes (usando GnuPG).Anti correo basura.KMail usa herrami<strong>en</strong>tas externas y especializadas para el correo basura. Algunas <strong>de</strong>las herrami<strong>en</strong>tas admitidas son:Bogofilter. Bogofilter es un filtro que <strong>de</strong>tecta spam <strong>en</strong> la fase inicial <strong>de</strong> <strong>en</strong>tr<strong>en</strong>ami<strong>en</strong>to.SpamAssassin. SpamAssassin es una herrami<strong>en</strong>ta que no necesita <strong>en</strong>tr<strong>en</strong>ami<strong>en</strong>toy <strong>de</strong>p<strong>en</strong><strong>de</strong> principalm<strong>en</strong>te <strong>de</strong> su configuración.Filtro <strong>de</strong> correo <strong>de</strong> GMX. Usa el cont<strong>en</strong>ido <strong>de</strong>l campo <strong>de</strong> <strong>en</strong>cabezado <strong>de</strong>l m<strong>en</strong>sajepara <strong>de</strong>terminar si es o no correo basura.Antivirus.KMail usa herrami<strong>en</strong>tas externas y especializadas para la <strong>de</strong>tección <strong>de</strong> virus <strong>de</strong>ntro<strong>de</strong> correos. La <strong>de</strong>tección <strong>de</strong> m<strong>en</strong>sajes que conti<strong>en</strong><strong>en</strong> virus se realiza <strong>de</strong>fini<strong>en</strong>do accionesa través <strong>de</strong> una herrami<strong>en</strong>ta <strong>de</strong>ntro <strong>de</strong> un filtro especial. Otro filtro ti<strong>en</strong>e lasreglas para verificar los m<strong>en</strong>sajes con virus <strong>de</strong>tectados y acciones para marcarlos.Seguridad.Las opciones <strong>de</strong> seguridad relativas a la lectura <strong>de</strong> m<strong>en</strong>sajes son:• Convertir HTML a texto plano.• Permitir a los m<strong>en</strong>sajes cargar refer<strong>en</strong>cias externas <strong>de</strong>s<strong>de</strong> Internet.• Disponer <strong>de</strong> las notificaciones <strong>de</strong> m<strong>en</strong>sajes.• No <strong>en</strong>viar MDNs <strong>en</strong> respuesta a los m<strong>en</strong>sajes cifrados.• Importar automáticam<strong>en</strong>te las claves y los certificados.Las opciones <strong>de</strong> validación S/MIME son:• Validar certificados usando CRL.• Validar certificados <strong>en</strong> línea (OCSP).• Validar URL <strong>de</strong>l OCSP.


5.8 FTP 93• Validar firma <strong>de</strong>l OCSP.• Ignorar la URL para el servicio <strong>de</strong> certificados.• No comprobar las políticas <strong>de</strong> certificados.• No consultar nunca una CRL.• Obt<strong>en</strong>er certificados <strong>de</strong> los emisores que no se t<strong>en</strong>gan.• No realizar ninguna petición HTTP.• Ignorar puntos <strong>de</strong> distribución <strong>de</strong> certificados <strong>de</strong> CRL por http.• Usar el proxy HTTP <strong>de</strong>l sistema.• Usar proxy para peticiones http.• No realizar ninguna petición LDAP.• Ignorar los puntos <strong>de</strong> distribución <strong>de</strong> certificados <strong>de</strong> CRL por LDAP.• Validar la máquina principal para las peticiones LDAP.Groupware.Hace posible almac<strong>en</strong>ar las <strong>en</strong>tradas <strong>de</strong> las aplicaciones <strong>de</strong> Kontact (KOrganizer,KAddressBook y KNotes).5.8. FTPFTP (File Transfer Protocol) se utiliza para transferir archivos <strong>en</strong>tre dos computadoras,g<strong>en</strong>eralm<strong>en</strong>te conectadas vía Internet. Cuando usas FTP, lo que realm<strong>en</strong>te estásusando es un programa llamado cli<strong>en</strong>te, que se conecta con otra computadora que manti<strong>en</strong>elos archivos, llamada servidor.5.8.1. ¿Qué es un FTP anónimo?Muchos sistemas <strong>de</strong> computadoras a través <strong>de</strong> Internet ofrec<strong>en</strong> archivos por medio<strong>de</strong> FTP anónimos. Esto significa que pue<strong>de</strong>s acce<strong>de</strong>r a una máquina sin necesidad<strong>de</strong> t<strong>en</strong>er una cu<strong>en</strong>ta <strong>en</strong> esa máquina (es <strong>de</strong>cir no ti<strong>en</strong>es que ser un usuario oficial <strong>de</strong>lsistema). Estos servidores FTP anónimos conti<strong>en</strong><strong>en</strong> software, archivos para configurarre<strong>de</strong>s, imág<strong>en</strong>es, canciones y todo tipo <strong>de</strong> información. Los archivos para las listas <strong>de</strong>correo electrónico con frecu<strong>en</strong>cia también están almac<strong>en</strong>adas y todo está disponible através <strong>de</strong> un FTP anónimo. Una <strong>en</strong>orme cantidad <strong>de</strong> información está almac<strong>en</strong>ada <strong>en</strong>estas máquinas y está lista para cualquiera que la necesite.5.8.2. Comandos para FTPPue<strong>de</strong>s usar los sigui<strong>en</strong>tes comandos para trasladar archivos. Algunos comandos<strong>de</strong> FTP son los mismos para distintas computadoras, pero otros no. También, algunos


94 Internetsitios <strong>de</strong> FTP ofrec<strong>en</strong> distintos comandos, por eso es importante leer los archivos RE-ADME <strong>en</strong> el sitio. Usualm<strong>en</strong>te FTP lista los comandos si tecleas ’help’ o (?). Tambiénlos comandos <strong>de</strong> ayuda <strong>de</strong> la computadora pue<strong>de</strong>n t<strong>en</strong>er información acerca <strong>de</strong>l FTP.Trata con cualquiera <strong>de</strong> los sigui<strong>en</strong>tes comandos: % man FTP, % man ftpd, % helpftp, % ftp /?, % fftp -?, o % ftp /h .Algunos comandos disponibles <strong>en</strong> el sistema se muestran <strong>en</strong> la tabla 5.4Tabla 5.4Algunos comandos disponibles <strong>en</strong> el sistemaComandoasciibinarycddirlsgethelplcdlpwdmgetpwdDescripciónCambia a modo ascii.Cambia a modo binario.Cambia <strong>de</strong> directorio <strong>en</strong> la computadora remota.Lista los archivos <strong>en</strong> el directorio actual <strong>en</strong> la computadoraremota.Es parecido a dir, pero a veces muestra m<strong>en</strong>os información.Copia un archivo <strong>de</strong> la computadora remota a la tuya.Brinda ayuda sobre el uso <strong>de</strong> los comandos con el programaftp.Cambia <strong>de</strong> directorio <strong>en</strong> tu computadora (la ’l’ es por local).Muestra el directorio actual (pwd) <strong>en</strong> tu computadora.Copia varios archivos <strong>de</strong> la computadora remota a la tuya.Muestra el directorio actual <strong>de</strong> la computadora remota.Un FTP anónimo es un servicio que ofrec<strong>en</strong> muchas máquinas <strong>en</strong> Internet. Estopermite que tú ingreses <strong>en</strong> la máquina con un nombre <strong>de</strong> usuario anónimo o seas unusuario con nombre ftp.Los archivos resi<strong>de</strong>n <strong>en</strong> discos y están i<strong>de</strong>ntificados por un 〈nombre〉, comoNETDISK, y el archivo que está <strong>en</strong> ese disco se i<strong>de</strong>ntifica comoPue<strong>de</strong>s cambiar <strong>de</strong> directorio tecleando:% cd netdisk:[faq.internet]% cd [faq.internet]% cd faqNETDISK:[FAQ.INTERNET]FTP.FAQ.


5.9 SSH: Secure Shell 95seguido <strong>de</strong>% cd internetPara acceso anónimo, teclea% ftp.simtel.netusando como tu login anonymous y como password tu dirección <strong>de</strong> correo.Muchos sistemas brindan información acerca <strong>de</strong> cómo usar el sistema cuando <strong>en</strong>trasa él. Usualm<strong>en</strong>te los archivos están agrupados <strong>en</strong> grupos <strong>de</strong> archivos. Los formatos máscomunes para preparar archivos para traslado o almac<strong>en</strong>ami<strong>en</strong>to más económico sontar y zip.Actividad 5.2i. Haz un ftp anónimo a la máquina que sea el servidor.ii. Ya <strong>en</strong> la máquina servidor busca y baja los archivos foo.tgz y bar.tgz, que se<strong>en</strong>cu<strong>en</strong>tran <strong>de</strong>ntro <strong>de</strong>l servidor.iii. Guárdalos <strong>en</strong> un directorio llamado cosas_foo y ábrelos.5.9. SSH: Secure Shell$ smartinstall sshSecure Shell (SSH) es el reemplazo para rsh, rlogin, rcp y ftp. Encripta todo eltráfico y proporciona varios niveles <strong>de</strong> aut<strong>en</strong>ticación <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> las necesida<strong>de</strong>s.Entre las principales características <strong>de</strong> Secure Shell se <strong>en</strong>cu<strong>en</strong>tran accesos remotosseguros a otra máquina sobre una red, ejecución <strong>de</strong> comandos <strong>en</strong> una máquina remota,mover y copiar archivos <strong>de</strong> una máquina a otra. Proporciona una aut<strong>en</strong>ticación fuertey comunicaciones seguras sobre canales inseguros. Adicionalm<strong>en</strong>te, SSH proporcionaconexiones seguras <strong>de</strong> X y direccionami<strong>en</strong>to seguro <strong>de</strong> conecciones TCP arbitrarias.Hay dos versiones principales <strong>de</strong>l protocolo Secure Shell: SSH1 y SSH2. La versiónvieja SSH1 está si<strong>en</strong>do reemplazada por SSH2 para alcanzar una flexibilidad mejorada,mejor escalabilidad para organizaciones con ci<strong>en</strong>tos <strong>de</strong> usuarios y mejor seguridad. Actualm<strong>en</strong>tehay funciones que se pue<strong>de</strong>n <strong>en</strong>contrar <strong>en</strong> SSH1 que están si<strong>en</strong>do trasladadasa SSH2.SSH trabaja cambiando y verificando información y usando llaves públicas y privadaspara i<strong>de</strong>ntificar servidores y usuarios. Después proporciona cifrado para la comunicaciónsubsecu<strong>en</strong>te, también usando criptografía <strong>de</strong> llaves públicas y privadas. Cadasistema ti<strong>en</strong>e su propio par <strong>de</strong> llaves públicas y privadas que i<strong>de</strong>ntifican a otros sistemas.Una llave pública <strong>de</strong> un sistema cli<strong>en</strong>te pue<strong>de</strong> colocarse <strong>en</strong> un archivo <strong>de</strong>l servidorpara permitir al servidor la aut<strong>en</strong>ticación <strong>de</strong>l cli<strong>en</strong>te por medio <strong>de</strong> un intercambio <strong>de</strong>llaves.


96 Internet5.9.1. Accedi<strong>en</strong>do a sistemas remotosPara establecer una conexión interactiva a un sistema remoto <strong>de</strong>bes usar el comandossh. Supongamos que eres el usuario Juan.Perez <strong>en</strong> el cli<strong>en</strong>te beta.fci<strong>en</strong>cias.unam.mxy quieres conectarte a lambda.fci<strong>en</strong>cias.unam.mx; <strong>de</strong>bes <strong>de</strong> usar el comando ssh ycomo único parámetro el nombre <strong>de</strong>l sistema remoto.% beta# ssh lambda.fci<strong>en</strong>cias.unam.mx% Juan.Perez@lambda.fci<strong>en</strong>cias.unam.mx’s password:% Auth<strong>en</strong>tication successful.% lambda#Ahora, si el nombre <strong>de</strong> tu cu<strong>en</strong>ta <strong>en</strong> el sistema remoto difiere <strong>de</strong>l que usas <strong>en</strong> elsistema local (<strong>de</strong>s<strong>de</strong> don<strong>de</strong> te estás conectando) <strong>de</strong>bes agregar al parámetro tu nombre<strong>en</strong> el sistema remoto seguido <strong>de</strong> una @, como <strong>en</strong> tu dirección electrónica. Por ejemplo,supón que el nombre <strong>en</strong> el sistema remoto es Juan.Perez. Así, para conectarse alambda como el usuario Juan.Perez <strong>de</strong>bemos usar:% beta# ssh Juan.Perez@lambda.fci<strong>en</strong>cias.unam.mx% Juan.Perez@lambda.fci<strong>en</strong>cias.unam.mx’s password:% Auth<strong>en</strong>tication successful.% lambda#La sintaxis simplificada para conexiones remotas con ssh es:ssh [opciones] [usuario@]sistema_remotoActividad 5.3 Inicia una sesión remota <strong>en</strong> la máquina que t<strong>en</strong>gas a tu lado usando tumismo nombre <strong>de</strong> usuario.Actividad 5.4 Inicia una sesión remota <strong>en</strong> el.servidor.temporal como el usuarioguest.5.9.2. Copiando archivos <strong>en</strong>tre sistemasPue<strong>de</strong>s copiar archivos <strong>de</strong>l sistema local a una máquina remota o viceversa, o aún<strong>en</strong>tre dos sistemas remotos usando el comando scp. Para especificar un archivo <strong>en</strong>un sistema remoto simplem<strong>en</strong>te hay que agregar como prefijo el nombre <strong>de</strong>l sistemaremoto seguido <strong>de</strong> dos puntos (:).La sintaxis simplificada para copiar archivos a sistemas remotos <strong>de</strong> forma seguracon scp es:scp [[usuario@]sistema_orig:]archivo [[usuario@]sistema_<strong>de</strong>st:]archivo_o_dir


5.10 PGP: Pretty Good Privacy 97Si no tecleas el nombre <strong>de</strong>l archivo don<strong>de</strong> se copiará o no especificas un directorio,se usará el nombre <strong>de</strong>l orig<strong>en</strong>. Una forma s<strong>en</strong>cilla <strong>de</strong> obt<strong>en</strong>er una copia <strong>de</strong> un archivoremoto <strong>en</strong> el directorio actual es usando un punto como <strong>de</strong>stino; por ejemplo, paracopiar el archivo hola <strong>de</strong> la máquina beta al directorio don<strong>de</strong> estamos actualm<strong>en</strong>te yusando el mismo nombre <strong>de</strong> usuario, hacemos lo sigui<strong>en</strong>te:% omega# scp @beta:hola .foo’s password:hola | 154B | 0.0 kB/s | TOC: 00:00:03 | 100omega# lsholaPara copiar el archivo hola-Mundo <strong>de</strong>l usuario ivanx <strong>en</strong> la máquina lambda alusuario kar <strong>en</strong> la máquina beta usamos:% kappa# scp ivanx@lambda:holaMundo kar@beta:ivanx@lambda’s password:kar@beta’s password:holaMundo | 34B | 0.0 kB/s | TOC: 00:00:01 | 100Nota que la copia fue <strong>en</strong> dos máquinas remotas, pues la máquina local es kappa.Para copiar un directorio completo, t<strong>en</strong>emos que usar la ban<strong>de</strong>ra –r; por ejemplo, siquiero copiar el directorio tarea1, tecleo:% omega# scp -r @beta:tarea1 .ivanx’s password:Actividad 5.5Copia un archivo <strong>de</strong> la máquina local a una máquina remota como el mismousuario y <strong>de</strong>spués como un usuario difer<strong>en</strong>te.Copia un archivo <strong>de</strong> una máquina remota a la máquina local como el mismousuario y <strong>de</strong>spués como un usuario difer<strong>en</strong>te.Copia un archivo <strong>en</strong>tre dos máquinas remotas.Copia un directorio <strong>en</strong>tre cualesquiera dos máquinas.5.10. PGP: Pretty Good PrivacyPGP (Pretty Good Privacy) es un sistema <strong>de</strong> aut<strong>en</strong>ticación y cifrado basado <strong>en</strong> unatecnología llamada criptografía <strong>de</strong> llave pública, escrito por Philip Zimmermann <strong>en</strong>1991; permite que nadie, excepto uno mismo y el <strong>de</strong>stinatario o <strong>de</strong>stinatarios a losque vaya dirigido, pueda leer el m<strong>en</strong>saje, gracias a que los éstos están codificados.


98 InternetAsimismo pue<strong>de</strong> usarse para comprobar la aut<strong>en</strong>ticidad <strong>de</strong>l m<strong>en</strong>saje asegurándonosque <strong>en</strong> verdad lo ha escrito el remit<strong>en</strong>te.También se utiliza para <strong>en</strong>viar archivos a través <strong>de</strong> correo electrónico codificados<strong>en</strong> formato ASCII; resulta mucho mejor que otros sistemas como el uu<strong>en</strong>co<strong>de</strong>, ya quePGP realiza una compresión zip al docum<strong>en</strong>to que va a codificar.5.10.1. Funcionami<strong>en</strong>to <strong>de</strong> PGPEl funcionami<strong>en</strong>to <strong>de</strong> PGP es muy s<strong>en</strong>cillo: cada usuario ti<strong>en</strong>e dos llaves una públicay otra privada; la pública es la que distribuyes a la g<strong>en</strong>te y sirve para que ellospuedan <strong>en</strong>viarte un m<strong>en</strong>saje codificado que sólo tú, mediante tu llave privada, podrás<strong>de</strong>scifrar; también pue<strong>de</strong> servir para firmar un m<strong>en</strong>saje poni<strong>en</strong>do una parte <strong>de</strong> tu llaveprivada (irreconocible claro) <strong>de</strong>ntro <strong>de</strong> una firma. Esto es como un certificado <strong>de</strong> aut<strong>en</strong>ticidad,ya que al recibir el m<strong>en</strong>saje, PGP comprueba la firma y texto y lo compara conla llave pública que t<strong>en</strong>emos <strong>de</strong>l remit<strong>en</strong>te, dando un error si se ha cambiado algo <strong>en</strong> eltexto o la firma no correspon<strong>de</strong> a la persona que nos <strong>en</strong>vía el m<strong>en</strong>saje.El cifrado <strong>de</strong> PGP utiliza la criptografía <strong>de</strong> llave pública e incluye un sistema queasocia las llaves públicas con cada uno <strong>de</strong> los usuarios. El cifrado <strong>de</strong> correo electrónicoa través <strong>de</strong> PGP utiliza algoritmos <strong>de</strong> cifrado <strong>de</strong> llaves asimétricas: el remit<strong>en</strong>te utilizala llave pública <strong>de</strong>l <strong>de</strong>stinatario para cifrar una llave compartida; esta llave compartidase usa para cifrar el m<strong>en</strong>saje; <strong>de</strong>spués el <strong>de</strong>stinatario que recibe el correo cifrado lo<strong>de</strong>s<strong>en</strong>cripta (o <strong>de</strong>scifra) usando su llave privada.Una estrategia similar se utiliza para <strong>de</strong>tectar cuando un m<strong>en</strong>saje ha sido alteradoo para aut<strong>en</strong>ticar que fue <strong>en</strong>viado realm<strong>en</strong>te por la persona que dice ser el remit<strong>en</strong>te.El remit<strong>en</strong>te utiliza el cifrado <strong>de</strong> PGP para crear una firma digital para el m<strong>en</strong>saje conalgoritmos <strong>de</strong> RSA o DSA. Para esto, PGP calcula un i<strong>de</strong>ntificador único(hash) para elm<strong>en</strong>saje y <strong>de</strong>spués crea la firma digital <strong>de</strong> dicho i<strong>de</strong>ntificador, usando la llave privada<strong>de</strong>l remit<strong>en</strong>te. El <strong>de</strong>stinatario <strong>de</strong>l m<strong>en</strong>saje calcula el i<strong>de</strong>ntificador <strong>de</strong>l m<strong>en</strong>saje recibidoy <strong>de</strong>spués lo utiliza junto con la llave pública <strong>de</strong>l remit<strong>en</strong>te, <strong>de</strong>ntro <strong>de</strong>l algoritmo <strong>de</strong>la firma, para crear su propia firma digital <strong>de</strong>l m<strong>en</strong>saje recibido. Si esta firma coinci<strong>de</strong>con la firma que cont<strong>en</strong>ía el m<strong>en</strong>saje recibido, <strong>en</strong>tonces se pue<strong>de</strong> <strong>de</strong>cir que el m<strong>en</strong>sajerecibido no ha sido corrompido <strong>de</strong>liberadam<strong>en</strong>te o acci<strong>de</strong>ntalm<strong>en</strong>te, puesto que fuefirmado correctam<strong>en</strong>te.No existe un método que pueda romper el cifrado PGP por medios criptográficos o<strong>de</strong> cómputo. A<strong>de</strong>más, <strong>en</strong> comparación con otros protocolos <strong>de</strong> seguridad, como SSL quesólo proteg<strong>en</strong> la información mom<strong>en</strong>táneam<strong>en</strong>te mi<strong>en</strong>tras están <strong>en</strong> tránsito a su <strong>de</strong>stino,PGP pue<strong>de</strong> ser utilizada para proteger la información <strong>en</strong> medios <strong>de</strong> almac<strong>en</strong>ami<strong>en</strong>to <strong>de</strong>larga duración como discos duros. La seguridad <strong>en</strong> el método <strong>de</strong> cifrado PGP se basa<strong>en</strong> el hecho <strong>de</strong> que los algoritmos utilizados son inquebrantables con las técnicas <strong>de</strong>lcriptoanálisis mo<strong>de</strong>rno.


5.11 RSS: sistema <strong>de</strong> noticias 995.11. RSS: sistema <strong>de</strong> noticias5.11.1. IntroducciónRSS es parte <strong>de</strong> la familia <strong>de</strong> formatos XML (una especificación g<strong>en</strong>érica paraformatos <strong>de</strong> datos) <strong>de</strong>sarrollado específicam<strong>en</strong>te para sitios que se actualic<strong>en</strong> con frecu<strong>en</strong>ciay por medio <strong>de</strong>l cual se pue<strong>de</strong> compartir la información y usarla <strong>en</strong> otros sitiosweb o programas. A esto se le conoce como redifusión o sindicación.El RSS no es otra cosa que un formato <strong>de</strong> datos que es utilizado para difundircont<strong>en</strong>idos <strong>de</strong> un sitio web. El formato permite distribuir cont<strong>en</strong>ido sin necesidad <strong>de</strong> unnavegador. Las iniciales RSS se usa para los sigui<strong>en</strong>tes estándares:Rich Site Summary (RSS 0.91)RDF Site Summary (RSS 0.9 y 1.0)Really Simple Syndication (RSS 2.0)Los programas que le<strong>en</strong> y pres<strong>en</strong>tan fu<strong>en</strong>tes RSS <strong>de</strong> difer<strong>en</strong>tes proce<strong>de</strong>ncias se<strong>de</strong>nominan agregadores. Gracias a los agregadores o lectores <strong>de</strong> feeds (programas ositios que permit<strong>en</strong> leer fu<strong>en</strong>tes RSS), se pue<strong>de</strong>n obt<strong>en</strong>er resúm<strong>en</strong>es <strong>de</strong> todos los sitiosque se <strong>de</strong>see <strong>de</strong>s<strong>de</strong> tu correo electrónico o por medio <strong>de</strong> aplicaciones web que funcionancomo agregadores. No es necesario abrir el navegador y visitar <strong>de</strong>c<strong>en</strong>as <strong>de</strong> paginas web.5.11.2. Akregator$ smartinstallAkregatorAkregator es un lector <strong>de</strong> RSS como parte <strong>de</strong> la integración <strong>de</strong> KDE utilizadoprincipalm<strong>en</strong>te <strong>en</strong> sistemas UNIX. RSS conti<strong>en</strong>e noticias y actualizaciones <strong>de</strong> sitiosWeb y Web logs. Los fu<strong>en</strong>tes <strong>de</strong> RSS pue<strong>de</strong>n or<strong>de</strong>narse <strong>de</strong>ntro <strong>de</strong> categorías, se pue<strong>de</strong>nhacer búsquedas increm<strong>en</strong>tales para los títulos <strong>de</strong> todas las <strong>en</strong>tradas <strong>de</strong> la base <strong>de</strong> datosy Akregator pue<strong>de</strong> ser configurado para que actualice los fu<strong>en</strong>tes <strong>en</strong> intervalos regulares<strong>de</strong> tiempo. Provee integración con Konqueror y un navegador interno para leer noticias.5.1 RSSEl lector <strong>de</strong> RSS <strong>en</strong> Gnome es blam, está escrito <strong>en</strong> C# para el proyecto Mono y GTK#.Utilizando AkregatorUna vez instalado, Akgregator se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> <strong>en</strong> el m<strong>en</strong>ú principal, <strong>de</strong>ntro <strong>de</strong> lacategoría <strong>de</strong> Internet; o pue<strong>de</strong>s iniciarlo <strong>de</strong>s<strong>de</strong> una terminal con el comando akgregator.


100 InternetAkregator vi<strong>en</strong>e pre-instalado con algunos sitios web RSS <strong>de</strong> KDE, así que pue<strong>de</strong>s bajarlos sitios y empezar a leer las últimas noticias <strong>de</strong> forma fácil y rápida.Agregando fu<strong>en</strong>tes <strong>de</strong> noticiasSi ya estás aburrido <strong>de</strong> leer noticias <strong>de</strong> KDE y quieres agregar más fu<strong>en</strong>tes <strong>de</strong> otrossitios, aquí es don<strong>de</strong> la integración <strong>de</strong> KDE se da a lucir.Figura 5.2Vista principal <strong>de</strong> AkregatorMuchos sitios web y blog ti<strong>en</strong><strong>en</strong> fu<strong>en</strong>tes <strong>de</strong> RSS. Si <strong>en</strong>tras a un sitio con soportepara fu<strong>en</strong>tes <strong>de</strong> RSS y estás utilizando el navegador <strong>de</strong> Konqueror, <strong>en</strong>tonces aparece unicono <strong>de</strong> RSS con la ley<strong>en</strong>da suscribe, indicando que soporta RSS. Seleccionando esteicono y escogi<strong>en</strong>do la opción Agregar Fu<strong>en</strong>te <strong>en</strong> Akregator podrás leer las noticias <strong>de</strong>ese sitio web <strong>de</strong>s<strong>de</strong> Akregator.Desafortunadam<strong>en</strong>te, no todas las noticias <strong>de</strong> RSS conti<strong>en</strong><strong>en</strong> toda la información<strong>en</strong> un artículo, lo cual es una lástima porque <strong>de</strong>sperdician mucho <strong>de</strong> su propósito. Sinembargo, Akregator ti<strong>en</strong>e una forma intelig<strong>en</strong>te <strong>de</strong> solucionar esto, utilizando un navegadorembebido <strong>de</strong>ntro <strong>de</strong> un tabulador, que permite abrir una liga hacia el sitio web.


5.12 M<strong>en</strong>sajería instantánea 101IntegraciónD<strong>en</strong>tro <strong>de</strong> las opciones <strong>de</strong> configuración <strong>de</strong> Akregator, pue<strong>de</strong>s establecer que elsistema actualice todas las noticias <strong>en</strong> intervalos regulares <strong>de</strong> tiempo y que cada vezque ha sido <strong>de</strong>scargada una noticia nueva el sistema te man<strong>de</strong> una notificación.Akregator está integrado <strong>de</strong>ntro <strong>de</strong> Konqueror <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que permite agregarnoticias RSS al sistema <strong>de</strong> Akregator <strong>de</strong>s<strong>de</strong> un navegador Konqueror y viceversa,Konqueror está integrado <strong>de</strong>ntro <strong>de</strong> Akregator <strong>en</strong> el s<strong>en</strong>tido <strong>en</strong> que estando <strong>de</strong>ntro <strong>de</strong>Akregator es posible navegar a través <strong>de</strong> páginas web.Si p<strong>en</strong>sabas que no era posible t<strong>en</strong>er mayor integración <strong>de</strong>ntro <strong>de</strong> aplicaciones KDE,los usuarios <strong>de</strong> Kontact estarán acostumbrados a t<strong>en</strong>er todas sus aplicaciones <strong>de</strong> informaciónpersonal <strong>en</strong> un solo lugar y Akregator también permite t<strong>en</strong>er un módulo <strong>de</strong>Kontact <strong>de</strong> forma que todas tus noticias <strong>de</strong> RSS están disponibles <strong>de</strong>ntro <strong>de</strong> tu correoelectrónico, cal<strong>en</strong>dario y <strong>de</strong>más <strong>en</strong>tret<strong>en</strong>imi<strong>en</strong>tos.5.12. M<strong>en</strong>sajería instantánea5.12.1. IntroducciónLa m<strong>en</strong>sajería instantánea (IM) es una manera para comunicarse <strong>de</strong> manera inmediatacon personas a través <strong>de</strong> Internet. Te permite t<strong>en</strong>er una conversación casi tan naturalcomo <strong>en</strong> el teléfono o cara a cara, tecleando m<strong>en</strong>sajes <strong>en</strong> una v<strong>en</strong>tana compartida<strong>en</strong>tre tú y la otra persona.A<strong>de</strong>más permite ver el estado <strong>en</strong> que se <strong>en</strong>cu<strong>en</strong>tran las personas, esto es, si estánactualm<strong>en</strong>te conectadas al mismo tiempo que tú, <strong>de</strong> manera que <strong>de</strong>spliega un m<strong>en</strong>sajeIM <strong>en</strong> la pantalla <strong>de</strong> la otra persona tan pronto como se <strong>en</strong>vía. O se pue<strong>de</strong> cambiar elestado si prefieres no ser interrumpido, y así otros sabrán que no <strong>de</strong>b<strong>en</strong> contactarte.5.12.2. Kopete$ smartinstallkopeteKopete es un cli<strong>en</strong>te <strong>de</strong> m<strong>en</strong>sajería instantánea, <strong>de</strong>sarrollado por y para el ambi<strong>en</strong>tegráfico <strong>de</strong> KDE. Te permite comunicarte con amigos utilizando varios servicios <strong>de</strong>m<strong>en</strong>sajería instantánea. Provi<strong>en</strong>e <strong>de</strong> la palabra chil<strong>en</strong>a copete utilizada para referirse abebidas alcohólicas.Kopete soporta los sigui<strong>en</strong>tes protocolos:AOL Instant Mess<strong>en</strong>gerGadu-Gadu


102 InternetICQInternet Relay ChatJabber (XMPP)MSN Mess<strong>en</strong>gerNovell GroupWiseSMSSkype (via Kopete Skype)Yahoo! Mess<strong>en</strong>gerLotus SametimeLa i<strong>de</strong>a es t<strong>en</strong>er una única herrami<strong>en</strong>ta que permita acce<strong>de</strong>r a los difer<strong>en</strong>tes sistemas<strong>de</strong> m<strong>en</strong>sajería instantánea <strong>de</strong> una manera fácil <strong>de</strong> utilizar. El sistema está integradocon otras aplicaciones KDE <strong>de</strong> manera que te permite acce<strong>de</strong>r a los contactos <strong>de</strong> laag<strong>en</strong>da <strong>de</strong> direcciones y otras utilerías proporcionadas. También provee herrami<strong>en</strong>taspara guardar conversaciones, cifrado <strong>de</strong> m<strong>en</strong>sajes, filtrado <strong>de</strong> contactos e intercambio<strong>de</strong> archivos; a<strong>de</strong>más es un sistema ext<strong>en</strong>sible al que se le pue<strong>de</strong>n agregar fácilm<strong>en</strong>t<strong>en</strong>uevos accesorios como protocolos <strong>de</strong> comunicación, edición <strong>en</strong> L A TEX, traductores <strong>de</strong>texto, etc.Kopete introduce la i<strong>de</strong>a <strong>de</strong> metacontactos, que permite combinar las difer<strong>en</strong>tes formasque ti<strong>en</strong>es <strong>de</strong> contactar a algui<strong>en</strong> <strong>en</strong> una sola persona. Otras aplicaciones listan auna misma persona con varias cu<strong>en</strong>tas <strong>de</strong> m<strong>en</strong>sajería <strong>de</strong> manera separada (como si setratara <strong>de</strong> personas difer<strong>en</strong>tes por t<strong>en</strong>er difer<strong>en</strong>tes cu<strong>en</strong>tas <strong>de</strong> m<strong>en</strong>sajería); un metacontactoes una persona y los contactos son las difer<strong>en</strong>tes formas <strong>de</strong> comunicación con ésta.Así, los contactos se reconoc<strong>en</strong> fácilm<strong>en</strong>te mediante iconos pequeños que repres<strong>en</strong>tanel protocolo <strong>de</strong> comunicación que pue<strong>de</strong>s utilizar.Empezando a utilizar KopeteProbablem<strong>en</strong>te ya cu<strong>en</strong>tes con un servicio <strong>de</strong> m<strong>en</strong>sajería instantánea, tanto porqueya uses IM, como porque necesitas usar el mismo servicio que tus amigos. Si no es así,te recom<strong>en</strong>damos utilizar un servicio <strong>de</strong> m<strong>en</strong>sajería instantánea basado <strong>en</strong> estándaresabiertos, porque éstos están diseñados para ser usados con software libre. Los servicios<strong>de</strong> m<strong>en</strong>sajería, basados <strong>en</strong> estándares abiertos que Kopete soporta son Jabber e IRC.La sigui<strong>en</strong>te sección supone que ya estás registrado con un servicio <strong>de</strong> IM.Pue<strong>de</strong>s iniciar Kopete <strong>de</strong>s<strong>de</strong> el m<strong>en</strong>ú <strong>de</strong> KDE, eligi<strong>en</strong>do Internet y <strong>de</strong>ntro <strong>de</strong> este subm<strong>en</strong>úKopete; <strong>de</strong>s<strong>de</strong> la barra <strong>de</strong> herrami<strong>en</strong>tas seleccionando el icono correspondi<strong>en</strong>te,como se muestra <strong>en</strong> la figura 5.3; o <strong>en</strong> una terminal con el comando kopete. Utilizandoel m<strong>en</strong>ú <strong>de</strong> KDE localiza la sección <strong>de</strong> internet, que mostrará todos los servicios <strong>de</strong>internet disponibles <strong>en</strong> tu sistema y selecciona kopete.


5.12 M<strong>en</strong>sajería instantánea 103Figura 5.3Kopete <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> KDE5.2 M<strong>en</strong>sajería InstantáneaEl cli<strong>en</strong>te <strong>de</strong> m<strong>en</strong>sajería instantánea <strong>en</strong> Gnome es gaim, un m<strong>en</strong>sajero que resulta s<strong>en</strong>cilloy también es multi-protocolo.5.12.3. Creando cu<strong>en</strong>tasPara crear una cu<strong>en</strong>ta, <strong>en</strong>tra al m<strong>en</strong>ú Prefer<strong>en</strong>cias->Configurar Kopete para mostrarla v<strong>en</strong>tana <strong>de</strong> configuración. Selecciona el icono Cu<strong>en</strong>tas->Nuevo y escoje elservicio <strong>de</strong> m<strong>en</strong>sajería que quieras usar.Una vez especificados los <strong>de</strong>talles <strong>de</strong> IM, <strong>en</strong> la barra <strong>de</strong> estado <strong>de</strong> la parte inferior<strong>de</strong> la Lista <strong>de</strong> contactos <strong>de</strong> Kopete aparece un icono repres<strong>en</strong>tando tu cu<strong>en</strong>ta. Con elbotón <strong>de</strong>recho podrás conectarte a través <strong>de</strong>l m<strong>en</strong>ú que aparece. El icono <strong>de</strong> la barra <strong>de</strong>estado se animará mi<strong>en</strong>tras Kopete se conecta al servicio <strong>de</strong> IM.Una vez conectado, se obt<strong>en</strong>drán tus contactos <strong>de</strong>l servidor y se mostrarán <strong>en</strong> laLista <strong>de</strong> Contactos. Para contactar a algui<strong>en</strong>, sólo ti<strong>en</strong>es que seleccionar su nombre yaparecerá una v<strong>en</strong>tana <strong>de</strong> plática, como se ve <strong>en</strong> la figura 5.4.


104 InternetFigura 5.4Vista principal <strong>de</strong> kopete5.12.4. Funciones básicasLas funcionalida<strong>de</strong>s básicas <strong>de</strong> Kopete son:Lista <strong>de</strong> Contactos. La Lista <strong>de</strong> Contactos es la v<strong>en</strong>tana principal que aparece cuandose inicia Kopete.Entre las acciones que pue<strong>de</strong>s realizar <strong>de</strong>ntro <strong>de</strong> la Lista <strong>de</strong> Contactos se <strong>en</strong>cu<strong>en</strong>tran:Establecer el estado que <strong>de</strong>termina cómo estás visible <strong>en</strong> la red <strong>de</strong> IM.Mostrar todos los contactos, sus estados y los grupos escogidos para ellos.Iniciar una conversación con un contacto.Enviar m<strong>en</strong>sajes a un contacto.Enviar archivos.Organizar contactos. Kopete introduce los metacontactos, que repres<strong>en</strong>tan auna persona. Un metacontacto conti<strong>en</strong>e todas las difer<strong>en</strong>tes i<strong>de</strong>ntida<strong>de</strong>s <strong>de</strong> IMque t<strong>en</strong>ga esa persona, haci<strong>en</strong>do fácil i<strong>de</strong>ntificar si algui<strong>en</strong> está disponible, sint<strong>en</strong>er que recordar qué sistema <strong>de</strong> IM está usando <strong>en</strong> este mom<strong>en</strong>to.


5.12 M<strong>en</strong>sajería instantánea 105Agrupar contactos <strong>de</strong>ntro <strong>de</strong> grupos.Agregar contactos.R<strong>en</strong>ombrar contactos.Eliminar contactos.Salir <strong>de</strong> Kopete. Si solam<strong>en</strong>te se cierra la v<strong>en</strong>tana el programa continuaráejecutándose <strong>en</strong> la ban<strong>de</strong>ja <strong>de</strong> sistema <strong>de</strong> KDE.V<strong>en</strong>tana <strong>de</strong> conversación. La V<strong>en</strong>tana <strong>de</strong> conversación es el lugar don<strong>de</strong> realizas laconversación. Los m<strong>en</strong>sajes aparec<strong>en</strong> <strong>en</strong> el or<strong>de</strong>n <strong>en</strong> que se recib<strong>en</strong>, con los m<strong>en</strong>sajesanteriores <strong>en</strong> la parte superior <strong>de</strong> la vista.Entre los aspectos que conti<strong>en</strong>e la v<strong>en</strong>tana <strong>de</strong> conversación se <strong>en</strong>cu<strong>en</strong>tran:Lista <strong>de</strong> miembros <strong>de</strong> conversación. Algunos sistemas <strong>de</strong> IM permit<strong>en</strong> conversar<strong>en</strong> grupo.Área <strong>de</strong> <strong>en</strong>trada. Aquí es don<strong>de</strong> se pue<strong>de</strong>n teclear m<strong>en</strong>sajes antes <strong>de</strong> <strong>en</strong>viarlos.Barra <strong>de</strong> estado. La barra <strong>de</strong> estado conti<strong>en</strong>e m<strong>en</strong>sajes temporales, la notificación<strong>de</strong> que algui<strong>en</strong> más está tecleando y el botón Enviar.Pestañas. Kopete permite llevar múltiples conversaciones <strong>en</strong> una v<strong>en</strong>tana, colocandocada una <strong>en</strong> su propia pestaña <strong>de</strong>ntro <strong>de</strong> la v<strong>en</strong>tana.5.12.5. Ext<strong>en</strong>sionesKopete ofrece ext<strong>en</strong>siones que prove<strong>en</strong> funciones que no son es<strong>en</strong>ciales para lam<strong>en</strong>sajería, pero son útiles, <strong>en</strong>tre las que se <strong>en</strong>cu<strong>en</strong>tran:Auto reemplazo <strong>de</strong> texto, que permite corregir palabras mal escritas o guardarpalabras usando abreviaturas.Criptografía, que permite usar GnuPG para cifrar conversaciones.Respuesta a m<strong>en</strong>sajes particulares, como resaltar texto o reproducir sonidos.Guardar conversaciones usando cualquier sistema <strong>de</strong> IM.KopeteTex, que permite mant<strong>en</strong>er conversaciones utilizando el l<strong>en</strong>guaje <strong>de</strong> marcasLaTeX.Auto-aus<strong>en</strong>te por movimi<strong>en</strong>to.Permite a la g<strong>en</strong>te con la que estás conversando <strong>en</strong> ese mom<strong>en</strong>to saber qué músicaestás escuchando.Estadísticas con información sobre el patrón <strong>de</strong> actividad <strong>de</strong> tus contactos.Efectos <strong>de</strong> texto.Traductor que permite <strong>de</strong>finir un idioma para cada contacto.


106 Internet5.13. R<strong>de</strong>sktop: Remote Desktop Protocol Cli<strong>en</strong>tR<strong>de</strong>sktop es un cli<strong>en</strong>te RDP(Remote Desktop Protocol) 3 para la mayoría <strong>de</strong> lossistemas Unix, como son <strong>Linux</strong> o FreeBSD. Fue creado por Matthew Chapman. Es unaherrami<strong>en</strong>ta libre y <strong>de</strong> código abierto, escrita bajo la lic<strong>en</strong>cia <strong>de</strong> GNU (G<strong>en</strong>eral PublicLic<strong>en</strong>se) que permite al usuario interactuar con terminales Windows NT/2000.5.13.1. Utilizando R<strong>de</strong>sktopR<strong>de</strong>sktop inicia indicándole al programa cuál es la computadora Windows a la quese quiere conectar. Pue<strong>de</strong>s iniciar el programa <strong>de</strong>s<strong>de</strong> una terminal con el comando% r<strong>de</strong>sktop 192.168.1.10.Esto lo que hace es arrancar el programa e iniciar una sesión <strong>en</strong> la máquina indicada,es <strong>de</strong>cir, abre una v<strong>en</strong>tana <strong>de</strong> aut<strong>en</strong>ticación <strong>de</strong> Windows <strong>en</strong> la máquina con dirección IP192.168.1.10. El servidor utiliza por <strong>de</strong>fecto el puerto TCP 3389.5.3 r<strong>de</strong>sktop <strong>en</strong> GnomeLa interfaz gráfica <strong>de</strong>ntro <strong>de</strong> Gnome para utilizar el cli<strong>en</strong>te <strong>de</strong> R<strong>de</strong>sktop es gr<strong>de</strong>sktopy funciona <strong>de</strong> manera muy similar a krdc.La manera más común <strong>de</strong> utilizar R<strong>de</strong>sktop es <strong>de</strong>ntro <strong>de</strong> aplicaciones linux distribuidassobre cli<strong>en</strong>tes <strong>de</strong>lgados, <strong>de</strong> forma que los cli<strong>en</strong>tes <strong>de</strong>lgados arrancan <strong>de</strong>ntro <strong>de</strong>una red y se conectan a un servidor Windows utilizando R<strong>de</strong>sktop.5.14. Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDEKontact es un conjunto <strong>de</strong> programas para manejo <strong>de</strong> información personal queofrece KDE. Está integrado a partir <strong>de</strong> varios compon<strong>en</strong>tes, <strong>de</strong> los cuales la mayoría sonaplicaciones por sí mismas, pero aparec<strong>en</strong> embebidas <strong>de</strong>ntro <strong>de</strong> kontact. Éste se <strong>en</strong>carga<strong>de</strong> integrarlos para t<strong>en</strong>er un solo punto <strong>de</strong> acceso a ellos y permitir que interactú<strong>en</strong><strong>en</strong>tre sí.3 El protocolo RDP es un protocolo <strong>de</strong> aplicación multi-canal que permite a los usuarios conectarsea computadoras con sistemas operativos Windows; a<strong>de</strong>más no se necesita t<strong>en</strong>er un ancho <strong>de</strong> banda muygran<strong>de</strong> (un mo<strong>de</strong>m <strong>de</strong> 56K es sufici<strong>en</strong>te)


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 107En la figura 5.5 se muestran las distintas partes <strong>de</strong> Kontact. En la sección 1 semuestran los compon<strong>en</strong>tes que agrupa Kontact y se resalta el compon<strong>en</strong>te activo. Loscompon<strong>en</strong>tes que conforman a Kontact son:Resum<strong>en</strong>CorreoContactosCal<strong>en</strong>darioTareas p<strong>en</strong>di<strong>en</strong>tesDiarioNoticiasNotasOríg<strong>en</strong>esFigura 5.5V<strong>en</strong>tana inicial <strong>de</strong> KontactEn la sección 2 se muestra el compon<strong>en</strong>te resum<strong>en</strong>, <strong>en</strong> el cual se <strong>de</strong>spliegan loselem<strong>en</strong>tos relevantes <strong>de</strong> cada uno <strong>de</strong> los compon<strong>en</strong>tes <strong>de</strong> Kontact. Esta sección cambiacada vez que seleccionamos un compon<strong>en</strong>te distinto.La cantidad <strong>de</strong> opciones que pres<strong>en</strong>tan la mayoría <strong>de</strong> las aplicaciones son muchasmás <strong>de</strong> las que se pue<strong>de</strong>n explicar brevem<strong>en</strong>te <strong>en</strong> este capítulo; por esa razón te mos-


108 Internettraremos cómo configurar cada una <strong>de</strong> ellas para realizar sólo las operaciones más s<strong>en</strong>cillas.5.14.1. Resum<strong>en</strong>Éste es un compon<strong>en</strong>te específico <strong>de</strong> Kontact, don<strong>de</strong> se le pres<strong>en</strong>ta al usuario unresum<strong>en</strong> <strong>de</strong> la información cont<strong>en</strong>ida <strong>en</strong> los <strong>de</strong>más aspectos <strong>de</strong> Kontact. Permite que<strong>de</strong> forma rápida te <strong>en</strong>teres <strong>de</strong> los ev<strong>en</strong>tos relevantes al día actual, como pue<strong>de</strong>n serlas últimas noticias, fechas importantes (cumpleaños o aniversarios) o tal vez asuntosp<strong>en</strong>di<strong>en</strong>tes.5.14.2. Correo, KMailKontact utiliza a KMail como el lector <strong>de</strong> correo. La configuración y uso <strong>de</strong> estaaplicación ya se revisó <strong>en</strong> la sección 5.7.5.14.3. Contactos, KAddressBookPara po<strong>de</strong>r mant<strong>en</strong>er <strong>de</strong> forma organizada la lista <strong>de</strong> todas las personas con las quetratas, es necesario que lleves una libreta <strong>de</strong> direcciones. La aplicación que te permitehacer eso <strong>en</strong> KDE es KAddressBook. Aquí pue<strong>de</strong>s mant<strong>en</strong>er toda la información <strong>de</strong> tuscontactos y hacer uso <strong>de</strong> ella con distintas aplicaciones <strong>de</strong> KDE como KMail o Kopete.KAddressBook te permite organizar tus contactos <strong>en</strong> distintas ag<strong>en</strong>das. Esto es útilsi quieres t<strong>en</strong>er una ag<strong>en</strong>da con tus contactos personales <strong>en</strong> tu computadora, pero tambiénquieres t<strong>en</strong>er acceso a una ag<strong>en</strong>da con los contactos <strong>de</strong> tu trabajo. Si esa ag<strong>en</strong>da laexportan mediante algún servidor <strong>de</strong> groupware, KAddressBook pue<strong>de</strong> acce<strong>de</strong>r a ellay permitir que el resto <strong>de</strong> tus aplicaciones KDE hagan uso <strong>de</strong> esa información. Lo primeroque se necesita para empezar a utilizar KAddressBook es t<strong>en</strong>er una ag<strong>en</strong>da, auncuando te provee <strong>de</strong> una por omisión. En la figura 5.6 se muestra la v<strong>en</strong>tana inicial <strong>de</strong>KAddressBook. En la sección 1 se muestran los contactos pert<strong>en</strong>eci<strong>en</strong>tes a las ag<strong>en</strong>dasseleccionadas. En la sección 2 se muestran las ag<strong>en</strong>das que están disponibles, y cualesestán seleccionadas. En la sección 3 se muestran los datos <strong>de</strong>l contacto seleccionado.Creando una nueva ag<strong>en</strong>daCuando creamos una nueva ag<strong>en</strong>da es necesario indicarle a KAddressBook <strong>en</strong> don<strong>de</strong>se <strong>en</strong>cu<strong>en</strong>tra la información correspondi<strong>en</strong>te a nuestros contactos, esta pue<strong>de</strong> estar<strong>en</strong> la misma computadora <strong>en</strong> la que se esta arrancando esta aplicación o bi<strong>en</strong> pue<strong>de</strong>estar <strong>en</strong> una máquina remota. La v<strong>en</strong>taja <strong>de</strong> t<strong>en</strong>er una ag<strong>en</strong>da <strong>en</strong> una máquina remota


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 109radica <strong>en</strong> po<strong>de</strong>r compartir contactos con distintas personas, y po<strong>de</strong>r acce<strong>de</strong>r a esa información<strong>de</strong>s<strong>de</strong> difer<strong>en</strong>tes computadoras. Exist<strong>en</strong> varias formas para hacer eso, pero <strong>en</strong>este capítulo veremos como trabajar con una ag<strong>en</strong>da local. Para crear una nueva ag<strong>en</strong>dalocal es necesario realizar los sigui<strong>en</strong>tes pasos:Figura 5.6KAddressBook vacíoi. Presionar el botón Añadir que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la parte baja <strong>de</strong> KAddressBook.ii. Seleccionar Archivo (así guardamos toda la ag<strong>en</strong>da <strong>en</strong> un solo archivo).iii. Como se muestra <strong>en</strong> la figura 5.7, t<strong>en</strong>emos que ingresar un nombre para la ag<strong>en</strong>day especificar qué formato utilizará. vCard es un formato estándar que facilita elintercambio <strong>de</strong> información, por lo que usualm<strong>en</strong>te ésa es la mejor elección.iv. Indicar la ruta <strong>en</strong> la que se creará el archivo.Una vez hecho eso, t<strong>en</strong>emos la ag<strong>en</strong>da lista y pue<strong>de</strong>s empezar a agregar contactos aella.


110 InternetFigura 5.7Creando una nueva ag<strong>en</strong>daAgregando un nuevo contactoD<strong>en</strong>tro <strong>de</strong> la pantalla <strong>de</strong> KAddressBook, <strong>en</strong> la v<strong>en</strong>tana superior, pue<strong>de</strong>s hacer click<strong>de</strong>recho y seleccionar Nuevo Contacto o utilizar la abreviatura a<strong>de</strong>cuada (por omisiónC-N). El sigui<strong>en</strong>te paso es seleccionar <strong>en</strong> cuál ag<strong>en</strong>da queremos agregar el contacto.Con eso aparece la v<strong>en</strong>tana que se muestra <strong>en</strong> la figura 5.8 <strong>en</strong> la que <strong>de</strong>bes ingresar lainformación <strong>de</strong>l contacto que vas a agregar. En la pestaña "G<strong>en</strong>eral. a gregas informaciónacerca <strong>de</strong> este contacto. Esto pue<strong>de</strong> ser su nombre, sus teléfonos, direcciones <strong>de</strong> correo,direcciones <strong>de</strong> m<strong>en</strong>sajería instantánea y direcciones <strong>de</strong> inmuebles. A<strong>de</strong>más es posibleseleccionar si este contacto es público, privado o confi<strong>de</strong>ncial.Figura 5.8Creando una nuevo contacto


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 111En la pestaña Detalles mostrada <strong>en</strong> la figura 5.9, pue<strong>de</strong>s especificar informaciónacerca <strong>de</strong> el lugar <strong>de</strong> trabajo <strong>de</strong> la persona, su puesto, su cumpleaños y hasta su apodo.Figura 5.9Pestaña <strong>de</strong> <strong>de</strong>tallesEn la pestaña Varios pue<strong>de</strong>s especificar la localización geográfica <strong>de</strong> esa persona,una foto suya y el logotipo <strong>de</strong> su compañía.En la pestaña Prefer<strong>en</strong>cias <strong>de</strong> cifrado es posible especificar las prefer<strong>en</strong>cias <strong>de</strong>KMail con respecto a este contacto.Cuando agregas algunos contactos y seleccionas uno <strong>de</strong> ellos, KAddressBook se vecomo <strong>en</strong> la figura 5.10.Figura 5.10KAddressBook con algunos contactos


112 Internet5.14.4. Cal<strong>en</strong>dario y p<strong>en</strong>di<strong>en</strong>tes con KOrganizerKOrganizer es la aplicación <strong>en</strong>cargada <strong>de</strong>l cal<strong>en</strong>dario y los horarios <strong>de</strong>ntro <strong>de</strong> Kontact.Permite manejar tareas y ev<strong>en</strong>tos, establecer alarmas, exportar a web o a otrasmáquinas, establecer horarios para grupos <strong>de</strong> personas y muchas otras activida<strong>de</strong>s. Actualm<strong>en</strong>teacepta los dos formatos dominantes para almac<strong>en</strong>ami<strong>en</strong>tos e intercambio <strong>de</strong>información <strong>de</strong> cal<strong>en</strong>darios, vCal<strong>en</strong>dar e iCal<strong>en</strong>dar. En la figura 5.11 se muestra la v<strong>en</strong>tanainicial <strong>de</strong> KOrganizer, resaltando difer<strong>en</strong>tes secciones. En la sección 1 se muestraun cal<strong>en</strong>dario <strong>en</strong> el cual po<strong>de</strong>mos escoger que día es el que queremos revisar. En lasección 2 se muestran los <strong>de</strong>talles <strong>de</strong> un ev<strong>en</strong>to que hemos seleccionado. En la sección3 po<strong>de</strong>mos seleccionar cuáles son los cal<strong>en</strong>darios que <strong>de</strong>seamos ver. Finalm<strong>en</strong>te <strong>en</strong> 4 semuestra una vista para po<strong>de</strong>r revisar ev<strong>en</strong>tos <strong>de</strong> distintas formas. Veamos ahora cómohacer algunas <strong>de</strong> las tareas más comunes <strong>de</strong>ntro <strong>de</strong> KOrganizer.Figura 5.11KOrganizer vacíoEv<strong>en</strong>tos, tareas p<strong>en</strong>di<strong>en</strong>tes y el diarioD<strong>en</strong>tro <strong>de</strong> Kontact un ev<strong>en</strong>to es una actividad <strong>de</strong> la que se quiere llevar un registro.Si solam<strong>en</strong>te quieres recordar algo que ti<strong>en</strong>es que hacer, pero dicha actividad no ti<strong>en</strong>e


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 113asociada una fecha o un ev<strong>en</strong>to o alguna repetición, <strong>en</strong>tonces es un p<strong>en</strong>di<strong>en</strong>te. Un ev<strong>en</strong>to<strong>en</strong>tonces es algo como un cumpleaños, una cita <strong>de</strong> negocios o alguna celebración. Éstaspue<strong>de</strong>n repetirse una o varias veces y con base a distintas reglas. A<strong>de</strong>más <strong>de</strong> ev<strong>en</strong>tosy tareas p<strong>en</strong>di<strong>en</strong>tes, también pue<strong>de</strong>s asociar un texto a cada uno <strong>de</strong> los días; para esoutilizas el compon<strong>en</strong>te Diario. Veamos ahora cómo pue<strong>de</strong>s agregar un ev<strong>en</strong>to.Agregando un ev<strong>en</strong>toPara agregar un ev<strong>en</strong>to es necesario seguir los sigui<strong>en</strong>tes pasos:1. Seleccionar Nuevo ev<strong>en</strong>to <strong>de</strong>ntro <strong>de</strong>l m<strong>en</strong>ú Acciones o hacer doble click <strong>en</strong> el díay hora <strong>de</strong>seados. Aparecerá una v<strong>en</strong>tana como la que se muestra <strong>en</strong> la figura 5.12.2. Seleccionar un título y un lugar para el ev<strong>en</strong>to.3. Seleccionar la hora <strong>de</strong> inicio y final <strong>de</strong>l ev<strong>en</strong>to.4. Opcionalm<strong>en</strong>te, seleccionar la casilla Recordatorio para que cuando falte ciertotiempo KOrganizer te recuer<strong>de</strong> acerca <strong>de</strong>l ev<strong>en</strong>to.Figura 5.12Creando una nuevo ev<strong>en</strong>toA<strong>de</strong>más <strong>de</strong> la pestaña G<strong>en</strong>eral ti<strong>en</strong>es otras pestañas que permit<strong>en</strong> hacer ajustes alos ev<strong>en</strong>tos que creas.


114 InternetRepeticiónEn esta parte es posible especificar cuáles son las reglas mediante las cuales se<strong>de</strong>be repetir esta tarea. Aquí exist<strong>en</strong> varias opciones. Lo primero es establecer cadacuánto quieres que se repita el ev<strong>en</strong>to. Esto pue<strong>de</strong> ser cada cierto número <strong>de</strong> días ocada semana, mes o año. El sigui<strong>en</strong>te paso es especificar un rango <strong>de</strong> fechas <strong>en</strong>tre lascuales <strong>de</strong>be llevarse a cabo la repetición. Finalm<strong>en</strong>te pue<strong>de</strong>s agregar ciertos días quesean excepciones a la regla. En la figura 5.13 pue<strong>de</strong>s ver un ev<strong>en</strong>to que se repetirá cadados semanas, los días lunes, jueves y sábado. Se repetirá ocho veces, con excepción <strong>de</strong>lsábado 2 <strong>de</strong> diciembre.Figura 5.13Ajustando la repetición <strong>de</strong> un ev<strong>en</strong>toDestinatariosEn esta pestaña po<strong>de</strong>mos crear una lista <strong>de</strong> personas que van a asistir a dicha reunión.Po<strong>de</strong>mos indicar cuál es el rol que van a <strong>de</strong>sempeñar y cual es su estado actual.Como se muestra <strong>en</strong> la figura 5.14 se pue<strong>de</strong>n agregar las direcciones directam<strong>en</strong>te conel teclado, o po<strong>de</strong>mos utilizar algunos <strong>de</strong> los contactos almac<strong>en</strong>ados <strong>en</strong> KAddressBook.KOrganizer se <strong>en</strong>cargará <strong>de</strong> notificarles (mediante correo o una aplicación groupware) 4que han sido invitados a dicho ev<strong>en</strong>to y pue<strong>de</strong> a<strong>de</strong>más pedir que confirm<strong>en</strong> su asist<strong>en</strong>ciaal mismo.4 La forma <strong>en</strong> la que <strong>de</strong>seas que se notifique a un <strong>de</strong>stinatario pue<strong>de</strong>s seleccionarla <strong>en</strong> la configuración<strong>de</strong> KOrganizer


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 115Figura 5.14Agregando participantes <strong>en</strong> un ev<strong>en</strong>toLibre/OcupadoAdjuntosVistasPara saber si pue<strong>de</strong>s o no invitar a algui<strong>en</strong> al ev<strong>en</strong>to es necesario saber si estándisponibles <strong>en</strong> esa fecha a esa hora. Si los invitados publican esa información, pue<strong>de</strong>srevisar sus horarios <strong>en</strong> esta pestaña. En la figura 5.15 sección 1 pue<strong>de</strong>s revisar cadauno <strong>de</strong> los invitados a la reunión, puesto que aparece una línea por cada uno <strong>de</strong> losparticipantes. En la sección 2 se muestra una gráfica <strong>en</strong> cada línea que indica el horario<strong>de</strong> un participante. Con base <strong>en</strong> esta información pue<strong>de</strong>s ajustar el horario <strong>de</strong> la reunióno si presionas Zoom hasta ajustar pue<strong>de</strong>s permitirle a KOrganizer hacerlo por ti.En esta pestaña se pue<strong>de</strong>n colocar archivos adjuntos a la reunión para que esténdisponibles para consulta por parte <strong>de</strong> los participantes. Es necesario colocar el URI<strong>de</strong>l archivo, para que sólo eso se <strong>en</strong>víe; no se <strong>en</strong>vía el archivo completo.KOrganizer pue<strong>de</strong> pres<strong>en</strong>tar la información <strong>de</strong> difer<strong>en</strong>tes formas, restringi<strong>en</strong>do quées lo que se <strong>de</strong>sea ver. La v<strong>en</strong>tana principal está dividida <strong>en</strong> dos secciones. En la sección<strong>de</strong> la izquierda se muestran los compon<strong>en</strong>tes para navegar las fechas, ver p<strong>en</strong>di<strong>en</strong>tes y


116 Internetver elem<strong>en</strong>tos; <strong>en</strong> la parte <strong>de</strong>recha <strong>de</strong> la v<strong>en</strong>tana se muestra la vista seleccionada. Entrelos distintos tipos <strong>de</strong> vistas que pres<strong>en</strong>ta KOrganizer se <strong>en</strong>cu<strong>en</strong>tran los sigui<strong>en</strong>tes:Figura 5.15Ajustando la hora <strong>de</strong> la reunión¿Qué es lo sigui<strong>en</strong>te? Despliega ev<strong>en</strong>tos y p<strong>en</strong>di<strong>en</strong>tes <strong>de</strong> una forma que facilita la lectura.Se muestra <strong>en</strong> la figura 5.16.Figura 5.16Vista ¿Qué es lo sigui<strong>en</strong>te?


5.14 Kontact, una suite <strong>de</strong> productividad <strong>en</strong> KDE 117Lista. Muestra todos los p<strong>en</strong>di<strong>en</strong>tes y ev<strong>en</strong>tos <strong>en</strong> una lista. Se muestra <strong>en</strong> la figura 5.17.Figura 5.17Vista ListaDía. Muestra un día, pres<strong>en</strong>tando las activida<strong>de</strong>s que hay que realizar sólo durante esedía. Se muestra <strong>en</strong> la figura 5.18.Figura 5.18Vista Día


118 InternetFigura 5.19Semana laboral. Similar a la vista <strong>de</strong> día, pero muestra una semana <strong>de</strong> lunes a viernes.Se muestra <strong>en</strong> la figura 5.19.Vista Semana laboralSemana. Igual que semana laboral, pero muestra todos los días <strong>de</strong> la semana. Se muestra<strong>en</strong> la figura 5.20.Figura 5.20Vista Semana


5.15 Emacs 119Figura 5.21Tres días sigui<strong>en</strong>tes. Muestra las activida<strong>de</strong>s <strong>de</strong> los sigui<strong>en</strong>tes días. Por omisión muestralos sigui<strong>en</strong>tes tres, pero eso pue<strong>de</strong> modificarse <strong>en</strong> el elem<strong>en</strong>to Configurar cal<strong>en</strong>dario<strong>de</strong>ntro <strong>de</strong>l m<strong>en</strong>ú Prefer<strong>en</strong>cias. Se muestra <strong>en</strong> la figura 5.21.Vista Tres días sigui<strong>en</strong>tesMes. Muestra todas las activida<strong>de</strong>s para el mes actual. Se muestra <strong>en</strong> la figura 5.22.Agregando una <strong>en</strong>trada al diarioSi seleccionas el compon<strong>en</strong>te diario, Kontact te pres<strong>en</strong>tará la vista correspondi<strong>en</strong>te<strong>en</strong> la que pue<strong>de</strong>s agregar una nueva <strong>en</strong>trada o editar alguna ya exist<strong>en</strong>te. Esta vista semuestra <strong>en</strong> la figura 5.23.5.15. EmacsEn esta sección te mostraremos como pue<strong>de</strong>s realizar la mayoría <strong>de</strong> las activida<strong>de</strong>smostradas con anterioridad <strong>en</strong> este capítulo, como por ejemplo, leer y contestar correoelectrónico, manejar tus contactos, etc.La mayoría <strong>de</strong> los programas que pres<strong>en</strong>taremos no son parte estándar <strong>de</strong> Emacs,por lo que <strong>de</strong>bes instalarlos por separado. Muchos <strong>de</strong> éstos se conoc<strong>en</strong> como subsistemas<strong>de</strong> Emacs.


120 InternetFigura 5.22Vista MesFigura 5.23El diario <strong>de</strong>ntro <strong>de</strong> Kontact


5.15 Emacs 1215.15.1. VM5.1 Rmail y GnusA<strong>de</strong>más <strong>de</strong> VM, Emacs cu<strong>en</strong>ta con varios subsistemas más para leer y <strong>en</strong>viar correoelectrónico. Los más importantes son Rmail y Gnus. El primero, Rmail, es un lector <strong>de</strong>correo muy s<strong>en</strong>cillo, mi<strong>en</strong>tras que el segundo, Gnus, nació como un lector <strong>de</strong> noticias(USENET) al que le agregaron opciones <strong>de</strong> correo.Gnus es un sistema tan gran<strong>de</strong> y completo como VM y una excel<strong>en</strong>te alternativa. Desafortunadam<strong>en</strong>teha caído un poco <strong>en</strong> <strong>de</strong>suso, por lo que no lo revisaremos.$ smartinstall vmVM (siglas <strong>de</strong> View Mail, <strong>en</strong> inglés) es un subsistema <strong>de</strong> Emacs que te permitemanejar tu correo electrónico <strong>de</strong>s<strong>de</strong> Emacs. Como la mayoría <strong>de</strong> los lectores <strong>de</strong> correo,VM te permite leer correos, contestarlos, re<strong>en</strong>viarlos y otras acciones más. Sin embargo,también ti<strong>en</strong>e algunas funciones avanzadas como creación <strong>de</strong> resúm<strong>en</strong>es (digest), elre<strong>en</strong>vío <strong>de</strong> m<strong>en</strong>sajes y la organización <strong>de</strong> los mismos <strong>de</strong> acuerdo a ciertos criterios.Para iniciar VM basta que teclees el comando M-x vm y aunque esto funcionará yte mostrará la cara <strong>de</strong> VM, no te lo recom<strong>en</strong>damos hasta concluir la sigui<strong>en</strong>te sección,don<strong>de</strong> te <strong>en</strong>señaremos a configurar VM para leer tu correo.Iniciando con VMVM es probablem<strong>en</strong>te uno <strong>de</strong> los subsistemas más gran<strong>de</strong>s que cubriremos <strong>en</strong> estelibro – probablem<strong>en</strong>te con la excepción <strong>de</strong> AUCTEX <strong>en</strong> la sección 6.12 – tanto así quepor la cantidad <strong>de</strong> variables que pue<strong>de</strong>s modificar, VM utiliza un archivo <strong>de</strong> configuracióndistinto <strong>de</strong>l ∼/.emacs, que se llama ∼/.vm.Después <strong>de</strong> ejecutar vm, si hay m<strong>en</strong>sajes <strong>en</strong> tu ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada VM seleccionael primero <strong>de</strong> los m<strong>en</strong>sajes no leídos y te muestra una vista previa. Estas vistas previasson la manera <strong>de</strong> VM <strong>de</strong> mostrarte parte <strong>de</strong>l m<strong>en</strong>saje y permitirte <strong>de</strong>cidir si quieres verlocompleto o no. Si <strong>de</strong>seas verlo completo, con Space (vm-scroll-forward) pue<strong>de</strong>shacerlo. Nota que este comando hace dos cosas distintas, primero te muestra el inicio<strong>de</strong>l m<strong>en</strong>saje y, si éste es más largo que la v<strong>en</strong>tana actual, ejecuciones subsecu<strong>en</strong>tes <strong>de</strong>lcomando (tecla Space ) paginan el cont<strong>en</strong>ido <strong>de</strong>l m<strong>en</strong>saje.Si no <strong>de</strong>seas ver el m<strong>en</strong>saje que VM muestra, con n (vm-next-message) pue<strong>de</strong>scambiarte al sigui<strong>en</strong>te m<strong>en</strong>saje, si es que hay otro.Pue<strong>de</strong>s guardar el m<strong>en</strong>saje que estás vi<strong>en</strong>do con s (vm-save-message) o borrarlotecleando d (vm-<strong>de</strong>lete-message); sin embargo, el m<strong>en</strong>saje no se borra inmediatam<strong>en</strong>te,sino que VM pone una marca <strong>en</strong> él para borrarlo más tar<strong>de</strong>. Esto es importante,


122 Internetporque si te arrepi<strong>en</strong>tes acerca <strong>de</strong> borrar el m<strong>en</strong>saje, pue<strong>de</strong>s seleccionarlo y presionaru (vm-un<strong>de</strong>lete-message) y rescatas el m<strong>en</strong>saje.La acción <strong>de</strong> eliminar para siempre los m<strong>en</strong>sajes borrados se conoce como expulsióny se logra tecleando # # # (vm-expunge-fol<strong>de</strong>r).Pue<strong>de</strong>s utilizar h (vm-summarize) para que VM te muestre una v<strong>en</strong>tana con unresum<strong>en</strong> <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong> la carpeta actual. En esta lista aparec<strong>en</strong> los m<strong>en</strong>sajes pres<strong>en</strong>tadospor número <strong>de</strong> m<strong>en</strong>saje, con el autor, fecha, tamaño (<strong>en</strong> líneas y bytes) y el asunto<strong>de</strong>l m<strong>en</strong>saje. A<strong>de</strong>más, a la izquierda <strong>de</strong> cada resum<strong>en</strong>, aparec<strong>en</strong> una serie <strong>de</strong> letras quete indican, <strong>en</strong>tre otros, si el m<strong>en</strong>saje es nuevo, no leído o marcado para ser borrado.Una vez que terminas <strong>de</strong> leer y manejar tu correo, <strong>de</strong>bes guardar la carpeta actualpara que la próxima vez que <strong>en</strong>tres a VM, éste sepa cuáles ya fueron leídos, cuáles yacontestaste, etc. La tecla S (vm-save-fol<strong>de</strong>r) salva la carpeta. Pue<strong>de</strong>s optar por terminarla visita <strong>de</strong> esta carpeta con q (vm-quit), que salva la carpeta antes <strong>de</strong> terminar surevisión.En cualquier mom<strong>en</strong>to durante tu sesión <strong>de</strong> VM pue<strong>de</strong>s utilizar el comando g (vmget-new-mail)para revisar si arribaron nuevos m<strong>en</strong>sajes para esta carpeta. Si hay nuevosm<strong>en</strong>sajes, este comando los moverá <strong>de</strong> la ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada (<strong>en</strong> inglés spool) a lacarpeta actual.Tu carpeta <strong>de</strong> correo basePor omisión VM int<strong>en</strong>tará asociar tu buzón local con tu carpeta <strong>de</strong> correo base, porlo que si este comportami<strong>en</strong>to no es a<strong>de</strong>cuado, y <strong>en</strong> la mayoría <strong>de</strong> los casos no lo será,<strong>de</strong>bes indicarle dón<strong>de</strong> vive tu correo. Por ejemplo, nuestro viejo amigo Juan Pérez ti<strong>en</strong>elo sigui<strong>en</strong>te <strong>en</strong> su ∼/.vm para indicarle a VM <strong>de</strong> dón<strong>de</strong> <strong>de</strong>be obt<strong>en</strong>er el correo nuevo:1 ( setq vm−spool−f i l e s2 ’ ( ( " ~ / INBOX"3 " imap−s 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 :4 inbox : l o g i n : Juan . Perez : ∗ "5 " ~ / INBOX .CRASH" ) )6 )Como pue<strong>de</strong>s apreciar, la variable vm-spool-files recibe una lista <strong>de</strong> listas. Esto significavarias cosas. Primero, que VM pue<strong>de</strong> manejar varias ban<strong>de</strong>jas <strong>de</strong> correo electrónicodistintas, sin importar si éstas son ban<strong>de</strong>jas locales o remotas. Segundo y m<strong>en</strong>os obvio,que pue<strong>de</strong>s asociar <strong>en</strong> una misma carpeta correo prov<strong>en</strong>i<strong>en</strong>te <strong>de</strong> diversas fu<strong>en</strong>tes. Lasintaxis para especificar cada una <strong>de</strong> las fu<strong>en</strong>tes <strong>de</strong> correo, es <strong>de</strong>cir cada una <strong>de</strong> las listasinternas <strong>de</strong> esta variable, es utilizar tres ca<strong>de</strong>nas que repres<strong>en</strong>t<strong>en</strong>, <strong>en</strong> este or<strong>de</strong>n, unacarpeta, una ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada <strong>de</strong> correo y una carpeta <strong>de</strong> recuperación.VM ti<strong>en</strong>e por omisión una carpeta <strong>de</strong> <strong>en</strong>trada para correo llamada ∼/INBOX y,como pue<strong>de</strong>s ver <strong>en</strong> el ejemplo arriba (línea 2), es la carpeta que utilizó Juan paraconfigurar su correo. La carpeta <strong>de</strong> recuperación (<strong>en</strong> este caso el valor por omisión


5.15 Emacs 123es ∼/INBOX.CRASH) la utiliza VM para almac<strong>en</strong>ar inicialm<strong>en</strong>te todos los m<strong>en</strong>sajesextraídos <strong>de</strong> la ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada <strong>de</strong> correo; <strong>de</strong>spués procesa todos los m<strong>en</strong>sajesalmac<strong>en</strong>ados <strong>en</strong> la carpeta <strong>de</strong> recuperación y los mueve a la carpeta <strong>de</strong> <strong>en</strong>trada.Gracias a esto último, VM ofrece un excel<strong>en</strong>te soporte para errores, ya que si algosale mal durante el proceso <strong>de</strong> tu correo o se interrumpe la ejecución <strong>de</strong> Emacs porcualquier motivo, tu correo no se pier<strong>de</strong> y cuando ejecutes VM nuevam<strong>en</strong>te, éste buscará<strong>en</strong> la ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada y la carpeta <strong>de</strong> recuperación, y procesará los m<strong>en</strong>sajesque <strong>en</strong>cu<strong>en</strong>tre y los moverá a tu carpeta <strong>de</strong> inicio.Finalm<strong>en</strong>te, <strong>en</strong> las líneas 3 y 4 <strong>de</strong>l ejemplo <strong>de</strong> configuración arriba 5 , Juan le indicaa VM que para acce<strong>de</strong>r a su correo ti<strong>en</strong>e que utilizar estos parámetros:Protocolo: El protocolo que soporta el servidor <strong>de</strong> correo don<strong>de</strong> Juan ti<strong>en</strong>e su cu<strong>en</strong>taes IMAP y requiere cifrado con SSL. VM a<strong>de</strong>más soporta los protocolos <strong>de</strong> correolocal y POP3.Servidor: El servidor es galadriel.fci<strong>en</strong>cias.unam.mx.Puerto: 993, que es el puerto estándar para IMAP sobre SSL. El puerto usual paraIMAP es 143, para POP3 el 110 y para POP3 sobre SSL el 995.Ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada: La ban<strong>de</strong>ja <strong>de</strong> <strong>en</strong>trada <strong>en</strong> el servidor es inbox.Mecanismo <strong>de</strong> aut<strong>en</strong>ticación: El mecanismo para que Juan se aut<strong>en</strong>tique conel servidor que utiliza <strong>en</strong> este caso es login, pero VM también soporta preauthy cram-md5, que son mecanismos comunes <strong>en</strong> muchos servidores IMAP sobreSSL.Dirección <strong>de</strong> correo: Juan a<strong>de</strong>más le indica a VM que su cu<strong>en</strong>ta <strong>de</strong> correo <strong>en</strong> elservidor ti<strong>en</strong>e el i<strong>de</strong>ntificador Juan.Perez.Contraseña: Finalm<strong>en</strong>te, por razones <strong>de</strong> seguridad, Juan le indica a VM que lacontraseña para acce<strong>de</strong>r al servidor <strong>de</strong>berá solicitarla (utilizando el mini-buffer)cada vez que él quiera acce<strong>de</strong>r a su carpeta <strong>de</strong> inicio.Una vez que VM recibe la contraseña y logra aut<strong>en</strong>ticarse exitosam<strong>en</strong>te con el servidor,almac<strong>en</strong>a la contraseña por el resto <strong>de</strong> la sesión, por lo que Juan solam<strong>en</strong>te<strong>de</strong>be teclear su contraseña una vez durante su sesión actual <strong>de</strong> Emacs.Selección <strong>de</strong> m<strong>en</strong>sajesPara po<strong>de</strong>r leer, borrar o realizar cualquier acción con un m<strong>en</strong>saje, primero <strong>de</strong>besseleccionarlo o, <strong>en</strong> terminología VM, convertirlo <strong>en</strong> el m<strong>en</strong>saje actual. La mayoría <strong>de</strong>los comandos <strong>de</strong> VM surt<strong>en</strong> efecto sobre el m<strong>en</strong>saje actual.5 En realidad estas dos líneas (3 y 4) <strong>de</strong>b<strong>en</strong> aparecer como una sola, pero la dividimos <strong>en</strong> dos porrazones <strong>de</strong> legibilidad.


124 InternetTabla 5.5Estos son los principales comandos para seleccionar m<strong>en</strong>sajes <strong>en</strong> VM:Emacs: comandos <strong>de</strong> selección <strong>de</strong> VMEnlac<strong>en</strong>pEnterTabN ( P )M-n ( M-p )M-sComando/Descripción(vm-next-message) se mueve hacia a<strong>de</strong>lante <strong>en</strong> la carpetaactual. Salta m<strong>en</strong>sajes marcados como borrados.(vm-prev-message) se mueve hacia atrás <strong>en</strong> la carpeta actual.Salta m<strong>en</strong>sajes marcados como borrados.(vm-goto-message) te pedirá un número <strong>de</strong> m<strong>en</strong>saje, N, ysaltará a ese m<strong>en</strong>saje.(vm-goto-message-last-se<strong>en</strong>) te llevará al último m<strong>en</strong>sajerevisado.(vm-{next|prev}-message-no-skip) selecciona el m<strong>en</strong>sajesigui<strong>en</strong>te (anterior), sin importar si está marcado como leídoo no.(vm-{next(prev)}-unread-message) se mueve hacia a<strong>de</strong>lante(atrás) hasta <strong>en</strong>contrar el sigui<strong>en</strong>te (anterior) m<strong>en</strong>saj<strong>en</strong>o leído.(vm-isearch-forward) funciona como la búsqueda increm<strong>en</strong>tal<strong>de</strong> Emacs, excepto que cuando termina la búsquedaVM te muestra el m<strong>en</strong>saje <strong>en</strong> el que terminó el punto.Si <strong>de</strong>seas que los comandos básicos n y p se salt<strong>en</strong> también los m<strong>en</strong>sajes leídos,<strong>de</strong>bes asignar t a la variable vm-skip-read-messages; y si a<strong>de</strong>más <strong>de</strong>seas que losm<strong>en</strong>sajes <strong>en</strong> la carpeta VM los recorra como <strong>en</strong> una lista circular, es <strong>de</strong>cir que al llegaral último y seleccionar el sigui<strong>en</strong>te (con n ), VM te lleve al primer m<strong>en</strong>saje, también<strong>de</strong>bes asignar t a la variable vm-circular-fol<strong>de</strong>rs.Una vez seleccionado un m<strong>en</strong>saje VM te lo mostrará. Como ya m<strong>en</strong>cionamos anteriorm<strong>en</strong>te,esto es un trabajo <strong>de</strong> dos pasos: vista previa y m<strong>en</strong>saje completo.La vista previa te muestra una pequeña parte <strong>de</strong>l m<strong>en</strong>saje para que puedas <strong>de</strong>cidirsi quieres o no verlo completo. Con Space acce<strong>de</strong>s al m<strong>en</strong>saje completo y pue<strong>de</strong>spaginarlo.Soporte <strong>en</strong> VM para MIMEVM ti<strong>en</strong>e soporte para los dos mecanismos <strong>de</strong> codificación MIME (MultipurposeInternet Mail Ext<strong>en</strong>sions) que son Quoted-Printable y BASE64. En g<strong>en</strong>eral, MIME


5.15 Emacs 125asegura que la transmisión <strong>de</strong> los m<strong>en</strong>sajes se realiza sin errores y <strong>de</strong>fine ciertos tipos<strong>de</strong> cont<strong>en</strong>idos válidos.Exist<strong>en</strong> variables <strong>en</strong> VM que te permit<strong>en</strong> controlar si <strong>de</strong>seas o no ver ciertos cont<strong>en</strong>idosMIME. Por ejemplo, vm-auto-displayed-mime-cont<strong>en</strong>t-types, cuyo valor poromisión es ("textimagemultipart") y que incluye algunos <strong>de</strong> los valores comunes param<strong>en</strong>sajes <strong>de</strong> correo codificados con MIME.Enviando m<strong>en</strong>sajesTabla 5.6Cuando <strong>en</strong>vías m<strong>en</strong>sajes <strong>de</strong>s<strong>de</strong> VM utilizas el modo mayor Mail <strong>de</strong> Emacs, másalgunas ext<strong>en</strong>siones con los sigui<strong>en</strong>tes <strong>en</strong>laces:Emacs: comandos para manipular la composición <strong>de</strong> correo <strong>en</strong> VMEnlaceComando/DescripciónC-c C-y (vm-yank-message) copia un m<strong>en</strong>saje <strong>de</strong> la carpeta padre albuffer <strong>de</strong> composición. Lee el número <strong>de</strong> m<strong>en</strong>saje <strong>de</strong>seado <strong>de</strong>lmini-buffer. Por omisión, a cada línea <strong>de</strong>l m<strong>en</strong>saje copiado sele agrega el valor <strong>de</strong> la variable vm-inclu<strong>de</strong>d-text-prefix, cuyovalor por omisión es " > ".C-c C-a (vm-mime-attach-file) anexa un archivo a la composición.Cuando <strong>en</strong>víes el m<strong>en</strong>saje, VM insertará el archivo y lo codificaráutilizando MIME.C-c C-m (vm-mime-attach-message) anexa un m<strong>en</strong>saje <strong>de</strong> correo a lacomposición. Te preguntará el número <strong>de</strong>l m<strong>en</strong>saje que anexaráy cuando <strong>en</strong>víes tu correo, VM añadirá el m<strong>en</strong>saje como undigerido MIME.C-c C-b (vm-mime-attach-buffer) aña<strong>de</strong> un buffer <strong>de</strong> Emacs a la composición.C-c C-e (vm-mime-<strong>en</strong>co<strong>de</strong>-composition) codifica el m<strong>en</strong>saje elaboradoutilizando MIME, pero no lo <strong>en</strong>vía. Esto es útil si quieresfirmar el m<strong>en</strong>saje con PGP antes <strong>de</strong> <strong>en</strong>viarlo. Después <strong>de</strong> estopue<strong>de</strong>s <strong>en</strong>viar el m<strong>en</strong>saje con C-c C-c .C-c C-p (vm-preview-composition) Te muestra una vista previa <strong>de</strong>lm<strong>en</strong>saje actual <strong>en</strong> elaboración. En la vista previa todos los comandostípicos <strong>de</strong> VM están disponibles y con q continúas lacomposición.La forma más simple <strong>de</strong> iniciar un buffer <strong>de</strong> composición es con el comando m


126 InternetTabla 5.7(vm-mail).En caso <strong>de</strong> que el m<strong>en</strong>saje sea rechazado y regresado por cualquier motivo, pue<strong>de</strong>sre<strong>en</strong>viar el m<strong>en</strong>saje utilizando M-r (vm-res<strong>en</strong>d-bounced-message). Este m<strong>en</strong>sajet<strong>en</strong>drá un nuevo <strong>en</strong>cabezado Res<strong>en</strong>t-To don<strong>de</strong> <strong>de</strong>bes poner la dirección correcta <strong>de</strong>lreceptor que fue rechazado.Los comandos más interesantes <strong>de</strong> Mail y que son heredados por VM son:Emacs: comandos <strong>de</strong> MailEnlaceComando/DescripciónC-c C-s (mail-s<strong>en</strong>d) <strong>en</strong>vía el m<strong>en</strong>saje y manti<strong>en</strong>e el buffer<strong>de</strong> composición seleccionado.C-c C-c (mail-s<strong>en</strong>d-and-exit) <strong>en</strong>vía el m<strong>en</strong>saje y seleccionaotro buffer. Este es el comando más común paraconcluir la composición <strong>de</strong> m<strong>en</strong>sajes y <strong>en</strong>viarlos.C-c C-f C-t (mail-to) mueve el punto al <strong>en</strong>cabezado To, creandouno si no existe.C-c C-f C-s (mail-subject) mueve el punto al <strong>en</strong>cabezado Subject,creando uno si no existe.C-c C-f C-c (mail-cc) mueve el punto al <strong>en</strong>cabezado Cc, creandouno si no existe.Tabla 5.8Iniciar una nueva composición <strong>de</strong> correo es tan usual como contestar a un m<strong>en</strong>sajerecibido y VM hace muy s<strong>en</strong>cillo lograrlo. Cuando contestas un m<strong>en</strong>saje <strong>de</strong>s<strong>de</strong>VM, éste se <strong>en</strong>carga <strong>de</strong> ll<strong>en</strong>ar los <strong>en</strong>cabezados <strong>de</strong> <strong>de</strong>stinatario (To) y asunto (Subject),anexando Re: al asunto <strong>de</strong>l m<strong>en</strong>saje, que es la forma estándar <strong>de</strong> indicar que es unarespuesta.VM también pue<strong>de</strong> ayudarte a citar material <strong>de</strong>l m<strong>en</strong>saje al que contestas y lo i<strong>de</strong>ntificaanexando el valor <strong>de</strong> la variable vm-inclu<strong>de</strong>d-text-prefix.Los comandos para contestar son:Emacs: comandos para contestar correo <strong>en</strong> VMEnlacerRfComando/Descripción(vm-reply) contesta al autor <strong>de</strong>l m<strong>en</strong>saje actual.(vm-reply-inclu<strong>de</strong>-text) contesta al autor <strong>de</strong>l m<strong>en</strong>saje actual y citael cuerpo <strong>de</strong>l m<strong>en</strong>saje.(vm-followup) contesta a todos los receptores <strong>de</strong>l m<strong>en</strong>saje actual.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


5.15 Emacs 127Tabla 5.8 Emacs: comandos para contestar correo <strong>en</strong> VM Continúa <strong>de</strong> la página anteriorEnlaceFComando/Descripción(vm-followup-inclu<strong>de</strong>-text) contesta a todos los receptores <strong>de</strong>lm<strong>en</strong>saje actual y cita el cuerpo <strong>de</strong>l m<strong>en</strong>saje.Tabla 5.9VM ofrece a<strong>de</strong>más tres comandos para traspasar o <strong>en</strong>viar m<strong>en</strong>sajes que recibes aotros receptores. Éstos son:Emacs: comandos para a<strong>de</strong>lantar m<strong>en</strong>sajes <strong>de</strong> VMEnlacez@BComando/Descripción(vm-forward-message) este comando te sitúa <strong>en</strong> un buffer <strong>de</strong>composición, similar al comando m , pero el m<strong>en</strong>saje originalaparece <strong>en</strong> el buffer.(vm-s<strong>en</strong>d-digest) funciona como z , excepto que todos los m<strong>en</strong>sajes<strong>en</strong> el fol<strong>de</strong>r actual se concat<strong>en</strong>an <strong>en</strong> un digerido y puestos<strong>en</strong> el cuerpo <strong>de</strong>l buffer <strong>de</strong> composición.(vm-res<strong>en</strong>d-message) si <strong>de</strong>seas traspasar un m<strong>en</strong>saje recibido,pero que no aparezca <strong>en</strong>capsulado (que es lo que hace z ) <strong>en</strong>tonces<strong>de</strong>bes utilizar este comando y VM iniciará un buffer <strong>de</strong>composición con una réplica <strong>de</strong>l m<strong>en</strong>saje, pero agregará un <strong>en</strong>cabezadoRes<strong>en</strong>t-To que <strong>de</strong>bes ll<strong>en</strong>ar con la dirección <strong>de</strong>seada.Marcas <strong>de</strong> m<strong>en</strong>sajesLa mayoría <strong>de</strong> los comandos m<strong>en</strong>cionados para <strong>en</strong>viar, contestar y traspasar m<strong>en</strong>sajesrecib<strong>en</strong> argum<strong>en</strong>tos numéricos prefijos (con C-u N, don<strong>de</strong> N es un número) ypue<strong>de</strong>n trabajar sobre m<strong>en</strong>sajes marcados. VM provee marcas <strong>de</strong> propósito g<strong>en</strong>eral quepue<strong>de</strong>n aplicarse a cualquiera o a todos los m<strong>en</strong>sajes <strong>de</strong>ntro <strong>de</strong> un fol<strong>de</strong>r.Para marcar el m<strong>en</strong>saje actual teclea M M (vm-mark-message). Si le pasas unargum<strong>en</strong>to numérico N, marcará también los sigui<strong>en</strong>tes N −1 m<strong>en</strong>sajes sigui<strong>en</strong>tes; conun argum<strong>en</strong>to negativo, los N-1 previos. Un asterisco (*) aparecerá a la <strong>de</strong>recha <strong>de</strong> losnúmeros <strong>de</strong> m<strong>en</strong>saje marcados.Para quitar la marca a un m<strong>en</strong>saje pue<strong>de</strong>s utilizar M U (vm-unmark-message).M m marca todos los m<strong>en</strong>sajes <strong>en</strong> la carpeta actual y M u les quita la marca.


128 InternetConfiguración <strong>de</strong> correo sali<strong>en</strong>teVM int<strong>en</strong>tará <strong>en</strong>viar los m<strong>en</strong>sajes que compones utilizando el método <strong>de</strong>finido porMail <strong>de</strong> Emacs, esto es, por el valor <strong>de</strong> s<strong>en</strong>d-mail-function, el cual por omisión int<strong>en</strong>taráutilizar el programa s<strong>en</strong>dmail local.Dep<strong>en</strong>di<strong>en</strong>do <strong>de</strong> tu servicio y configuración <strong>de</strong> acceso a la red, pue<strong>de</strong> ser que nocu<strong>en</strong>tes con un programa s<strong>en</strong>dmail o con un equipo capaz <strong>de</strong> <strong>en</strong>viar directam<strong>en</strong>tecorreo electrónico. En estos casos es común que tu servicio <strong>de</strong> correo incluya un servidor<strong>de</strong> SMTP, que es el protocolo <strong>de</strong> internet para transmisión <strong>de</strong> m<strong>en</strong>sajes electrónicos.Si es así, te convi<strong>en</strong>e utilizar otro programa para <strong>en</strong>viar m<strong>en</strong>sajes llamado smtpmail yponer algo similar a lo que nuestro amigo Juan puso <strong>en</strong> su ∼/.vm:( setq vm−mail−hea<strong>de</strong>r−from " Juan Perez "s<strong>en</strong>d−mail−f u n c t i o n ’ smtpmail−s<strong>en</strong>d− i tsmtpmail−smtp−server " g a l a d r i e l . f c i e n c i a s . unam .mx"smtpmail−l o c a l −domain " c i e n c i a s . unam .mx"smtpmail−s<strong>en</strong>dto−domain " c i e n c i a s . unam .mx")5.15.2. BBDB$ smartinstall bbdbBBDB es una base <strong>de</strong> datos para manejar contactos <strong>en</strong> Emacs. BBDB vi<strong>en</strong>e <strong>de</strong>Insidious Big Brother Database y ofrece las sigui<strong>en</strong>tes características:Integración con distintos lectores <strong>de</strong> correo:• Despliega <strong>de</strong> manera s<strong>en</strong>cilla la <strong>en</strong>trada correspondi<strong>en</strong>te al remit<strong>en</strong>te <strong>de</strong>lm<strong>en</strong>saje actual.• Permite la creación automática <strong>de</strong> <strong>en</strong>tradas basado <strong>en</strong> el cont<strong>en</strong>ido <strong>de</strong>l m<strong>en</strong>sajeactual.• Permite agregar <strong>de</strong> manera automática datos a campos <strong>de</strong> la <strong>en</strong>trada quecorrespon<strong>de</strong> al remit<strong>en</strong>te <strong>de</strong>l m<strong>en</strong>saje.Muestra una lista <strong>de</strong> registros que casan con una expresión regular.Para activar BBDB <strong>de</strong>bes poner lo sigui<strong>en</strong>te <strong>en</strong> tu ∼/.emacs:( r e q u i r e ’ bbdb )( bbdb− i n i t i a l i z e )Con lo anterior t<strong>en</strong>drás una base funcional que te permite realizar búsquedas y manipularregistros. Sin embargo, no está asociada con ninguno <strong>de</strong> los lectores <strong>de</strong> correo.Para utilizarlo con VM (ver la Sección 5.15.1) y po<strong>de</strong>r <strong>en</strong>viar m<strong>en</strong>sajes aprovechado tubase <strong>de</strong> contactos, <strong>de</strong>bes utilizar algo como esto:( r e q u i r e ’ bbdb )( bbdb− i n i t i a l i z e ’vm)A<strong>de</strong>más, para utilizarlo <strong>de</strong>s<strong>de</strong> VM <strong>de</strong>bes agregar lo sigui<strong>en</strong>te a tu ∼/.vm.


5.15 Emacs 129( bbdb−i n s i n u a t e −vm)Esta línea agrega <strong>en</strong>laces <strong>de</strong> teclas a VM y lo configura para que le notifique aBBDB cuando se cargu<strong>en</strong> nuevos m<strong>en</strong>sajes. También agrega el <strong>en</strong>lace M–TAB al modoMail con el cuál pue<strong>de</strong>s completar direcciones que sal<strong>en</strong> <strong>de</strong> tu base <strong>de</strong> contactos <strong>en</strong>BBDB.Utilizando BBDBTabla 5.10Ahora que hemos instalado y activado BBDB, po<strong>de</strong>mos utilizarla para agregar, revisaro editar nuestros contactos. Por omisión, el archivo don<strong>de</strong> se guardan los contactosse llama ∼/.bbdb y pue<strong>de</strong>s cambiarlo asignando un nuevo valor a la variable bbdb-file.La base <strong>de</strong> datos <strong>de</strong> BBDB consiste <strong>de</strong> un conjunto <strong>de</strong> registros y cada registrocorrespon<strong>de</strong> a una persona. Cada registro ti<strong>en</strong>e varios campos y estos campos pue<strong>de</strong>nt<strong>en</strong>er distintos tipos; <strong>en</strong> la tabla 5.10 te mostramos los tipos pre<strong>de</strong>finidos.Emacs: tipos válidos para campos BBDBTiponamecompanyAKAnetadressphon<strong>en</strong>otesDescripciónEl nombre <strong>de</strong> la persona, o vacío si correspon<strong>de</strong> a una organización.El nombre <strong>de</strong> la organización <strong>de</strong> la persona.Lista <strong>de</strong> otros nombres o apodos para esta persona.Lista <strong>de</strong> las direcciones electrónicas <strong>de</strong> la persona.Lista <strong>de</strong> direcciones postales (físicas).Lista <strong>de</strong> teléfonos <strong>de</strong> la persona.Com<strong>en</strong>tarios.Cuando ejecutas BBDB con el comando M-x bbdb te pi<strong>de</strong> una expresión regulary te muestra todos los registros que casan con esta expresión. La búsqueda la realizasobre todos los campos <strong>de</strong> la base, aunque pue<strong>de</strong>s realizar búsquedas más limitadasutilizando otros comandos, como bbdb-name para buscar únicam<strong>en</strong>te <strong>en</strong> el campo <strong>de</strong>nombre o bbdb-net para el campo <strong>de</strong> direcciones electrónicas.Una vez que BBDB te muestra algunos registros <strong>de</strong> tu base, estás <strong>en</strong> el modo especial*BBDB* y ti<strong>en</strong>es varios comandos a tu disposición para moverte, editar, agregar oborrar registros.


130 InternetTabla 5.11Emacs: comandos <strong>de</strong> BBDBEnlaceComando/Descripcióne(bbdb-edit-curr<strong>en</strong>t-field) edita el campo <strong>en</strong> la línea actual.; (bbdb-edit-notes) abreviatura para editar el campo <strong>de</strong> com<strong>en</strong>tarios.d C-k (bbdb-<strong>de</strong>lete-curr<strong>en</strong>t-field-or-record) borra el campo <strong>en</strong> la línea actual.Si la línea actual es la primera <strong>de</strong>l registro, BBDB te preguntarási <strong>de</strong>seas borrar el registro completo.C-onpmsrcqa(bbdb-insert-new-field) inserta un nuevo campo <strong>en</strong> el registro actual.(bbdb-next-record) se mueve al sigui<strong>en</strong>te registro.(bbdb-prev-record) se mueve al registro anterior.(bbdb-s<strong>en</strong>d-mail) inicia la composición <strong>de</strong> un m<strong>en</strong>saje <strong>de</strong> correoelectrónico dirigido a la persona.(bbdb-save-db) salva la base actual al disco.(bbdb-refile-record) integra el cont<strong>en</strong>ido <strong>de</strong>l registro actual con otroregistro <strong>en</strong> la base. Esto es útil porque es usual t<strong>en</strong>er varios registroscon información distinta, como, por ejemplo, distintos correos electrónicos<strong>de</strong> la misma persona.(bbdb-create) crea un nuevo registro <strong>en</strong> la base <strong>de</strong> datos con la informaciónque ingresas <strong>en</strong> el mini-buffer.(bbdb-bury-buffer) escon<strong>de</strong> el buffer *BBDB*. Nota que este comandono mata el buffer.(bbdb-add-or-remove-mail-alias) aña<strong>de</strong> un nuevo alias <strong>de</strong> correopara persona.Para crear tu primer registro, ejecuta M-x bbdb-create (o simplem<strong>en</strong>te c <strong>de</strong>ntro<strong>de</strong>l buffer *BBDB*). Inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> ejecutar este comando, BBDB te preguntará,utilizando el mini-buffer para ello, los sigui<strong>en</strong>tes datos: Name, Organization,Net, Address (dirección postal <strong>en</strong> varias líneas), Phone y finalm<strong>en</strong>te Notes. Nota que aexcepción <strong>de</strong> los primeros tres, pue<strong>de</strong>s teclear Enter y BBDB <strong>de</strong>jará <strong>en</strong> blanco (y no<strong>de</strong>splegará) ese campo.En g<strong>en</strong>eral, los comandos que acabamos <strong>de</strong> m<strong>en</strong>cionar <strong>en</strong> la tabla 5.10, no los utilizarásfrecu<strong>en</strong>tem<strong>en</strong>te, porque BBDB ofrece una interfaz más eficaz para manejar tuscontactos. A<strong>de</strong>más, con las líneas que agregamos al ∼/.emacs arriba, la mayoría <strong>de</strong> lasmodificaciones a tu base <strong>de</strong> contactos se realizan <strong>de</strong> manera automática cuando redactasnuevos correos electrónicos o lees correo dirigido a ti.


5.15 Emacs 131De hecho, notarás que cuando <strong>en</strong>tras a VM y seleccionas un correo, <strong>en</strong> el fondo <strong>de</strong>la pantalla BBDB te mostrará el registro <strong>de</strong> tu base <strong>de</strong> contactos con la información<strong>de</strong>l remit<strong>en</strong>te. Si no existe ya un registro para éste, BBDB creará uno por ti. De hecho,los registros <strong>de</strong> la base cu<strong>en</strong>tan con un nuevo campo llamado mail-alias que te permiteasignar nombres especiales, o simplem<strong>en</strong>te alias, a ciertos contactos para <strong>en</strong>viarm<strong>en</strong>sajes.Por ejemplo, si agregamos (con el <strong>en</strong>lace a ) el campo mail-alias al registro <strong>de</strong>Elisa Viso que creamos arriba, po<strong>de</strong>mos teclear mami y <strong>de</strong>spués, durante la edición <strong>de</strong>un m<strong>en</strong>saje electrónico, pue<strong>de</strong>s utilizar el alias <strong>en</strong> el campo To:.5.15.3. w3m$ smartinstallw3m-elEn sus inicios, W3 era el navegador más popular para Emacs, pero era sumam<strong>en</strong>tel<strong>en</strong>to. Por otro lado, w3m era un paginador con capacida<strong>de</strong>s para navegar el web, <strong>de</strong>sarrolladopor Akinori Ito. Así que se <strong>de</strong>sarrolló esta interfaz para utilizar w3m <strong>de</strong>s<strong>de</strong>Emacs y el resultado es un navegador efici<strong>en</strong>te.Para iniciar w3m <strong>de</strong>bes poner la sigui<strong>en</strong>te línea <strong>en</strong> tu ∼/.emacs:( r e q u i r e ’w3m−load )Al igual que VM, w3m prefiere t<strong>en</strong>er su propio archivo <strong>de</strong> configuración, <strong>en</strong> estecaso ∼/.emacs-w3m, que es el valor por omisión <strong>de</strong> la variable w3m-init-file.Uso básico <strong>de</strong> w3mExist<strong>en</strong> tres formas básicas para iniciar w3m, que se muestran <strong>en</strong> la tabla 5.12.Tabla 5.12Emacs: iniciando w3mComandow3mw3m-find-filew3m-browse-urlDescripciónArranca emacs-w3m y <strong>de</strong>spliega la página <strong>de</strong> inicio. Esta páginaestá especificada por la variable w3m-home-page.Te solicitará el nombre <strong>de</strong> un archivo local <strong>en</strong> el mini-buffery lo <strong>de</strong>splegará <strong>en</strong> emacs-w3m.Te solicitará un URL <strong>en</strong> el mini-buffer y lo <strong>de</strong>splegará <strong>en</strong>emacs-w3m. Este comando es usualm<strong>en</strong>te invocado <strong>de</strong>s<strong>de</strong>otros programas.


132 InternetMoverte <strong>en</strong> un buffer <strong>de</strong> emacs-w3m no es difícil, pues la mayoría <strong>de</strong> las teclas <strong>de</strong>Emacs funcionan <strong>de</strong> la misma forma. Por ejemplo, C-n , C-v y C-s (que usualm<strong>en</strong>tesirv<strong>en</strong> para moverte una línea hacia abajo, una página o buscar una palabra) tambiénson operaciones válidas <strong>en</strong> los buffers <strong>de</strong> emacs-w3m.Para seguir una liga utiliza la tecla Enter . Debes mover el punto a la liga, lo cuales s<strong>en</strong>cillo pues las ligas se <strong>de</strong>stacan <strong>de</strong>l texto normal ya sea que estén subrayadas ot<strong>en</strong>gan un color distinto. Aquí está una lista <strong>de</strong> <strong>en</strong>laces para navegar <strong>de</strong>ntro <strong>de</strong> un bufferemacs-w3m:Tabla 5.13Emacs: sigui<strong>en</strong>do ligas con w3mEnlaceEntergGcuRComando/Descripción(w3m-view-this-url) <strong>de</strong>spliega la página señalada con el punto. Elcomportami<strong>en</strong>to exacto <strong>de</strong> este comando <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong> las propieda<strong>de</strong>s<strong>de</strong> la liga <strong>en</strong> cuestión.(w3m-goto-url) te solicitará un URL <strong>en</strong> el mini-buffer y hará queemacs-w3m <strong>de</strong>spliegue la página.(w3m-goto-url-new-session) te solicitará un URL <strong>en</strong> el mini-buffery <strong>de</strong>splegará la página <strong>en</strong> una nueva sesión.(w3m-print-curr<strong>en</strong>t-url)<strong>de</strong>spliega el URL <strong>de</strong> la página mostrada <strong>en</strong>el área <strong>de</strong> eco y la pone <strong>en</strong> el anillo <strong>de</strong> la muerte.(w3m-print-this-url) <strong>de</strong>spliega, <strong>en</strong> el área <strong>de</strong> eco, la página objetivo<strong>de</strong>l URL marcado con el punto.(w3m-reload-this-page) vuelve a cargar la página. Esto es particularm<strong>en</strong>teútil si estás ley<strong>en</strong>do las noticias o el diario <strong>de</strong> una persona,que pudieron ser actualizados <strong>de</strong>s<strong>de</strong> el mom<strong>en</strong>to <strong>en</strong> que fue cargadala página.Probablem<strong>en</strong>te la posibilidad <strong>de</strong> moverte <strong>de</strong>ntro <strong>de</strong> una página, como lo pue<strong>de</strong>shacer <strong>en</strong> cualquier buffer <strong>de</strong> Emacs, te ti<strong>en</strong>e fascinado. Y, aunque no lo creas, aún haymás y resulta que emacs-w3m agrega una gran cantidad <strong>de</strong> <strong>en</strong>laces para lograr qu<strong>en</strong>avegues a velocida<strong>de</strong>s nunca antes vistas.Las teclas fueron seleccionadas <strong>de</strong> manera tal que avanzar la página se logra consecu<strong>en</strong>cias muy cortas. Más aún, dado que no pue<strong>de</strong>s escribir <strong>en</strong> cualquier parte <strong>de</strong> unapágina, muchas <strong>de</strong> las teclas no ejecutan más el comando self-insert-command.


5.15 Emacs 133Tabla 5.14Emacs: navegando con w3mEnlaceComando/DescripciónSpace<strong>de</strong>lete(w3m-scroll-up-or-next-url) recorre la página hacia abajo. Si utilizasVM ya <strong>de</strong>bes estar acostumbrado a este comportami<strong>en</strong>to, puesasí funciona la lectura <strong>de</strong> m<strong>en</strong>sajes <strong>en</strong> VM.(w3m-scroll-down-or-previous-url) recorre la página hacia arriba.> (w3m-scroll-left) recorre la página hacia la izquierda.< (w3m-scroll-right) recorre la página hacia la <strong>de</strong>recha./· (w3m-shift-left) se mueve (una posición) hacia la izquierda./, (w3m-shift-right) se mueve (una posición) hacia la <strong>de</strong>recha.M-l(w3m-horizontal-rec<strong>en</strong>ter) recorre la página horizontalm<strong>en</strong>te hastaque la posición actual que<strong>de</strong> <strong>en</strong> el c<strong>en</strong>tro.Tabla 5.15El modo mayor <strong>de</strong> emacs-w3m, w3m-mo<strong>de</strong>, <strong>de</strong>fine a<strong>de</strong>más una serie <strong>de</strong> comandospara moverse <strong>en</strong>tre distintos objetos, tales como ligas, formas o imág<strong>en</strong>es.Emacs: puntos <strong>de</strong> interés <strong>en</strong> la página ala w3mEnlaceComando/DescripciónTabM-Tab(w3m-next-anchor) mueve el punto a la sigui<strong>en</strong>te liga (o ancla,<strong>en</strong> el idioma <strong>de</strong> emacs-w3m).(w3m-previous-anchor) mueve el punto al ancla anterior.] (w3m-next-form) mueve el punto a la sigui<strong>en</strong>te forma.[ (w3m-previous-form) mueve el punto a la forma previa.} (w3m-next-image) mueve el punto a la sigui<strong>en</strong>te imag<strong>en</strong>.{ (w3m-previous-image) mueve el punto a la imag<strong>en</strong> previa.Por ejemplo, si estás vi<strong>en</strong>do la página http://www.google.com, (sí, la <strong>de</strong>l afamadobuscador), pue<strong>de</strong>s realizar los sigui<strong>en</strong>tes pasos: ] , Enter , (teclea lo que sea quequieras buscar <strong>en</strong> google) y finalm<strong>en</strong>te C-c C-c para localizar lo <strong>de</strong>ado.Ahora que ya sabes moverte <strong>de</strong>ntro <strong>de</strong> una página, resta revisar los mecanismos queofrece emacs-w3m para movernos <strong>en</strong>tre páginas. Dado que estas páginas son buffers<strong>de</strong> Emacs, bi<strong>en</strong> podríamos utilizar los mecanismos ya provistos por Emacs, tales comoC-c C-b . Sin embargo, esto sería muy l<strong>en</strong>to; por ello contamos con las sigui<strong>en</strong>tesformas <strong>de</strong> hacerlo:


134 InternetTabla 5.16Emacs: movimi<strong>en</strong>to <strong>en</strong>tre páginas con w3mEnlaceBNH∧SpaceDelComando/Descripción(w3m-view-preview-page) se mueve una página atrás <strong>en</strong> la historia. Conun argum<strong>en</strong>to numérico se mueve hacia atrás N páginas.(w3m-view-previous-page) se mueve hacia a<strong>de</strong>lante una página <strong>en</strong> lahistoria. Por supuesto, esto funciona si utilizaste B(w3m-gohome) se mueve a la página <strong>de</strong> inicio. Pue<strong>de</strong>s cambiar la página<strong>de</strong> inicio cambiando el valor <strong>de</strong> la variable w3m-home-page.(w3m-view-par<strong>en</strong>t-page) int<strong>en</strong>tará moverse al directorio padre <strong>de</strong> lapágina <strong>de</strong>splegada. Por ejemplo, int<strong>en</strong>tará moverse a http://foo/ cuandohttp://foo/bar/ sea la página actual. Esto ti<strong>en</strong>e s<strong>en</strong>tido porque es comúnque busques algo <strong>en</strong> el sitio que no se <strong>en</strong>cu<strong>en</strong>tra ahí, la página ya no existeu otros problemas similares.(w3m-scroll-up-or-next-url) cuando el punto se <strong>en</strong>cu<strong>en</strong>tra al final <strong>de</strong> buffery no pue<strong>de</strong>s avanzar hacia a<strong>de</strong>lante, <strong>en</strong>tonces la tecla Space te llevaráa la sigui<strong>en</strong>te página don<strong>de</strong> la sigui<strong>en</strong>te página es aquélla <strong>de</strong>finida porel <strong>en</strong>cabezado especial next <strong>en</strong> la página actual. Este comando no ti<strong>en</strong>erelación alguna con la historia.Por ejemplo, si continuamos con la búsqueda que realizamos <strong>en</strong> googlearriba, notarás que al llegar al final <strong>de</strong> la primera página <strong>de</strong> resultados yteclear Space , te lleva a la segunda página <strong>de</strong> resultados.(w3m-scroll-down-or-previous-url) cuando el punto se <strong>en</strong>cu<strong>en</strong>tra al inicio<strong>de</strong>l buffer y no pue<strong>de</strong>s moverte hacia arriba, pue<strong>de</strong>s teclear Del yesto te llevará a la página previa. Al igual que Space , esto funciona si lapágina conti<strong>en</strong>e el <strong>en</strong>cabezado especial previous.Regresa a tu vida ordinariaUna vez que inicias este recorrido por los subsistemas <strong>de</strong> Emacs, como emacs-w3m,es fácil per<strong>de</strong>rse y olvidar que existe un mundo fuera <strong>de</strong> Emacs, que ti<strong>en</strong>es una vida,un trabajo, responsabilida<strong>de</strong>s. Probablem<strong>en</strong>te iniciaste tu sesión p<strong>en</strong>sando terminar eseprograma <strong>de</strong> tarea, aquella poesía que completará tu obra maestra o tal vez las formasque te permitirán <strong>de</strong>f<strong>en</strong><strong>de</strong>r mejor a tu cli<strong>en</strong>te <strong>en</strong> corte. Sin embargo, a la mitad <strong>de</strong> tutrabajo, t<strong>en</strong>ías la necesidad <strong>de</strong> buscar información <strong>en</strong> el web y pudiste hacer eso <strong>de</strong>s<strong>de</strong>Emacs: increíble.Sin embargo, es mom<strong>en</strong>to <strong>de</strong> continuar tu trabajo y <strong>de</strong>jar emacs-w3m, para lo cualti<strong>en</strong>es dos opciones. Teclea q si pi<strong>en</strong>sas regresar a emacs-w3m más tar<strong>de</strong> o Q si no


5.15 Emacs 135pi<strong>en</strong>sas regresar <strong>en</strong> un bu<strong>en</strong> rato.La primera opción, q , ejecuta el comando w3m-close-window que escon<strong>de</strong> lav<strong>en</strong>tana <strong>de</strong> emacs-w3m y selecciona otro buffer, mi<strong>en</strong>tras que la segunda, Q , ejecutaw3m-quit, que salva la historia <strong>de</strong> navegación al disco y termina la ejecución <strong>de</strong>emacs-w3m.Imág<strong>en</strong>es y másTabla 5.17Por omisión, emacs-w3m no mostrará las imág<strong>en</strong>es <strong>de</strong> las páginas; sin embargo,la mayoría <strong>de</strong> <strong>en</strong>carnaciones <strong>de</strong> Emacs mo<strong>de</strong>rnas soportan mostrar imág<strong>en</strong>es <strong>en</strong> buffers.Con el comando T pue<strong>de</strong>s cambiar la opción para mostrar o no imág<strong>en</strong>es <strong>en</strong>emacs-w3m.Si <strong>de</strong>seas que emacs-w3m <strong>de</strong>spliegue siempre las imág<strong>en</strong>es, <strong>de</strong>bes asignar t a lavariable w3m-<strong>de</strong>fault-display-inline-images.A<strong>de</strong>más <strong>de</strong> esto, emacs-w3m te permite agrandar o achicar las imág<strong>en</strong>es, guardarlasal disco o verlas con un visor externo. Aquí están los comandos más relevantes:Emacs: manejo <strong>de</strong> imág<strong>en</strong>es <strong>en</strong> w3mEnlace Comando/DescripciónTIM-iM-[M-](w3m-toggle-inline-images) cambia <strong>en</strong>tre mostrar o no imág<strong>en</strong>es <strong>en</strong> losbuffers <strong>de</strong> emacs-w3m.(w3m-view-image) utiliza un visor externo para ver la imag<strong>en</strong> actual.(w3m-save-image) salva la imag<strong>en</strong> actual a un archivo.(w3m-zoom-out-image) agranda la imag<strong>en</strong> actual.(w3m-zoom-in-image) achica la imag<strong>en</strong> actual.FavoritosEmacs-w3m también soporta listas <strong>de</strong> ligas favoritas o bookmarks y, para no variar,te ofrece varias formas <strong>de</strong> indicarle qué ligas quieres conservar y cómo quieres referirtea ellas. Así, t<strong>en</strong>emos las opciones que se listan <strong>en</strong> la tabla 5.18 <strong>de</strong> la sigui<strong>en</strong>te página.Una vez que ti<strong>en</strong>es ligas favoritas almac<strong>en</strong>adas, pue<strong>de</strong>s acce<strong>de</strong>r a ellas con el comandov (w3m-bookmark-view) <strong>de</strong>s<strong>de</strong> cualquier buffer <strong>de</strong> emacs-w3m. Otra posibilida<strong>de</strong>s visitar el URL especial: about://bookmark/. En esta página verás tus ligasfavoritas organizadas por sección.Emacs-w3m ti<strong>en</strong>e muchas más acarácterísticas que, por cuestiones <strong>de</strong> espacio, nopo<strong>de</strong>mos explicar aquí. Por ejemplo pue<strong>de</strong>s interactuar con tu buscador <strong>de</strong> web favoritocon una sola tecla, S (w3m-search) o pue<strong>de</strong>s acumular varios URLs y abrirlos todos


136 InternetTabla 5.18con un solo movimi<strong>en</strong>to. Pero todas estas características las <strong>de</strong>jaremos como ejercicioal lector.Emacs: ligas favoritas <strong>en</strong> w3mEnlaceaM-aComando/Descripción(w3m-bookmark-add-curr<strong>en</strong>t-url) te permite integrar la páginaactual a tu lista <strong>de</strong> favoritos. Si lo llamas con un argum<strong>en</strong>toprefijo, <strong>en</strong>tonces te pedirá el URL a utilizar. A<strong>de</strong>más, utilizará elmini-buffer para preguntarte si quieres editar el título y el URL.(w3m-bookmark-add-this-url) aña<strong>de</strong> el URL marcado con elpunto a los favoritos.5.15.4. ERC5.2 Z<strong>en</strong>IRCZ<strong>en</strong>IRC es otra alternativa popular para acce<strong>de</strong>r a servidores <strong>de</strong> IRC. Al igual queERC, Z<strong>en</strong>IRC no es parte estándar <strong>de</strong> Emacs y pue<strong>de</strong>s <strong>en</strong>contrarlo <strong>en</strong> la direcciónhttp://www.z<strong>en</strong>irc.org/.$ smartinstall ercERC es un cli<strong>en</strong>te <strong>de</strong> IRC 6 para Emacs. ERC es po<strong>de</strong>roso, modular y ext<strong>en</strong>sible.Por omisión ofrece las sigui<strong>en</strong>tes características:Control <strong>de</strong> inundación (<strong>de</strong>tecta y <strong>de</strong>ti<strong>en</strong>e ataques electrónicos).Fechas.Pue<strong>de</strong> conectarte a ciertos canales <strong>de</strong> manera automática.Convierte <strong>en</strong> botones (ligas) a los URLs, nombres <strong>de</strong> usuarios, etc.Rompe líneas muy largas para facilitar su lectura.Completa nombres <strong>de</strong> usuario y comandos.Manti<strong>en</strong>e una historia <strong>de</strong> tus <strong>en</strong>tradas.Te informa <strong>de</strong> activida<strong>de</strong>s <strong>en</strong> el canal utilizando la línea <strong>de</strong> modo.6 IRC son siglas <strong>de</strong>l protocolo <strong>de</strong> Internet Internet Relay Chat (RFC 1459), que especifica una redinternacional para conectarse y charlar <strong>en</strong> tiempo real.


5.15 Emacs 137Utilizando ERCTabla 5.19Una vez instalado ERC, que como ya dijimos no es parte estándar <strong>de</strong> Emacs, <strong>de</strong>besagregar lo sigui<strong>en</strong>te a tu ∼/.emacs:( r e q u i r e ’ erc )( r e q u i r e ’ erc−s p e l l i n g )Y para iniciar el programa <strong>de</strong>bes utilizar el comando M-x erc-select, qui<strong>en</strong> tepreguntará por el nombre <strong>de</strong>l servidor al que <strong>de</strong>be conectarse. Una vez <strong>en</strong> un buffer <strong>de</strong>ERC ti<strong>en</strong>es los sigui<strong>en</strong>tes comandos a tu disposición:Emacs: comandos <strong>de</strong> ERCEnlaceComando/DescripciónC-aEnterTabM-Tab(erc-bol) te lleva al inicio <strong>de</strong> la línea o al final <strong>de</strong>l prompt.(erc-s<strong>en</strong>d-curr<strong>en</strong>t-line) <strong>en</strong>vía la línea actual.(erc-complete-word) si estás <strong>en</strong> un prompt, completa lapalabra actual. En cualquier otro caso, se mueve a la sigui<strong>en</strong>teliga o botón.(ispell-complete-word) completa la palabra actual utilizandoispell.C-c C-b (erc-iswitchb) te pregunta por un buffer <strong>de</strong> ERC al que tequieres cambiar.C-c C-c (erc-toggle-interpret-controls) activa/<strong>de</strong>sactiva el intérprete<strong>de</strong> secu<strong>en</strong>cias como comandos <strong>en</strong> los m<strong>en</strong>sajes.C-c C-d (erc-input-action) <strong>de</strong> manera interactiva, ingresa una acción<strong>de</strong> usuario y la <strong>en</strong>vía al IRC.C-c Tab (erc-invite-only-mo<strong>de</strong>) convierte el canal <strong>en</strong> uno por invitación(+i).C-c C-j (erc-join-channel) te permite ingresar a un canal. Si elpunto está al inicio <strong>de</strong>l nombre <strong>de</strong> un canal, utiliza es<strong>en</strong>ombre.C-c C-n (erc-channel-names) ejecuta /names #channel <strong>en</strong> el canalactual.C-c C-p (erc-part-from-channel) este comando sirve para salir<strong>de</strong>l canal actual.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


138 InternetTabla 5.19 Emacs: comandos <strong>de</strong> ERC Continúa <strong>de</strong> la página anteriorEnlaceComando/DescripciónC-c C-q (erc-quit-server) te <strong>de</strong>sconecta <strong>de</strong>l servidor <strong>de</strong>spués <strong>de</strong>preguntarte la razón.C-c C-t (erc-set-topic) te pregunta el nuevo tema <strong>de</strong>l canal.C-c C-u (erc-kill-input) elimina la línea actual utilizando erc-bolseguido <strong>de</strong> kill-line.MódulosTabla 5.20ERC vi<strong>en</strong>e con una manera poco estándar <strong>de</strong> agregar funcionalidad que involucra lautilización <strong>de</strong> módulos. Hay módulos <strong>de</strong> muchos tipos y para muy diversas funciones;para activarlos <strong>de</strong>bes asignar los <strong>de</strong>seados a la variable erc-modules y a continuaciónejecutar erc-update-modules.Aquí está una lista <strong>de</strong> los módulos disponibles:Emacs: módulos para ext<strong>en</strong><strong>de</strong>r ERCMóduloautoawayautojoinbbdbbuttonfilllogmatchnotifypcompletereadonlyreplaceringDescripciónAsigna el estado <strong>de</strong> aus<strong>en</strong>te (away) <strong>de</strong> manera automática.Te registra a ciertos canales <strong>de</strong> manera automática.Integración con la base <strong>de</strong> contactos BBDB (ver la sección5.15.2).Convierte <strong>en</strong> botones a los URL, nombres y otros textos interesantes.Rompe líneas muy largas.Guarda el cont<strong>en</strong>ido <strong>de</strong> los buffers <strong>en</strong> bitácoras.Resalta amigos, tontos y otras palabras clave.Te avisa cuando cambia el estado <strong>en</strong> línea <strong>de</strong> ciertos usuarios.Completa nombres <strong>de</strong> usuarios y comandos.Convierte las líneas mostradas <strong>en</strong> sólo <strong>de</strong> lectura.Reemplaza texto <strong>en</strong> m<strong>en</strong>sajes.Activa la historia <strong>de</strong> la <strong>en</strong>trada.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


5.15 Emacs 139Tabla 5.20 Emacs: módulos para ext<strong>en</strong><strong>de</strong>r ERC Continúa <strong>de</strong> la página anteriorMóduloscrolltobottomsmileyspellstamptracktruncateunmorseDescripciónMueve la vista al final <strong>de</strong>l buffer.Convierte los emoticones <strong>en</strong> iconos.Revisa tu ortografía.Aña<strong>de</strong> la hora a tus m<strong>en</strong>sajes.Rastrea toda actividad <strong>en</strong> el canal utilizando la línea <strong>de</strong> modo.Trunca el tamaño <strong>de</strong> los buffers a cierto tamaño.Traduce el código morse <strong>en</strong> los m<strong>en</strong>sajes.5.15.5. TRAMPY listo; ahora pue<strong>de</strong>s iniciarte <strong>en</strong> el arte <strong>de</strong> per<strong>de</strong>r el tiempo <strong>en</strong> línea. Hay muchosservidores <strong>de</strong> IRC <strong>en</strong> el mundo; los hay <strong>de</strong> muchos tipos y con todo tipo <strong>de</strong> temas paraconversar. Nosotros te recom<strong>en</strong>damos irc.fre<strong>en</strong>o<strong>de</strong>.net.TRAMP es un paquete para editar archivos remotos <strong>en</strong> Emacs y son siglas <strong>de</strong> lafrase <strong>en</strong> inglés Transpar<strong>en</strong>t Remote (file) Access, Multiple Protocol.TRAMP se distribuye con versiones reci<strong>en</strong>tes <strong>de</strong> Emacs y, una vez cargado, te permitiráel acceso a un sistema <strong>de</strong> archivos remoto para editar archivos, control <strong>de</strong> versionesy dired (ver la sección 3.6.3).El acceso al sistema remoto se pue<strong>de</strong> lograr con distintos programas como rsh,rlogin, telnet o con cualquiera que t<strong>en</strong>ga un método similar <strong>de</strong> acceso. TRAMP soportaconexiones utilizando ssh y es el mecanismo recom<strong>en</strong>dado.Para hacer su trabajo, TRAMP requiere t<strong>en</strong>er acceso al sistema remoto y hacer unacopia local para trabajar. La transfer<strong>en</strong>cia se pue<strong>de</strong> realizar <strong>en</strong> una variedad <strong>de</strong> formas.Los mecanismos más efici<strong>en</strong>tes para transferir archivos gran<strong>de</strong>s son rcp, scp yrsync. Los otros mecanismos requier<strong>en</strong> <strong>de</strong> herrami<strong>en</strong>tas adicionales para codificar ytransferir los archivos <strong>en</strong> línea, tales como mim<strong>en</strong>co<strong>de</strong> o uu<strong>en</strong>co<strong>de</strong>.Para activar TRAMP <strong>de</strong>bes agregar lo sigui<strong>en</strong>te a tu ∼/.emacs:( r e q u i r e ’ tramp )Utilizando TRAMPAunque hasta el mom<strong>en</strong>to todo lo que hemos dicho <strong>de</strong> TRAMP su<strong>en</strong>a complicado,te sorpr<strong>en</strong><strong>de</strong>rá lo s<strong>en</strong>cillo que es utilizarlo. Imagina que <strong>de</strong>seas abrir el archivo UNAR-CHIVO <strong>en</strong> la máquina remota MAQUINA; <strong>en</strong>tonces necesitas visitar el archivo, sí, con


140 Internetel comando C-x C-f (find-file) y le das la sigui<strong>en</strong>te ruta: /MAQUINA:UNARCHIVO.El método <strong>de</strong> acceso por omisión es ssh; si <strong>de</strong>seas cambiarlo <strong>de</strong>bes asignar el nuevovalor a la variable tramp-<strong>de</strong>fault-method, por ejemplo con la línea que aparece acontinuación:( setq tramp−d e f a u l t −method " scp " )Aquí están algunos ejemplos <strong>de</strong> las rutas para distintos archivos <strong>en</strong> sitios remotos:/moria.fci<strong>en</strong>cias.unam.mx:.emacs, para editar tu ∼/.emacs <strong>en</strong> tu directorioraíz <strong>en</strong> la máquina moria.fci<strong>en</strong>cias.unam.mx./moria.fci<strong>en</strong>cias.unam.mx:∼/.emacs, para editar el mismo archivo, ya que ∼se expan<strong>de</strong> a tu directorio raíz./ada.fci<strong>en</strong>cias.unam.mx:/etc/issue, para editar el archivo /etc/issue <strong>en</strong> el servidorada.fci<strong>en</strong>cias.unam.mx.Lo anterior supone que tu nombre <strong>de</strong> usuario <strong>en</strong> la máquina local es idéntico al <strong>de</strong>la remota. Si éste no es el caso, pue<strong>de</strong>s indicarle a TRAMP el nombre <strong>en</strong> el servidorremoto <strong>en</strong> la misma línea: /USUARIO@MAQUINA:MIARCHIVO.También pue<strong>de</strong>s especificar el método <strong>de</strong> conexión para abrir cierto archivo, como<strong>en</strong>: /ssh:juan@galadriel.fci<strong>en</strong>cias.unam.mx:/home/juan/miarchivo.txt, que seconectará utilizando ssh al servidor galadriel.fci<strong>en</strong>cias.unam.mx como el usuariojuan.5.15.6. Diccionario$ smartinstalldictionary-elA<strong>de</strong>más <strong>de</strong> revisar la ortografía <strong>de</strong> tus docum<strong>en</strong>tos (ver la sección 4.3.17), pue<strong>de</strong>srequerir un diccionario. Aquí te mostramos cóímo integrar y utilizar un cli<strong>en</strong>te para unservicio <strong>de</strong> diccionarios <strong>en</strong> línea, conocido como DICT o RFC 2229. Los servidores <strong>de</strong>diccionarios, aunque exist<strong>en</strong> para muchos idiomas, manejan exclusivam<strong>en</strong>te inglés.La ext<strong>en</strong>sión que nos ocupa se llama Dictionary y ofrece una excel<strong>en</strong>te interfaz,amigable y navegable, para acce<strong>de</strong>r a <strong>de</strong>finiciones <strong>de</strong> palabras <strong>en</strong> uno o varios servidores.Sobre todo <strong>en</strong> computación, ¿cuántas veces te <strong>en</strong>cu<strong>en</strong>tras con palabras para las que<strong>de</strong>searías t<strong>en</strong>er un diccionario a mano? Con este cli<strong>en</strong>te y Emacs no ti<strong>en</strong>es un diccionario,sino muchos.Para activar este subsistema <strong>de</strong> Emacs <strong>de</strong>bes agregar lo sigui<strong>en</strong>te a tu ∼/.emacs:( load " d i c t i o n a r y − i n i t " )A<strong>de</strong>más te recom<strong>en</strong>damos agregar también las sigui<strong>en</strong>tes dos líneas que agregan<strong>en</strong>laces <strong>de</strong> teclas para dos <strong>de</strong> los comandos más intersantes <strong>de</strong> dictionary:( global −set−key [ ( c o n t r o l c ) ?s ] ’ d i c t i o n a r y −search )( global −set−key [ ( c o n t r o l c ) ?m] ’ d i c t i o n a r y −match−words )


5.15 Emacs 141Utilizando dictionaryTabla 5.21Pue<strong>de</strong>s ejecutar el comando dictionary o utilizar alguno <strong>de</strong> los <strong>en</strong>laces <strong>de</strong> teclaque <strong>de</strong>finimos arriba, C-c s o C-c m , para acce<strong>de</strong>r al diccionario.. Todos estoscomandos te llevarán a un nuevo buffer, con el modo mayor Dictionary.Este buffer <strong>de</strong> dictionary está dividido <strong>en</strong> dos partes. La primera es la sección <strong>de</strong>botones que te permit<strong>en</strong> navegar las <strong>de</strong>finiciones, buscar nuevam<strong>en</strong>te, seleccionar diccionarioso salir <strong>de</strong>l diccionario. La sigui<strong>en</strong>te es la sección <strong>de</strong> <strong>de</strong>finiciones. Una vez quedictionary localiza una o varias <strong>de</strong>finiciones solicitadas, las muestra <strong>en</strong> esta sección.Notarás que <strong>en</strong> las <strong>de</strong>finiciones aparec<strong>en</strong> palabras resaltadas con otro color. Éstasson refer<strong>en</strong>cias cruzadas y funcionan como hipertexto, es <strong>de</strong>cir, son ligas que pue<strong>de</strong>sseguir y dictionary te llevará a su <strong>de</strong>finición.La forma más usual para interactuar con dictionary es con el comando dictionary-searchque te pi<strong>de</strong> <strong>en</strong> el mini-buffer una palabra a buscar, pero utiliza comopropuesta inicial la palabra más cercana al punto. Por la frecu<strong>en</strong>cia <strong>de</strong> su uso te recom<strong>en</strong>damosasociar este comando al <strong>en</strong>lace C-c s , porque así pue<strong>de</strong>s acce<strong>de</strong>r a élrápidam<strong>en</strong>te.D<strong>en</strong>tro <strong>de</strong>l buffer <strong>de</strong> dictionary ti<strong>en</strong>es a tu disposición los sigui<strong>en</strong>tes comandos:Emacs: comandos <strong>de</strong> dictionaryEnlaceqhsdn o Tabp o Shift - TabmEnterComando/Descripción(dictionary-close) cierra el buffer <strong>de</strong> dictionary.(dictionary-help) <strong>de</strong>spliega la ayuda <strong>en</strong> línea <strong>de</strong> dictionary.(dictionary-search) te pregunta por una nueva palabra parabuscarla <strong>en</strong> los diccionarios.(dictionary-lookup-<strong>de</strong>finition) busca la <strong>de</strong>finición <strong>de</strong> la palabracercana al punto.(dictionary-next-link) posiciona el punto <strong>en</strong> la sigui<strong>en</strong>te liga.(dictionary-prev-link) posiciona el punto <strong>en</strong> la liga anterior.(dictionary-match-words) pregunta por un patrón y lista todaslas palabras que casan con él.Visita la liga.


LAT EX66.1. IntroducciónUna <strong>de</strong> las aplicaciones más importantes <strong>de</strong> la computadora hoy <strong>en</strong> día es la preparación<strong>de</strong> texto, sea éste para notas, una carta, un libro, reporte, artículo, tarea, etc.Un procesador <strong>de</strong> texto es un paquete al que le tecleas texto, con algunas “observaciones”y el paquete proce<strong>de</strong> a formatear el texto. Entre las operaciones que <strong>de</strong>seamoshaga con el texto están las sigui<strong>en</strong>tes:1. Armar los r<strong>en</strong>glones <strong>de</strong> tal manera que que<strong>de</strong> el texto bi<strong>en</strong> repartido.2. Armar páginas <strong>de</strong> tal manera que se vayan numerando y que t<strong>en</strong>gan todas el mismotamaño.3. Facilitar el cambio <strong>de</strong> tipo <strong>de</strong> letra y proveer distintos tipos <strong>de</strong> letras como itálicas,negritas, etc..4. Facilitar la edición <strong>de</strong> tablas <strong>de</strong> distintos tipos.5. Facilitar la construcción <strong>de</strong> ecuaciones matemáticas.6. Facilitar la inserción <strong>de</strong> figuras <strong>en</strong> el texto.Muchos <strong>de</strong> los procesadores <strong>de</strong> texto pret<strong>en</strong><strong>de</strong>n hacer mucho trabajo por ti. Porejemplo, al escribir una carta prove<strong>en</strong> maneras directas y fáciles <strong>de</strong> formar la carta,pidi<strong>en</strong>do únicam<strong>en</strong>te el <strong>de</strong>stinatario, el remit<strong>en</strong>te, la firma, etc..Hay fundam<strong>en</strong>talm<strong>en</strong>te dos tipos <strong>de</strong> procesadores <strong>de</strong> texto, aquellos que van mostrandoel resultado <strong>de</strong> la edición <strong>en</strong> la misma pantalla, conforme se va escribi<strong>en</strong>do –como es el caso <strong>de</strong> Word – y aquellos que funcionan con comandos <strong>de</strong> control y que


144 L A TEXejecutan un programa para po<strong>de</strong>r ver cómo queda el texto ya formateado. L A TEX es <strong>de</strong>este último tipo. Llamemos a los primeros <strong>de</strong> tipo intérprete, porque van interpretandoconforme van recibi<strong>en</strong>do el texto, y a los segundos <strong>de</strong> tipo compilador, porque primerorecib<strong>en</strong> todo el texto y <strong>de</strong>spués lo transforman a las páginas correspondi<strong>en</strong>tes.Cada uno <strong>de</strong> estos tipos <strong>de</strong> procesadores ti<strong>en</strong>e sus v<strong>en</strong>tajas y sus <strong>de</strong>sv<strong>en</strong>tajas. Laprincipal v<strong>en</strong>taja <strong>de</strong>l intérprete es que es más fácil <strong>de</strong> usar y <strong>de</strong>tectas inmediatam<strong>en</strong>tecuando algo no es como lo quieres. La principal <strong>de</strong>sv<strong>en</strong>taja es que supone <strong>de</strong>masiadosparámetros respecto a cómo quieres el texto, y toma muchas <strong>de</strong>cisiones que son difíciles<strong>de</strong> <strong>de</strong>shacer. La principal v<strong>en</strong>taja <strong>de</strong> los compiladores es que te da un manejo máspreciso <strong>de</strong>l formato que quieres, permiti<strong>en</strong>do <strong>de</strong> esta manera una edición más rápida.La principal <strong>de</strong>sv<strong>en</strong>taja es que requiere un nivel <strong>de</strong> abstracción mayor, ya que como noestás vi<strong>en</strong>do 1 el resultado <strong>de</strong> lo que haces, y ti<strong>en</strong>es que compilarlo para verlo, trabajasmás “a ciegas”.Se eligió L A TEX para trabajar acá por varias razones, <strong>en</strong>tre ellas:(a) Es un paquete <strong>de</strong> distribución gratuita, disponible <strong>en</strong> prácticam<strong>en</strong>te todos los sistemasUnix y que está ampliam<strong>en</strong>te docum<strong>en</strong>tado.(b) La docum<strong>en</strong>tación vi<strong>en</strong>e con L A TEX, por lo que está accesible.(c) Cu<strong>en</strong>ta con un gran número <strong>de</strong> g<strong>en</strong>te trabajando continuam<strong>en</strong>te <strong>en</strong> el proyecto, porlo que hay muchos paquetes adicionales para casi cualquier cosa que se te puedaocurrir, como graficación, música, animación, <strong>en</strong>tre otros.(d) Es el más usado <strong>en</strong> el medio <strong>de</strong> Ci<strong>en</strong>cias <strong>de</strong> la Computación y Matemáticas parala elaboración <strong>de</strong> trabajos.En suma, aun cuando no logres ver más que una pequeña parte, la estructura <strong>de</strong>L A TEX es tal que el resto <strong>de</strong> los paquetes los podrás apr<strong>en</strong><strong>de</strong>r a manejar por su cu<strong>en</strong>ta,conforme los vayas requiri<strong>en</strong>do.6.2. Compon<strong>en</strong>tes <strong>de</strong> un textoMuchos se refier<strong>en</strong> a los procesadores <strong>de</strong> texto como procesadores <strong>de</strong> palabra, reconoci<strong>en</strong>docon esto que el compon<strong>en</strong>te básico <strong>de</strong> un texto son las palabras. Sin embargo,es <strong>en</strong> la forma <strong>de</strong> agrupar palabras don<strong>de</strong> realm<strong>en</strong>te se formatea texto. Veamos algunoscompon<strong>en</strong>tes importantes <strong>de</strong> un texto:palabras oraciones párrafossubsubsecciones subsecciones seccionescapítulos partes docum<strong>en</strong>to1 Esto, <strong>en</strong> realidad, ya no es <strong>de</strong>l todo cierto, pues L A TEX cu<strong>en</strong>ta ya con intérpretes que permit<strong>en</strong> irvi<strong>en</strong>do cómo queda el texto conforme lo vas escribi<strong>en</strong>do.


6.3 Ambi<strong>en</strong>tes para formato 145A partir <strong>de</strong> las subsubsecciones pue<strong>de</strong>s poner títulos y subtítulos.6.3. Ambi<strong>en</strong>tes para formatoTabla 6.1Por el tipo <strong>de</strong> procesador que es L A TEX, <strong>de</strong>bes indicarle <strong>en</strong> qué tipo <strong>de</strong> ambi<strong>en</strong>tequieres elaborar el docum<strong>en</strong>to. Los ambi<strong>en</strong>tes <strong>de</strong>fin<strong>en</strong> los márg<strong>en</strong>es que quieres (arriba,abajo, <strong>de</strong>recho, izquierdo), qué compon<strong>en</strong>tes se vale que t<strong>en</strong>ga el docum<strong>en</strong>to (capítulos,secciones, partes), el tamaño <strong>de</strong>l r<strong>en</strong>glón, la separación <strong>en</strong>tre párrafos, la sangría. L A TEXcu<strong>en</strong>ta, <strong>en</strong>tre otros, con las sigui<strong>en</strong>tes clases <strong>de</strong> docum<strong>en</strong>tos:LATEX: ambi<strong>en</strong>tesAmbi<strong>en</strong>te Nombre DescripciónReporte report Se utiliza para textos m<strong>en</strong>os formales que un libro o un artículo.No ti<strong>en</strong>e capítulos, sino que agrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizarán para la <strong>en</strong>trega<strong>de</strong> tareas, elaboración <strong>de</strong> pequeños manuales, etc. Permiteescribir <strong>en</strong> dos columnas fácilm<strong>en</strong>te.Libro book Da toda la infraestructura para la publicación <strong>de</strong> un libro, conpartes, capítulos, secciones, etc. Permite preparar las páginaspara imprimir algo por los dos lados.Acetatos seminar Supone un tamaño <strong>de</strong> letra <strong>de</strong> cuatro veces el normal, con loque permite armar acetatos.Cartas letter Permite elaborar cartas que acomodan <strong>de</strong> manera fácil el remit<strong>en</strong>te,la firma, etc.Cada una <strong>de</strong> las clases <strong>de</strong> docum<strong>en</strong>to supone un distinto ambi<strong>en</strong>te. El ambi<strong>en</strong>te eslo primero que le <strong>de</strong>bes dar al compilador <strong>de</strong> L A TEX .Un archivo fu<strong>en</strong>te <strong>de</strong> texto para L A TEX consiste <strong>de</strong>:Una especificación <strong>de</strong> ambi<strong>en</strong>te\ docum<strong>en</strong>tclass { r e p o r t }El preámbulo, don<strong>de</strong> especificas algunos modificadores para este ambi<strong>en</strong>te, comopue<strong>de</strong>n ser paquetes adicionales que quieras usar.\ usepackage [ spanish ] { babel }\ usepackage { ucs }\ usepackage [ u t f 8 x ] { input<strong>en</strong>c }\ usepackage { amsmath }


146 L A TEXTambién <strong>en</strong> el preámbulo pue<strong>de</strong>s cambiar <strong>de</strong> manera explícita algunos <strong>de</strong> los parámetros<strong>de</strong> la hoja.\ setcounter { chapter } { 5 }\ addtol<strong>en</strong>gth { v o f f s e t } { 2cm}O, <strong>en</strong> g<strong>en</strong>eral, establecer propieda<strong>de</strong>s <strong>de</strong> los objetos con que vas a trabajar o incluir<strong>de</strong>finiciones:\ i n p u t { d e f i n i c i o n e s }\ i n c l u d e o n l y { segundo }El docum<strong>en</strong>to propiam<strong>en</strong>te dicho que empieza con\ begin { docum<strong>en</strong>t }y termina con\ <strong>en</strong>d { docum<strong>en</strong>t }y <strong>en</strong>tre estas dos marcas pue<strong>de</strong> haber texto;Éste es un docum<strong>en</strong>to que t r a e conceptos básicoscomandos <strong>de</strong> L A TEX;\ begin { c<strong>en</strong>ter }. . .\ <strong>en</strong>d { c<strong>en</strong>ter }o, <strong>en</strong> g<strong>en</strong>eral, comandos que insertan <strong>en</strong> ese lugar texto <strong>de</strong> otros archivos:\ i n c l u d e { primero }\ i n c l u d e { segundo }Actividad 6.1 En esta primera práctica <strong>de</strong> L A TEX escribirás las observaciones <strong>en</strong> unarchivo <strong>de</strong> texto simple. Para ello, utilizando Emacs, <strong>de</strong>berás abrir un archivo nuevodon<strong>de</strong> vayas escribi<strong>en</strong>do.Actividad 6.2 Carga <strong>en</strong> tu Emacs el archivo template1.tex que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> elsubdirectorio indicado <strong>en</strong> la página 3.1.Actividad 6.3 Compila el archivo fu<strong>en</strong>te. Para hacerlo, vas a llevar a cabo el sigui<strong>en</strong>tediálogo <strong>en</strong> la v<strong>en</strong>tana <strong>de</strong> comandos. Irás anotando línea por línea la interacción.Deberá estar subrayado lo que Emacs escribe y sin subrayar las respuestas.C–cC–cpara invocar al compilador <strong>de</strong> L A TEX.Save file “/home/usuario/template1.tex”?(y/n)pregunta si se <strong>de</strong>sea actualizar la copia <strong>de</strong>l archivo <strong>en</strong> el disco. La respuesta <strong>de</strong>beráser sí (y) para que L A TEX trabaje con la última versión.


6.3 Ambi<strong>en</strong>tes para formato 147Command: (Default L A TEX )Invoca al compilador <strong>de</strong> L A TEX para que trabaje sobre el archivo fu<strong>en</strong>te. Se oprime latecla Enter . En este mom<strong>en</strong>to, el compilador mandará un m<strong>en</strong>saje:Type teclaC–c teclaC–l to display results of compilationSi tecleas <strong>en</strong> este mom<strong>en</strong>to C–c C–l , el compilador <strong>de</strong> L A TEX irá mostrando, conformeva revisando el archivo, el resultado <strong>de</strong> la compilación. Al terminar, indicará si hubo ono errores. Si no los hubo, aparecerá un m<strong>en</strong>saje <strong>de</strong> que terminó bi<strong>en</strong>:L A TEX succesfully compiled (3) pagesdon<strong>de</strong> dice, <strong>en</strong>tre paréntesis, el número <strong>de</strong> hojas que pudo armar con el texto dado.También aparece el m<strong>en</strong>saje <strong>en</strong> la otra mitad <strong>de</strong> la pantalla que dirá que L A TEX terminóo que tuvo errores.Para ver cómo quedaron las páginas compiladas, vuelve a teclear C–c C–c y elm<strong>en</strong>saje que aparecerá es si <strong>de</strong>seas ver (View) cómo quedó. Si oprimes la tecla Enterse abrirá una v<strong>en</strong>tana nueva que mostrará el resultado <strong>de</strong> la compilación, utilizandopara ello el paquete xdvi. El archivo g<strong>en</strong>erado ti<strong>en</strong>e el mismo nombre, pero su ext<strong>en</strong>siónes dvi.Si es que hubo algún error, L A TEX te pedirá que oprimas C–c ` . (aunque el m<strong>en</strong>sajepi<strong>de</strong>, <strong>en</strong> realidad, que teclee nada más C–c y el ac<strong>en</strong>to grave (‘), <strong>en</strong> algunos casosy que ti<strong>en</strong><strong>en</strong> que ver conque ti<strong>en</strong>es Emacs para que ponga ac<strong>en</strong>tos para el español,<strong>de</strong>berás repetir esta última tecla, o bi<strong>en</strong> teclearla <strong>en</strong> combinación con la tecla Alt <strong>de</strong>la parte <strong>de</strong>recha <strong>de</strong>l teclado). En seguida, L A TEX te llevará a don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra el error<strong>en</strong> el texto.6.3.1. Posibles erroresEn este primer ejercicio realm<strong>en</strong>te t<strong>en</strong>drás pocos errores que reportar. G<strong>en</strong>eralm<strong>en</strong>teserán aquéllos ocasionados por errores <strong>de</strong> <strong>de</strong>do. Nóta que L A TEX ti<strong>en</strong>e varios tipos <strong>de</strong>comandos:i. Aquellos que están <strong>en</strong>tre \begin {...} y \<strong>en</strong>d {...} , don<strong>de</strong> lo que va <strong>en</strong>tre llaves serepite. Veamos algunos ejemplos:\ begin { docum<strong>en</strong>t }. . . .\ <strong>en</strong>d { docum<strong>en</strong>t }


148 L A TEX\ begin { compact<strong>en</strong>um }\ item . . . .\ item . . . .\ <strong>en</strong>d { compact<strong>en</strong>um }\ begin { c<strong>en</strong>ter }. . .\ <strong>en</strong>d { c<strong>en</strong>ter }A estos comandos les llamamos “<strong>de</strong> ambi<strong>en</strong>te” porque <strong>de</strong>limitan a un texto paraque se les apliqu<strong>en</strong> <strong>de</strong>terminadas reglas.ii. También t<strong>en</strong>emos comandos que marcan el inicio y final <strong>de</strong> un cierto tipo <strong>de</strong> datos;por ejemplo, carácteres matemáticos. Para esto, cuando quieres que la fórmulavaya insertada <strong>en</strong>tre el texto, pue<strong>de</strong>s usar cualquiera <strong>de</strong> los dos ambi<strong>en</strong>tes quesigu<strong>en</strong>.$ . . . . $\ ( . . . . \ )y cuando quieres que aparezca <strong>en</strong> un párrafo separado, ti<strong>en</strong>es para ello cualquiera<strong>de</strong> los dos ambi<strong>en</strong>tes que sigu<strong>en</strong>.$$ . . . . $$\ [ . . . . \ ]iii. Aquellos que marcan lo que sigue, y que aparec<strong>en</strong> únicam<strong>en</strong>te como comandos <strong>de</strong>control. A estos les llamamos comandos <strong>de</strong> estado, porque cambian el estado <strong>de</strong>lambi<strong>en</strong>te:Ejemplos:\ bf\ l a r g eEstos comandos funcionan “hasta nuevo aviso”. Pue<strong>de</strong>s <strong>de</strong>limitar también su rango<strong>de</strong> acción si colocas <strong>en</strong>tre llaves al comando y a todo a lo que quieres que seaplique:{\ l a r g e Esta es una prueba}y <strong>en</strong>tonces el comando se referirá únicam<strong>en</strong>te a lo que está <strong>en</strong> las llaves más internas.iv. Aquellos comandos que actúan sobre sus parámetros:\ s e c t i o n { Primera }\ setcounter { s e c t i o n } { 4 }v. Y por último, aquellos comandos que simplem<strong>en</strong>te se usan como abreviaturas conv<strong>en</strong>i<strong>en</strong>teso para <strong>de</strong>notar símbolos especiales. Siempre empiezan con \


6.4 Formato g<strong>en</strong>eral <strong>de</strong> un docum<strong>en</strong>to 149\ cdot\ uparrowEn el primero, segundo y tercer tipo <strong>de</strong> comandos es usual que se te olvi<strong>de</strong> cerrarun ambi<strong>en</strong>te, y <strong>en</strong>tonces el compilador reportará que se <strong>en</strong>contró el final <strong>de</strong>l docum<strong>en</strong>toantes <strong>de</strong> lo esperado, o algún m<strong>en</strong>saje don<strong>de</strong> indique que lo que sigue no ti<strong>en</strong>e s<strong>en</strong>tidodon<strong>de</strong> está.Es frecu<strong>en</strong>te que t<strong>en</strong>gas errores al teclear y L A TEX no reconozca el comando. En esoscasos señalará exactam<strong>en</strong>te el lugar don<strong>de</strong> no está <strong>en</strong>t<strong>en</strong>di<strong>en</strong>do.En el último tipo <strong>de</strong> comandos, a<strong>de</strong>más <strong>de</strong>l primer tipo <strong>de</strong> error, como pudiera serel <strong>de</strong> teclear mal el nombre <strong>de</strong>l comando, pue<strong>de</strong>s también darle m<strong>en</strong>os parámetros <strong>de</strong>los que espera, o <strong>de</strong> distintos tipos. Por ejemplo, el comando\ setcounter { s e c t i o n } { 4 }espera una número <strong>en</strong>tero <strong>en</strong> su segundo parámetro, por lo que si le dieras otra ca<strong>de</strong>naprotestaría.Muchas veces es necesario t<strong>en</strong>er <strong>en</strong> el docum<strong>en</strong>to texto que no quieres que aparezca<strong>en</strong> la versión final. También pudiera suce<strong>de</strong>r que t<strong>en</strong>gas problemas con un comandoparticular y quieras ver qué pasa si lo quitas, pero sin quitarlo realm<strong>en</strong>te <strong>de</strong>l archivo.Lo que convi<strong>en</strong>e <strong>en</strong> esos casos es usar com<strong>en</strong>tarios.L A TEX ti<strong>en</strong>e dos tipos <strong>de</strong> com<strong>en</strong>tarios. El primero, y el más s<strong>en</strong>cillo <strong>de</strong> usar, es el quesimplem<strong>en</strong>te com<strong>en</strong>ta el resto <strong>de</strong> una línea. Para ello se usa el carácter % (porci<strong>en</strong>to),y <strong>de</strong>s<strong>de</strong> el punto <strong>en</strong> el que aparece hasta el fin <strong>de</strong> línea (<strong>en</strong> la pantalla, aunque la línease haya “doblado”) el compilador <strong>de</strong> L A TEX no va a consi<strong>de</strong>rar eso para compilar y noaparecerá <strong>en</strong> el trabajo final.La segunda manera es introduci<strong>en</strong>do el ambi<strong>en</strong>te <strong>de</strong> com<strong>en</strong>tario mediante\ begin { comm<strong>en</strong>t }. . .\ <strong>en</strong>d { comm<strong>en</strong>t }y todo lo que que<strong>de</strong> <strong>en</strong> este ambi<strong>en</strong>te quedará excluido <strong>de</strong> la compilación <strong>de</strong> L A TEX.Para que puedas usar esta forma <strong>de</strong> com<strong>en</strong>tario, <strong>de</strong>bes incluir el paquete comm<strong>en</strong>t <strong>en</strong>el preámbulo <strong>de</strong> tu docum<strong>en</strong>to:\ usepackage { comm<strong>en</strong>t }Esta manera <strong>de</strong> incluir com<strong>en</strong>tarios también pue<strong>de</strong> ser muy útil si estás trabajandocon un archivo <strong>de</strong> texto muy gran<strong>de</strong> y <strong>de</strong>seas compilar por pedazos.6.4. Formato g<strong>en</strong>eral <strong>de</strong> un docum<strong>en</strong>toL A TEX procesa los espacios <strong>en</strong> blanco <strong>de</strong> manera especial. Por ejemplo, <strong>en</strong>tre dospalabras un espacio <strong>en</strong> blanco es lo mismo que 25 o que un cambio <strong>de</strong> r<strong>en</strong>glón; simi-


150 L A TEXlarm<strong>en</strong>te, un r<strong>en</strong>glón <strong>en</strong> blanco es equival<strong>en</strong>te a diez. En g<strong>en</strong>eral, no respeta <strong>de</strong> maneraestricta el formato que trae el docum<strong>en</strong>to fu<strong>en</strong>te, pues su trabajo consiste, precisam<strong>en</strong>te,<strong>en</strong> acomodar a<strong>de</strong>cuadam<strong>en</strong>te el texto <strong>de</strong> acuerdo a los comandos que recibe. Distingueuna palabra <strong>de</strong> otra por al m<strong>en</strong>os un espacio <strong>en</strong> blanco, y un párrafo <strong>de</strong> otro por alm<strong>en</strong>os un r<strong>en</strong>glón <strong>en</strong> blanco. La forma como aparece el texto fu<strong>en</strong>te, <strong>en</strong> aus<strong>en</strong>cia <strong>de</strong>separaciones <strong>de</strong> palabras o párrafos, no ti<strong>en</strong>e nada que ver con el formato final, ni <strong>en</strong> eltamaño <strong>de</strong>l r<strong>en</strong>glón, ni <strong>en</strong> la manera <strong>en</strong> que silabea.L A TEX se <strong>en</strong>carga <strong>de</strong> g<strong>en</strong>erar espacios <strong>en</strong>tre los párrafos cuando <strong>en</strong>cu<strong>en</strong>tra dos cambios<strong>de</strong> r<strong>en</strong>glón seguidos (al m<strong>en</strong>os un r<strong>en</strong>glón <strong>en</strong> blanco). También, cada vez queempieza un capítulo, sección, subsección, etc. g<strong>en</strong>era espacios verticales <strong>en</strong> blanco.L A TEX ofrece la posibilidad <strong>de</strong> manipular directam<strong>en</strong>te los espacios que se <strong>de</strong>jan<strong>en</strong>tre párrafos o el cambio <strong>de</strong> r<strong>en</strong>glón. En los comandos que sigu<strong>en</strong>, repres<strong>en</strong>taa un <strong>en</strong>tero positivo o negativo y repres<strong>en</strong>ta una unidad <strong>de</strong> medida, que pue<strong>de</strong>ser pt, in, cm, mm, ex, em o cualquier variable <strong>de</strong> longitud – ex repres<strong>en</strong>ta la altura<strong>de</strong> una x mi<strong>en</strong>tras que em repres<strong>en</strong>ta el ancho <strong>de</strong> la letra m – . Los comandos con quecu<strong>en</strong>tas para manipular los espacios se muestran <strong>en</strong> la tabla 6.2.Tabla 6.2LATEX: comandos para modificar espaciosComandoDescripción\⊔ Indica que se <strong>de</strong>je incondicionalm<strong>en</strong>te un espacio <strong>en</strong>blanco; pue<strong>de</strong> ser necesario cuando L A TEX g<strong>en</strong>era algúncódigo y suprime los blancos que lo separan.~ Produce también un espacio <strong>en</strong> blanco, pero que el compiladorno pue<strong>de</strong> usar para cambiar <strong>de</strong> línea.\\ Cambia <strong>de</strong> r<strong>en</strong>glón y el sigui<strong>en</strong>te r<strong>en</strong>glón empieza <strong>en</strong> elmarg<strong>en</strong> izquierdo.\\[< num>]\\∗[< num>]\vspace{}\vspace∗{}Da un cambio <strong>de</strong> r<strong>en</strong>glón, pero salta, a<strong>de</strong>más <strong>de</strong> al r<strong>en</strong>glónsigui<strong>en</strong>te, tanto como se le indique. Si el númeroes negativo, retroce<strong>de</strong> <strong>en</strong> la hoja. El ∗ a continuación <strong>de</strong>\\\\ es para forzar a que se dé el espacio; <strong>de</strong> otra manera,L A TEX <strong>de</strong>ci<strong>de</strong> si aplica el espacio o no.Da un espacio vertical <strong>de</strong>l tamaño especificado. Si el númeroes negativo, retroce<strong>de</strong> <strong>en</strong> la página. Nuevam<strong>en</strong>te, el∗ es para forzar a LaTeX a que recorra el espacio especificado.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


6.4 Formato g<strong>en</strong>eral <strong>de</strong> un docum<strong>en</strong>to 151Tabla 6.2 LATEX: comandos para modificar espacios Continúa <strong>de</strong> la página anteriorComando\smallskip\medskip\bigskip\noin<strong>de</strong>nt\in<strong>de</strong>nt\hspace{}\hspace∗{}DescripciónPermit<strong>en</strong> el <strong>de</strong>splazami<strong>en</strong>to vertical <strong>de</strong>l texto <strong>en</strong> un cuarto<strong>de</strong>l tamaño <strong>de</strong> la línea base ( \\ baselineskip), media líneabase y una completa. Es muy útil porque son saltosrelativos al tamaño <strong>de</strong> letra que estés usando.Hace que un párrafo o r<strong>en</strong>glón empiece <strong>en</strong> el marg<strong>en</strong>izquierdo <strong>de</strong> la hoja, <strong>en</strong> lugar <strong>de</strong> hacerlo con sangría.Obliga a <strong>de</strong>jar un espacio horizontal igual al <strong>de</strong> la sangría<strong>de</strong> párrafos.Deja un espacio horizontal dado por el número. Si el númeroes negativo, retroce<strong>de</strong> <strong>en</strong> la línea. L A TEX pue<strong>de</strong> <strong>de</strong>cidirque el espacio no es a<strong>de</strong>cuado <strong>en</strong> ese punto y noobe<strong>de</strong>cer. Nuevam<strong>en</strong>te, el ∗ fuerza a LaTeX a obe<strong>de</strong>cerla instrucción.Tanto \vspace como \hspace pudieran ser inhibidos por L A TEX si es que el compiladorconsi<strong>de</strong>ra que no se vería bi<strong>en</strong>. Por ejemplo, si el <strong>de</strong>splazami<strong>en</strong>to vertical toca aprincipio <strong>de</strong> una página, <strong>de</strong>ci<strong>de</strong> no hacerlo.Todo docum<strong>en</strong>to, m<strong>en</strong>os las cartas, <strong>de</strong>b<strong>en</strong> t<strong>en</strong>er un título, autor(es) y la fecha <strong>en</strong> quefue impreso. Algunas veces se agrega una nota <strong>de</strong> agra<strong>de</strong>cimi<strong>en</strong>to. En g<strong>en</strong>eral, a estose le llama el título. En el preámbulo (antes <strong>de</strong> que empiece el docum<strong>en</strong>to propiam<strong>en</strong>tedicho) <strong>de</strong>bes colocar los datos para que L A TEX pueda armar el título que se <strong>de</strong>sea. Loscomandos a L A TEX son:\ t i t l e { E j e r c i c i o s <strong>de</strong> Latex }Este es un comando con un parámetro que le indica a L A TEX que el título <strong>de</strong>l docum<strong>en</strong>toes “Ejercicios <strong>de</strong> Latex”. Nota que el argum<strong>en</strong>to <strong>de</strong>be ir <strong>en</strong>tre llaves.\ author { El Chapulín Colorado \ and Pepe G r i l l o }Si se trata <strong>de</strong> más <strong>de</strong> un autor, los nombres <strong>de</strong> los autores irán separados por la palabra\and.\ date { El día más b e l l o <strong>de</strong>l planeta \ \\ today }En la fecha pue<strong>de</strong>s poner lo que quieras, aunque se espera una fecha. Las dos diagonalesinversas \\ sirv<strong>en</strong> para cambiar <strong>de</strong> r<strong>en</strong>glón, y las pue<strong>de</strong>s utilizar <strong>en</strong> casi cualquiermom<strong>en</strong>to. El comando \today sirve para que L A TEX inserte la fecha <strong>de</strong> hoy.\ thanks { Gracias a l o s v o l u n t a r i o s <strong>de</strong> este t a l l e r }


152 L A TEXSirve para agregar, al pie <strong>de</strong> la página, algún com<strong>en</strong>tario que se <strong>de</strong>see. Este comando<strong>de</strong>berá aparecer una vez iniciado el docum<strong>en</strong>to propiam<strong>en</strong>te dicho.Como ya m<strong>en</strong>cionamos, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> la clase <strong>de</strong> docum<strong>en</strong>to L A TEX se comportará<strong>de</strong> manera difer<strong>en</strong>te al compilar el texto fu<strong>en</strong>te (la especificación <strong>de</strong> \docum<strong>en</strong>tcl ass).Actividad 6.4 Agrega <strong>en</strong>cabezado al docum<strong>en</strong>to. Ponte tú como autor, junto con tusmejores amigos, el título que a tí más te parezca y algún com<strong>en</strong>tario respecto a lafecha. Agrega un párrafo <strong>de</strong> agra<strong>de</strong>cimi<strong>en</strong>to tan gran<strong>de</strong> como quieras. Recuerda nadamás que <strong>de</strong>be ir <strong>de</strong>spués <strong>de</strong> \begin{docum<strong>en</strong>t}. Compila y ve el efecto.Actividad 6.5 El objetivo ahora es ver el efecto que ti<strong>en</strong><strong>en</strong> las distintas clases <strong>de</strong> docum<strong>en</strong>tosobre lo que se imprime. En todas las acciones que sigu<strong>en</strong>, haz el cambio,compila y ve el resultado. Anota cuál es el efecto <strong>de</strong>l cambio. Convierte <strong>en</strong> com<strong>en</strong>tarios(ya sea con % o con \begin{comm<strong>en</strong>t} ... \<strong>en</strong>d{comm<strong>en</strong>t} para conseguir que compile bi<strong>en</strong>.Com<strong>en</strong>ta tus observaciones y qué es lo que tuviste que “quitar” para que compilarabi<strong>en</strong>. Cada vez que cambies a un nuevo tipo <strong>de</strong> docum<strong>en</strong>to, quita los com<strong>en</strong>tarios quehayas puesto.Actividad 6.6 Cambia el tipo <strong>de</strong> docum<strong>en</strong>to a article . Vuelve a compilar y reporta loque observas, <strong>en</strong> cuanto al formato <strong>de</strong> la hoja.Actividad 6.7 Haz lo mismo que <strong>en</strong> la actividad anterior, pero con la clase book.6.4.1. CartasPara escribir cartas, todo indica que el formato que le ti<strong>en</strong>e que dar L A TEX es muydistinto al <strong>de</strong> los docum<strong>en</strong>tos que hemos visto hasta ahora. Pue<strong>de</strong>s meter <strong>en</strong> un mismodocum<strong>en</strong>to varias cartas, ya que se espera que el remit<strong>en</strong>te y la firma sean los mismospara todas las cartas incluidas <strong>en</strong> el docum<strong>en</strong>to. Por ello, una vez iniciado el docum<strong>en</strong>to,<strong>de</strong>bes especificar estos dos parámetros. Veamos primero el remit<strong>en</strong>te:Remit<strong>en</strong>te: Se refiere a lo que normalm<strong>en</strong>te aparece <strong>en</strong> el tope <strong>de</strong> la carta y que es ladirección <strong>de</strong> aquél qui<strong>en</strong> firma la carta:\ address { Dra . G<strong>en</strong>oveva B i e n v i s t a \ \Cubículo 003. E d i f . <strong>de</strong> Matemá t i c a s \ \Facultad <strong>de</strong> Ci<strong>en</strong>cias , <strong>UNAM</strong>}Pue<strong>de</strong> consistir <strong>de</strong> uno o más r<strong>en</strong>glones. Si <strong>de</strong>seas más <strong>de</strong> un r<strong>en</strong>glón <strong>en</strong> el remit<strong>en</strong>te,separas los r<strong>en</strong>glones con \\.Firma: Para la firma se especifica <strong>de</strong> manera similar al remit<strong>en</strong>te:\ s i g n a t u r e { Dra . G<strong>en</strong>oveva B i e n v i s t a \ \Profesor T i t u l a r B}


6.5 Tipos y tamaños <strong>de</strong> letras 153Una vez que ti<strong>en</strong>es <strong>de</strong>finidos estos parámetros, se proce<strong>de</strong> a escribir cada una <strong>de</strong> lascartas. Se <strong>de</strong>limita cada una <strong>de</strong> éstas por\ begin { l e t t e r }. . .\ <strong>en</strong>d { l e t t e r }D<strong>en</strong>tro <strong>de</strong> cada carta colocarás los parámetros que se refier<strong>en</strong> a cada una <strong>de</strong> ellas.Veamos cómo se hace:Destinatario: A continuación <strong>de</strong> \begin{ letter } colocarás <strong>en</strong>tre llaves los datos <strong>de</strong>l <strong>de</strong>stinatario:\ 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 <strong>de</strong> Ci<strong>en</strong>cias<strong>de</strong> l a Computación \ \Primer Ingreso \ \G<strong>en</strong>eración 2007}Con esto, aparecerá el texto inmediatam<strong>en</strong>te antes <strong>de</strong> la carta.Introducción: Llamamos introducción a la frase con la que se saluda o inicia la carta.También se relaciona únicam<strong>en</strong>te con la carta <strong>en</strong> cuestión:\ op<strong>en</strong>ing {Muy querido e s t u d i a n t e : }y este r<strong>en</strong>glón aparecerá al inicio <strong>de</strong> la carta.Despedida: Esta es la frase que aparecerá antes <strong>de</strong> que aparezca la firma y “jalará” ala firma a continuación. Aparecerá don<strong>de</strong>quiera que coloques el comando, por loque lo <strong>de</strong>berá colocar inmediatam<strong>en</strong>te antes <strong>de</strong>l fin <strong>de</strong> la carta (\<strong>en</strong>d{ letter }).\ c l o s i n g { Quedo <strong>de</strong> Uds . at<strong>en</strong>tam<strong>en</strong>te , }Copias: Muchas veces quieres poner al pie <strong>de</strong> la carta la lista <strong>de</strong> las personas a las quepret<strong>en</strong><strong>de</strong>s <strong>en</strong>tregarle una copia <strong>de</strong> la carta. Esto se logra con el comando:\ cc { Mis mejores amigos \ \Mis estimados colegas \ \Primer ingreso <strong>en</strong> g<strong>en</strong>eral }También este comando, como el <strong>de</strong> <strong>de</strong>spedida, aparecerá <strong>en</strong> don<strong>de</strong> lo coloques, porlo que lo <strong>de</strong>berás colocar también al final <strong>de</strong> la carta y <strong>de</strong>spués <strong>de</strong> la <strong>de</strong>spedida.Actividad 6.8 Ahora cambia a la clase letter y modifica el texto fu<strong>en</strong>te para que parezca,<strong>en</strong> efecto, una carta (o edita un archivo propio para ello). Observa los resultados.6.5. Tipos y tamaños <strong>de</strong> letrasSi revisas estas notas, hechas con L A TEX, verás que exist<strong>en</strong> una gran cantidad <strong>de</strong> tipos<strong>de</strong> letras y tamaños que pue<strong>de</strong>s usar <strong>de</strong>ntro <strong>de</strong> tu docum<strong>en</strong>to. Para cambiar el tamaño


154 L A TEXTabla 6.3<strong>de</strong> las letras cu<strong>en</strong>tas con comandos <strong>de</strong> estado, por lo que el que uno <strong>de</strong> ellos aparezcase referirá a todo el ambi<strong>en</strong>te <strong>en</strong> el que están. Es conv<strong>en</strong>i<strong>en</strong>te, por ello, escribirlos <strong>en</strong>trellaves:{ \ l a r g e este es . . . . . . . }Veamos una lista <strong>de</strong> tamaños <strong>de</strong> letras con sus nombres <strong>en</strong> la tabla 6.3.Tamaños disponibles para letrasNombreDescripción <strong>de</strong>l tamañotinyscriptsizefootnotesizesmallnormalsizelargeLargeLARGEhugeHugeHUGEesta es una muestra diminutaun poco m<strong>en</strong>os pequeñacreci<strong>en</strong>do un pocoesta es una muestra pequeñaeste es el tamaño normaluna muestra agrandada un pocoAgrandamos la muestra un poco másMuy gran<strong>de</strong>Mucho muy gran<strong>de</strong>¡Súper extra gran<strong>de</strong>!¡Súper dúper extra gran<strong>de</strong>!Como se ve, ti<strong>en</strong>es a tu disposición siete tamaños distintos <strong>de</strong> letras (aunque <strong>en</strong>realidad no hay casi difer<strong>en</strong>cia <strong>en</strong>tre huge, Huge y Huge. En cualquier lugar don<strong>de</strong> pue<strong>de</strong>aparecer texto, éste pue<strong>de</strong> aparecer agrandado o empequeñecido. Sin embargo, cuandose está usando ambi<strong>en</strong>te matemático estos comandos no t<strong>en</strong>drán efecto alguno <strong>de</strong>ntro<strong>de</strong>l ambi<strong>en</strong>te y pue<strong>de</strong>n causar un m<strong>en</strong>saje <strong>de</strong> aviso.Actividad 6.9 Vuelve a cargar el archivo CalcProp.tex para que vuelvas a t<strong>en</strong>er la versiónoriginal.Actividad 6.10 Localiza <strong>en</strong> el docum<strong>en</strong>to fu<strong>en</strong>te aquellos r<strong>en</strong>glones que están precedidospor la palabra \item. A cada uno <strong>de</strong> ellos, ponle uno <strong>de</strong> los tamaños <strong>de</strong> letralistados anteriorm<strong>en</strong>te, <strong>en</strong>cerrando el comando y el texto correspondi<strong>en</strong>te <strong>en</strong>tre llaves.Compila y ve el resultado.


6.5 Tipos y tamaños <strong>de</strong> letras 155Tabla 6.4Actividad 6.11 Quita las llaves que <strong>de</strong>limitan el texto. Compila y ve el resultado.Actividad 6.12 Haz que la primera letra <strong>de</strong> cada párrafo empiece <strong>en</strong> cada uno <strong>de</strong> lostamaños especificados. Compila y ve el resultado.Veamos ahora cuáles son los tipos <strong>de</strong> letra que provee L A TEX (se les <strong>de</strong>nomina fonts).Vi<strong>en</strong><strong>en</strong> tanto como comandos <strong>de</strong> cambio <strong>de</strong> estado como con un argum<strong>en</strong>to, que es eltexto que se va a cambiar.LATEX: comandos para cambios <strong>de</strong> tipo <strong>de</strong> letraDecl. Abr. Comando Descripción\mdseries \textmd {...} Medium Series, se refiere a tipo normal\ bfseries \bf \ textbf {...} Boldface Series, se refiere a negritas\rmfamily \rm \textrm {...} Roman Family, un tipo <strong>de</strong> letra\ sffamily \ sf \ textsf {...} Sans Serif Family, letras simples\ ttfamily \ tt \ texttt {...} Typewriter Family, letracomo <strong>de</strong> máquina <strong>de</strong> escribir\upshape \textup {...} Letras sin inclinación\itshape \ it \ textit {...} Texto <strong>en</strong> itálicas\slshape \ sl \ textsl {...} Texto ligeram<strong>en</strong>te inclinado\scshape \sc \ textsc {...} TEXTO EN MAYÚSCULAS ESCALADAS\normalfont \textnormal {...} Texto normalTodas las abreviaturas funcionan como cambios <strong>de</strong> estado, por lo que si <strong>de</strong>seas queúnicam<strong>en</strong>te se apliqu<strong>en</strong> a un pedazo <strong>de</strong> texto, <strong>en</strong>cerrarás el comando junto con el texto<strong>en</strong>tre llaves, la que abre precedi<strong>en</strong>do al comando.Pue<strong>de</strong>s utilizar otro tipo <strong>de</strong> texto, conocido como <strong>en</strong>fatizado, que simplem<strong>en</strong>te implicaun cambio <strong>de</strong> tipo <strong>de</strong> letra, que <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong> la instalación <strong>de</strong> L A TEX. Su abreviatura,es \em y su comando es \emph{. . . }. Funcionan <strong>de</strong> manera similar al resto <strong>de</strong> los cambios<strong>de</strong> tipo <strong>de</strong> letra. Ti<strong>en</strong>e la propiedad <strong>de</strong> que si está <strong>en</strong> modo <strong>en</strong>fatizado y se <strong>en</strong>cu<strong>en</strong>traun comando, cambia a modo normal y viceversa:{ \ em Veamos cómo funciona este comando cuando t<strong>en</strong>emos{ \ em uno <strong>de</strong>ntro <strong>de</strong> o t r o } }Veamos cómo funciona este comando cuando t<strong>en</strong>emos uno <strong>de</strong>ntro <strong>de</strong> otroEl último comando, \textnormal, lo usas para “escapar” a algún tipo que hayasdado para todo un párrafo o una sección:


156 L A TEX\ t e x t b f { Quieres que aparezca <strong>en</strong> negritas , excepto\ textnormal { este t e x t o } }Quieres que aparezca <strong>en</strong> negritas, excepto este textoActividad 6.13 Modifica el archivo CalcProp.ltx para que las primeras dos palabras<strong>de</strong> cada párrafo sean con un tipo <strong>de</strong> letra distinto y un tamaño distinto. Usa todos lostipos listados, aunque repitas.Actividad 6.14 Compila y reporta tus resultados.A veces pue<strong>de</strong>s combinar dos o más tipos y tamaños <strong>de</strong> letras. Por ejemplo, pue<strong>de</strong>squerer t<strong>en</strong>er negritas <strong>de</strong> itálicas:Negritas itálicasEste tipo <strong>de</strong> combinaciones las consigues utilizando los comandos que correspon<strong>de</strong>na la <strong>de</strong>claración, cuyo uso es <strong>de</strong> comando <strong>de</strong> estado:{ \ b f s e r i e s \ itshape Negritas i t á l i c a s } } comparadascon \ t e x t i t { I t á l i c a s }que produceNegritas itálicas comparadas con itálicasSi se utilizan los dos comandos <strong>de</strong> abreviatura{ \ i t \ bf 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 }únicam<strong>en</strong>te se verificará el último (más interno) cambio <strong>de</strong> estado que se haya solicitado:Itálicas negritas comparadas con negritasLo mismo suce<strong>de</strong>rá con cualquier combinación que se <strong>de</strong>see <strong>de</strong> dos tipos <strong>de</strong> letras:<strong>de</strong>berás combinar usando una como cambio <strong>de</strong> estado y la otra como comando conargum<strong>en</strong>to – aunque la eficacia <strong>de</strong> esto <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong>l or<strong>de</strong>n – o las dos <strong>en</strong> modo <strong>de</strong><strong>de</strong>claración.6.6. Listas <strong>de</strong> <strong>en</strong>unciados o párrafosUn párrafo es un conjunto <strong>de</strong> oraciones que empiezan y terminan con doble Enter .En el docum<strong>en</strong>to fu<strong>en</strong>te pue<strong>de</strong>s observar un r<strong>en</strong>glón <strong>en</strong> blanco para finalizar cada párrafo.El aspecto <strong>en</strong> el docum<strong>en</strong>to formateado <strong>de</strong>p<strong>en</strong><strong>de</strong>rá <strong>de</strong> los parámetros que t<strong>en</strong>ga L A TEXpara compilar ese texto – aunque se pue<strong>de</strong>n modificar, no lo haremos por el mom<strong>en</strong>to–.L A TEX provee mecanismos para pres<strong>en</strong>tar listas <strong>de</strong> párrafos, ya sean numerados, etiquetadoso con una marca separándolos <strong>en</strong>tre sí. En g<strong>en</strong>eral, ti<strong>en</strong><strong>en</strong> el sigui<strong>en</strong>te formato:


6.6 Listas <strong>de</strong> <strong>en</strong>unciados o párrafos 157\ begin { }\ item \ item \ item . . .\ <strong>en</strong>d{ }Cada párrafo que <strong>de</strong>sees marcar (numerar) <strong>de</strong>berá ir precedido <strong>de</strong>l comando \item.Entre un \item y el sigui<strong>en</strong>te, o <strong>en</strong>tre \item y el final <strong>de</strong> la lista pue<strong>de</strong> haber más <strong>de</strong> unpárrafo.Los que vas a manejar por lo pronto son los sigui<strong>en</strong>tes:\ begin { <strong>en</strong>umerate }\ <strong>en</strong>d { <strong>en</strong>umerate }\ begin { i t e m i z e }\ <strong>en</strong>d { i t e m i z e }\ begin { d e s c r i p t i o n }\ <strong>en</strong>d { d e s c r i p t i o n }Cada uno <strong>de</strong> éstos pue<strong>de</strong> aparecer anidado <strong>en</strong> el otro, o anidado <strong>en</strong> sí mismo. Veamosprimero las numeraciones.6.6.1. NumeracionesEmpezaremos por el tema <strong>de</strong> incisos numerados. Veamos un anidami<strong>en</strong>to <strong>de</strong> numeración:\ begin { <strong>en</strong>umerate }\ item Este es e l primer pá r r a f o <strong>en</strong> e l primer n i v e l\ begin { <strong>en</strong>umerate }\ item Queremos ver qué pasa a l anidar <strong>en</strong> e l segundo n i v e l\ begin { <strong>en</strong>umerate }\ item Anidamos una vez más para e l t e r c e r n i v e l\ item Otro i n c i s o para que se vea qué pasa <strong>en</strong> e l t e r c e r n i v e l\ begin { <strong>en</strong>umerate }\ item Numeración <strong>en</strong> e l cuarto n i v e l\ <strong>en</strong>d { <strong>en</strong>umerate }\ <strong>en</strong>d { <strong>en</strong>umerate }\ item Otro i n c i s o <strong>en</strong> e l segundo n i v e l <strong>de</strong> numeración\ <strong>en</strong>d { <strong>en</strong>umerate }\ item Otro i n c i s o <strong>en</strong> e l primer n i v e l <strong>de</strong> numeración\ <strong>en</strong>d { <strong>en</strong>umerate }que produce el texto:


158 L A TEX1. Este es el primer párrafo <strong>en</strong> el primer nivela) Queremos ver qué pasa al anidar <strong>en</strong> el segundo nivel1) Anidamos una vez más para el tercer nivel2) Otro inciso para que se vea qué pasa <strong>en</strong> el tercer nivela ′Numeración <strong>en</strong> el cuarto nivelb) Otro inciso <strong>en</strong> el segundo nivel <strong>de</strong> numeración2. Otro inciso <strong>en</strong> el primer nivel <strong>de</strong> numeraciónComo pue<strong>de</strong>s observar, cada nivel lleva su propio contador y usa sus propios métodos<strong>de</strong> numeración. Los valores por omisión, como acabas <strong>de</strong> ver, son los númerosarábigos seguidos <strong>de</strong> un punto para el primer nivel; las letras minúsculas seguidas <strong>de</strong>un paréntesis para el segundo nivel; nuevam<strong>en</strong>te números arábigos, pero seguidos <strong>de</strong>un paréntesis para el tercer nivel; y nuevam<strong>en</strong>te letras mayúsculas, pero seguidas <strong>de</strong> unapóstrofo para el cuarto nivel. L A TEX admite únicam<strong>en</strong>te cuatro niveles <strong>de</strong> anidami<strong>en</strong>topara las numeraciones. Las numeraciones también ti<strong>en</strong><strong>en</strong> <strong>de</strong>finidas espacio <strong>en</strong>tre losdistintos niveles y sangrías para los mismos. Pue<strong>de</strong>s <strong>de</strong>finir qué tipo <strong>de</strong> numeración utilice.La manera más fácil es incluy<strong>en</strong>do el paquete para numeraciones <strong>en</strong> el preámbulo<strong>de</strong> tu docum<strong>en</strong>to fu<strong>en</strong>te, \usepackage{<strong>en</strong>umerate} y <strong>en</strong>tonces podrás marcar qué tipo <strong>de</strong>numeración <strong>de</strong>seas, colocando el que correspon<strong>de</strong>ría al primero <strong>de</strong> la lista:\ begin { <strong>en</strong>umerate } [ ( a ) ]\ item Es un paquete <strong>de</strong> 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<strong>en</strong> prácticam<strong>en</strong>te todos l o s sistemas Unix , y que estáampliam<strong>en</strong>te docum<strong>en</strong>tado .\ item La docum<strong>en</strong>tación vi<strong>en</strong>e con \ textnormal { \ LaTeX { } } ,por l o que está accesible .\ <strong>en</strong>d { <strong>en</strong>umerate }Con esta opción, produces la numeración con las etiquetas que <strong>de</strong>seas:(a) Es un paquete <strong>de</strong> distribución gratuita, disponible <strong>en</strong> prácticam<strong>en</strong>te todos los sistemasUnix, y que está ampliam<strong>en</strong>te docum<strong>en</strong>tado.(b) La docum<strong>en</strong>tación vi<strong>en</strong>e con L A TEX, por lo que está accesible.


6.6 Listas <strong>de</strong> <strong>en</strong>unciados o párrafos 159Mi<strong>en</strong>tras que\ begin { <strong>en</strong>umerate } [ I . ]\ item Es un paquete <strong>de</strong> 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 <strong>en</strong>prácticam<strong>en</strong>te todos l o s sistemas Unix , y que estáampliam<strong>en</strong>te docum<strong>en</strong>tado .\ item La docum<strong>en</strong>tación vi<strong>en</strong>e con \ textnormal { \ LaTeX { } } ,por l o que está accesible .\ <strong>en</strong>d { <strong>en</strong>umerate }produceI. Es un paquete <strong>de</strong> distribución gratuita, disponible <strong>en</strong> prácticam<strong>en</strong>te todos los sistemasUnix, y que está ampliam<strong>en</strong>te docum<strong>en</strong>tado.II. La docum<strong>en</strong>tación vi<strong>en</strong>e con L A TEX, por lo que está accesible.A<strong>de</strong>más <strong>de</strong>l tipo <strong>de</strong> número a usar, indicas también una cierta manera <strong>de</strong> editarlo.Por ejemplo, <strong>en</strong> el caso anterior, cuando usas minúsculas las colocas <strong>en</strong>tre paréntesis,mi<strong>en</strong>tras que cuando usas números romanos <strong>en</strong> mayúscula, al número lo haces seguirpor un punto.Las maneras que ti<strong>en</strong>es <strong>de</strong> numerar pres<strong>en</strong>tan al tipo <strong>de</strong> letra que va a ir, precedidoy/o seguido <strong>de</strong> algún separador, como ):,-:Arábigos. El valor por omisión para el primer nivel. [1.]Letras minúsculas. [a−]Letras mayúsculas. [A:]Números romanos <strong>en</strong> minúscula. [ i .]Números romanos <strong>en</strong> mayúscula. [ I .]Si aparece <strong>en</strong>tre los corchetes algo que no sea i<strong>de</strong>ntificado como el primer número<strong>de</strong> cierto tipo, L A TEX simplem<strong>en</strong>te repetirá esa ca<strong>de</strong>na fr<strong>en</strong>te a cada uno <strong>de</strong> los párrafosmarcados con \item. Si <strong>de</strong>seas, por ejemplo, agregar un texto antes <strong>de</strong>l número, comoNota 1, lo que <strong>de</strong>bes hacer es <strong>en</strong>cerrar <strong>en</strong>tre llaves lo que no correspon<strong>de</strong> al número.\ begin { <strong>en</strong>umerate } [ { Nota } 1 . ]\ item Primera nota .\ item Segunda nota .\ <strong>en</strong>d { <strong>en</strong>umerate }Nota 1. Primera nota.Nota 2. Segunda nota.Cabe aclarar que la sustitución que hagas para el tipo <strong>de</strong> numeración afecta únicam<strong>en</strong>teal nivel <strong>en</strong> el que aparece. Los niveles anidados seguirán la conv<strong>en</strong>ción poromisión <strong>de</strong>scrita arriba.


160 L A TEX6.6.2. Listas marcadasCuando simplem<strong>en</strong>te quieres marcar a cada párrafo con algún carácter, como unguión, un punto o algo similar, pue<strong>de</strong>s utilizar las listas <strong>de</strong> párrafos:\ begin { i t e m i z e }\ item . . .\ item . . .. . .\ <strong>en</strong>d { i t e m i z e }También estas listas las pue<strong>de</strong>s anidar <strong>en</strong>tre sí hasta cuatro niveles <strong>de</strong> profundidad,cambiando el carácter que marca a los distintos párrafos. Observa el sigui<strong>en</strong>te ejemplo,con el código <strong>de</strong> L A TEX a la izquierda y el resultado a la <strong>de</strong>recha.\ begin { i t e m i z e }\ item Primero <strong>de</strong>l primer n i v e l\ begin { i t e m i z e }\ item Primero <strong>de</strong>l segundo n i v e l\ begin { i t e m i z e }\ item Primero <strong>de</strong>l t e r c e r n i v e l\ begin { i t e m i z e }\ item Primero <strong>de</strong>l cuarto n i v e l\ item Segundo <strong>de</strong>l cuarto n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l t e r c e r n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l segundo n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l primer n i v e l\ <strong>en</strong>d { i t e m i z e }Primero <strong>de</strong>l primer nivel• Primero <strong>de</strong>l segundo nivel◦ Primero <strong>de</strong>l tercer nivel⋄ Primero <strong>de</strong>l cuarto nivel⋄ Segundo <strong>de</strong>l cuarto nivel◦ Segundo <strong>de</strong>l tercer nivel• Segundo <strong>de</strong>l segundo nivelSegundo <strong>de</strong>l primer nivelAl igual que <strong>en</strong> las numeraciones, no pue<strong>de</strong>s t<strong>en</strong>er más <strong>de</strong> cuatro anidami<strong>en</strong>tos <strong>de</strong>lmismo tipo <strong>de</strong> listas.Pue<strong>de</strong>s modificar el carácter que quieras que use como marca <strong>en</strong> la lista, colocandoel carácter <strong>de</strong>seado <strong>en</strong>tre corchetes a continuación <strong>de</strong> \item <strong>en</strong> el párrafo seleccionado.El código se <strong>en</strong>cu<strong>en</strong>tra a la izquierda y el resultado a la <strong>de</strong>recha.


6.6 Listas <strong>de</strong> <strong>en</strong>unciados o párrafos 161\ begin { i t e m i z e }\ \ item [ −] Primero <strong>de</strong>l primer n i v e l\ begin { i t e m i z e }\ item [ + ] Primero <strong>de</strong>l segundo n i v e l\ begin { i t e m i z e }\ item [ : ] Primero <strong>de</strong>l t e r c e r n i v e l\ begin { i t e m i z e }\ item [ > ] Primero <strong>de</strong>l cuarto n i v e l\ item Segundo <strong>de</strong>l cuarto n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l t e r c e r n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l segundo n i v e l\ <strong>en</strong>d { i t e m i z e }\ item Segundo <strong>de</strong>l primer n i v e l\ <strong>en</strong>d { i t e m i z e }- Primero <strong>de</strong>l primer nivel+ Primero <strong>de</strong>l segundo nivel: Primero <strong>de</strong>l tercer nivel> Primero <strong>de</strong>l cuarto nivel⋄ Segundo <strong>de</strong>l cuarto nivel◦ Segundo <strong>de</strong>l tercer nivel• Segundo <strong>de</strong>l segundo nivelSegundo <strong>de</strong>l primer nivelComo pue<strong>de</strong>s observar, a difer<strong>en</strong>cia <strong>de</strong> las numeraciones, únicam<strong>en</strong>te cambia elpárrafo <strong>de</strong> la lista que hayas marcado. El resto <strong>de</strong> las marcas se manti<strong>en</strong>e igual. Haymanera <strong>de</strong> cambiar la marca para todos los elem<strong>en</strong>tos <strong>de</strong>l nivel <strong>de</strong> anidami<strong>en</strong>to, <strong>de</strong> lamisma manera que se hizo con las numeraciones.6.6.3. DescripcionesEl formato para las <strong>de</strong>scripciones es:\ begin { d e s c r i p t i o n }. . .〈párrafos-marcados〉. . .\ <strong>en</strong>d { d e s c r i p t i o n }don<strong>de</strong> cada párrafo marcado lleva inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> \item, <strong>en</strong>tre corchetes,el título que quieres aparezca para la <strong>de</strong>scripción. Este título aparecerá con otro tipo<strong>de</strong> letra que el normal, para <strong>de</strong>stacarlo. El resto <strong>de</strong>l párrafo se alineará <strong>de</strong>jando unapequeña sangría. Sigue un ejemplo <strong>en</strong> el sigui<strong>en</strong>te código.


162 L A TEX\ begin { d e s c r i p t i o n }\ item [ <strong>en</strong>umerate : ] Cada n i v e l se va numerando mant<strong>en</strong>i<strong>en</strong>do uncontador para t a l e f e c t o .\ begin { d e s c r i p t i o n }\ item [ segundo n i v e l ] Es una prueba para ver s i t i e n e s<strong>en</strong>tidometer o t r o n i v e l más <strong>en</strong> <strong>de</strong>scripciones .\ begin { d e s c r i p t i o n }\ item [ t e r c e r n i v e l ] Otra p r u e b i t a más <strong>de</strong>l asunto\ begin { d e s c r i p t i o n }\ item [ cuarto n i v e l ] Y aún hay más\ begin { d e s c r i p t i o n }\ item [ quinto n i v e l ] A ver s i <strong>en</strong> este t i p o <strong>de</strong> l i s t a ssí se vale\ <strong>en</strong>d { d e s c r i p t i o n }\ <strong>en</strong>d { d e s c r i p t i o n }\ <strong>en</strong>d { d e s c r i p t i o n }\ <strong>en</strong>d { d e s c r i p t i o n }\ item [ i t e m i z e : ] Cada pá r r a f o se marca con un <strong>de</strong>terminado carácter ,<strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l n i v e l <strong>de</strong> anidami<strong>en</strong>to .\ item [ d e s c r i p t i o n : ] Sirve 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 .\ <strong>en</strong>d { d e s c r i p t i o n }que produce el sigui<strong>en</strong>te texto:<strong>en</strong>umerate: Cada nivel se va numerando mant<strong>en</strong>i<strong>en</strong>do un contador para tal efecto.segundo nivel Es una prueba para ver si ti<strong>en</strong>e s<strong>en</strong>tido meter otro nivel más <strong>en</strong><strong>de</strong>scripciones.tercer nivel Otra pruebita más <strong>de</strong>l asuntocuarto nivel Y aún hay másquinto nivel A ver si <strong>en</strong> este tipo <strong>de</strong> listas sí se valeitemize: Cada párrafo se marca con un <strong>de</strong>terminado carácter, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l nivel <strong>de</strong>anidami<strong>en</strong>to.<strong>de</strong>scription: Sirve para poner explicaciones o <strong>de</strong>finiciones.Es importante que notes que <strong>en</strong> el caso <strong>de</strong> las <strong>de</strong>scripciones pue<strong>de</strong>s anidar tantasveces como lo <strong>de</strong>sees.Vamos a crear un archivo nuevo para escribir algunas preguntas y respuestas respectoa las listas <strong>de</strong> párrafos que te acabamos <strong>de</strong> pres<strong>en</strong>tar. Para ello:Actividad 6.15 Crea un archivo con clase <strong>de</strong> docum<strong>en</strong>to article y que use los mismospaquetes que usa CalcProp.tex.


6.6 Listas <strong>de</strong> <strong>en</strong>unciados o párrafos 163Actividad 6.16 Ponle como título tu nombre y el número <strong>de</strong> actividad.Actividad 6.17 A continuación, escribe <strong>en</strong> el archivo el nombre <strong>de</strong> cada paquete queusas y una breve <strong>de</strong>scripción <strong>de</strong> para qué lo usas (los nombres <strong>de</strong> los paquetes te <strong>de</strong>b<strong>en</strong>dar una i<strong>de</strong>a).Ahora que ya ti<strong>en</strong>es más comandos que teclear, veremos algunas tareas que Emacste facilita:1. Aparear bi<strong>en</strong> los ambi<strong>en</strong>tes <strong>en</strong>\ begin { . . . }. . .\ <strong>en</strong>d { . . . } +C-e y <strong>en</strong> la línea <strong>de</strong> comando <strong>de</strong> Emacs apare-Esto se consigue tecleando C-cceráEnvironm<strong>en</strong>t type ( d e f a u l t . . . )G<strong>en</strong>eralm<strong>en</strong>te, el valor por omisión es el <strong>de</strong>l último ambi<strong>en</strong>te elegido o itemize,si es la primera vez <strong>en</strong> la sesión que lo solicitas. Si tecleas Enter , proce<strong>de</strong>rá acrear la pareja \begin {..} \<strong>en</strong>d {..}, <strong>de</strong>jando el cursor <strong>en</strong>tre ellos para que procedasa escribir. Si el ambi<strong>en</strong>te que elegiste es alguna lista, coloca el primer \item. Si lalista elegida es <strong>de</strong>scription, pregunta por la primera etiqueta.Este comando <strong>de</strong> Emacs va guardando los ambi<strong>en</strong>tes que le vas solicitando. Pue<strong>de</strong>srecorrer la lista <strong>de</strong> comandos usados con la flecha vertical. Cuando es la primeravez que vas a usar un ambi<strong>en</strong>te dado, simplem<strong>en</strong>te tecleas el nombre <strong>de</strong>l ambi<strong>en</strong>te(por ejemplo, <strong>en</strong>umerate, <strong>de</strong>scription) para que lo meta a la lista <strong>de</strong> ambi<strong>en</strong>tes“disponibles”.2. Cerrar algún ambi<strong>en</strong>te que esté abierto: C-c ] . Con este comando, Emacs colocael \<strong>en</strong>d {..} <strong>de</strong>l \begin {..} más cercano que no haya sido cerrado.Actividad 6.18 Haz una lista <strong>de</strong> invitados a una boda, don<strong>de</strong> separes los invitados <strong>de</strong>los padres <strong>de</strong>l novio, los padres <strong>de</strong> la novia, los invitados <strong>de</strong>l novio y los invitados <strong>de</strong>la novia. Esta lista <strong>de</strong>berá aparecer <strong>en</strong> el archivo que acabas <strong>de</strong> crear. La lista <strong>de</strong>beráfacilitar sacar el total <strong>de</strong> invitados a la boda.6.6.4. Listas más compactasComo pue<strong>de</strong>s observar <strong>de</strong> los ejemplos que mostramos, muchas veces el espacio<strong>en</strong>tre los incisos <strong>en</strong> cada tipo <strong>de</strong> lista es excesivo. L A TEX cu<strong>en</strong>ta con un paquete <strong>de</strong>L A TEX que te permite acortar estos espacios, el paquete paralist . Este paquete, a<strong>de</strong>más <strong>de</strong>acortar los espacios verticales, asume las funciones <strong>de</strong>l paquete <strong>en</strong>umerate permiti<strong>en</strong>domodificar las etiquetas <strong>de</strong> las distintas listas. Para po<strong>de</strong>r hacer esto último, pasas comoopciones al cargar el paquete new<strong>en</strong>um y newitem <strong>de</strong> la sigui<strong>en</strong>te manera:


164 L A TEX6.7. Tablas\ usepackage [ new<strong>en</strong>um , newitem ] { p a r a l i s t }Si usas este paquete, es conv<strong>en</strong>i<strong>en</strong>te ya no cargar el paquete <strong>en</strong>umerate. Proporcionalos sigui<strong>en</strong>tes ambi<strong>en</strong>tes:\ begin { compact<strong>en</strong>um }. . .\ <strong>en</strong>d { compact<strong>en</strong>um }\ begin { compactitem }. . .\ <strong>en</strong>d { compactitem }\ begin { compact<strong>de</strong>sc }. . .\ <strong>en</strong>d { compact<strong>de</strong>sc }Estos tres ambi<strong>en</strong>tes resultan muy cómodos para compactar un poco el texto quese está produci<strong>en</strong>do. En este libro es más común que usemos estos ambi<strong>en</strong>tes que losoriginales <strong>de</strong> L A TEX. paralist ti<strong>en</strong>e a<strong>de</strong>más listas “corridas” <strong>en</strong> un único r<strong>en</strong>glón, pero nolas revisaremos <strong>en</strong> este mom<strong>en</strong>to.En g<strong>en</strong>eral, L A TEX provee comandos para <strong>de</strong>finir tablas <strong>de</strong> los tipos más variados.Veremos acá únicam<strong>en</strong>te las más s<strong>en</strong>cillas, aunque no por eso poco po<strong>de</strong>rosas.Una tabla es un conjunto <strong>de</strong> r<strong>en</strong>glones alineados por columnas. Por ello, para queL A TEX vaya acomodando las columnas le <strong>de</strong>bes dar el número <strong>de</strong> columnas y el formato<strong>de</strong> <strong>de</strong> cada una <strong>de</strong> ellas. El formato g<strong>en</strong>eral <strong>de</strong> una tabla <strong>de</strong> texto es el sigui<strong>en</strong>te:\ begin { t a b u l a r } [ ] { }\ <strong>en</strong>d { t a b u l a r }Es necesario aclarar que una tabla pue<strong>de</strong> aparecer <strong>en</strong> cualquier posición don<strong>de</strong> aparezcauna palabra. Por ello, es conv<strong>en</strong>i<strong>en</strong>te <strong>en</strong> la inm<strong>en</strong>sa mayoría <strong>de</strong> los casos prece<strong>de</strong>ry suce<strong>de</strong>r a la tabla con un r<strong>en</strong>glón <strong>en</strong> blanco.El argum<strong>en</strong>to que va <strong>en</strong>tre corchetes, se refiere al caso <strong>en</strong> que <strong>de</strong>sees quela tabla aparezca a continuación <strong>de</strong> una palabra, si la queremos alineada “<strong>de</strong>s<strong>de</strong> arriba”([ t ]), <strong>de</strong>s<strong>de</strong> abajo ([b]) o c<strong>en</strong>trada [c], que es el valor por omisión. Este parámetro not<strong>en</strong>drá s<strong>en</strong>tido si se <strong>de</strong>ja, como acabamos <strong>de</strong> m<strong>en</strong>cionar, un r<strong>en</strong>glón <strong>en</strong> blanco antes y<strong>de</strong>spués <strong>de</strong> la tabla.El argum<strong>en</strong>to se refiere al formato que <strong>de</strong>berán t<strong>en</strong>er las columnas <strong>de</strong> latabla, y que será aplicado a cada uno <strong>de</strong> los r<strong>en</strong>glones. Debes especificar el formatopara cada una <strong>de</strong> las columnas que <strong>de</strong>seas t<strong>en</strong>er <strong>en</strong> la tabla. También especificas si


6.7 Tablas 165se <strong>de</strong>be colocar algo <strong>en</strong>tre las columnas. De esto, correspon<strong>de</strong> a una lista <strong>de</strong>especificadores, que se refier<strong>en</strong> a la sucesión <strong>de</strong> columnas e intercolumnas:Tabla 6.5Modificadores para la <strong>de</strong>finición <strong>de</strong> columnasEspecificaciónDescripciónlrcp{}m{}Especifica que el cont<strong>en</strong>ido <strong>de</strong> esta columna se colocará pegado ala izquierda, y ocupará tanto espacio como requiera para quedarcont<strong>en</strong>ido <strong>en</strong> un r<strong>en</strong>glón.Similar al anterior, pero pegado a la <strong>de</strong>recha.Similar al anterior, pero c<strong>en</strong>trado.Da un ancho fijo para la columna. L A TEX acomodará el texto comosi fuera un párrafo, ocupando tantos r<strong>en</strong>glones como sea necesario.Igual que p, excepto que si hay columnas que dan un número distinto<strong>de</strong> líneas para el mismo r<strong>en</strong>glón, c<strong>en</strong>tra verticalm<strong>en</strong>te el cont<strong>en</strong>ido<strong>de</strong> las columna.Para estas dos opciones, el {} <strong>de</strong>berá estar dado <strong>en</strong>:incmmmptempulgadasc<strong>en</strong>tímetrosmilímetrospuntosancho <strong>de</strong> carácterAlgún nombre <strong>de</strong> longitud| Una línea vertical que separa columnas.|| Dos líneas verticales separando las columnas.En los primeros tres casos, el tamaño final <strong>de</strong> la columna será el máximo <strong>de</strong> todoslos r<strong>en</strong>glones <strong>de</strong> la tabla. Si es que va a haber mucho texto <strong>en</strong> cada columna, te recom<strong>en</strong>damosusar la cuarta o quinta <strong>de</strong>scripción, para que el r<strong>en</strong>glón se “doble” y seconforme un párrafo.Los r<strong>en</strong>glones se compon<strong>en</strong> <strong>de</strong> material que quieres <strong>en</strong> cada columna. Cada vez que<strong>de</strong>seas cambiar <strong>de</strong> columna, <strong>de</strong>bes insertar un carácter & y cada vez que quieras cambiar<strong>de</strong> r<strong>en</strong>glón <strong>de</strong>berás agregar al final <strong>de</strong>l r<strong>en</strong>glón \\.Pue<strong>de</strong>s colocar líneas <strong>en</strong>tre cada dos r<strong>en</strong>glones con el comando \hline. Cuando noes el primero <strong>de</strong> los r<strong>en</strong>glones, <strong>de</strong>be v<strong>en</strong>ir a continuación <strong>de</strong> un cambio <strong>de</strong> r<strong>en</strong>glón.


166 L A TEXVeamos un ejemplo s<strong>en</strong>cillo a continuación.\ begin { t a b u l a r } [ t ] { cccc }l e t r a s y símbolos \ \palabras & oraciones& pá r r a f o s & subsecciones \ \secciones & capí t u l o s& partes & docum<strong>en</strong>to\ <strong>en</strong>d { t a b u l a r }Se ti<strong>en</strong>e una tabla con cuatro columnas y dos r<strong>en</strong>glones y se usa & para separarlas columnas <strong>en</strong>tre sí. Se utilizan \\ para separar los r<strong>en</strong>glones. La tabla queda <strong>de</strong> lasigui<strong>en</strong>te manera:letras y símbolospalabras oraciones párrafos subseccionessecciones capítulos partes docum<strong>en</strong>toEs importante que notes que lo que correspon<strong>de</strong> a un r<strong>en</strong>glón formado no forzosam<strong>en</strong>teti<strong>en</strong>e que aparecer <strong>en</strong> el mismo r<strong>en</strong>glón <strong>en</strong> el código. Sólo <strong>en</strong> el caso <strong>en</strong> que laespecificación <strong>de</strong> la columna sea p o m, el introducir un r<strong>en</strong>glón <strong>en</strong> blanco será interpretadocomo cambio <strong>de</strong> párrafo, que lo realiza <strong>de</strong>ntro <strong>de</strong>l mismo r<strong>en</strong>glón <strong>de</strong> la tabla y<strong>en</strong> la misma columna.Actividad 6.19 Crea un archivo Tablas.tex y copia el preámbulo <strong>de</strong> CalcProp.tex.Copia la <strong>de</strong>finición <strong>de</strong> la tabla anterior, compila y ve el resultado.Actividad 6.20 Modifica la tabla anterior para que que<strong>de</strong> <strong>de</strong> la sigui<strong>en</strong>te manera:letras y símbolos palabras oracionespárrafos subsecciones seccionescapítulos partes docum<strong>en</strong>todon<strong>de</strong> la primera columna está justificada a la izquierda, la segunda c<strong>en</strong>trada y la terceraa la <strong>de</strong>recha. La tabla ti<strong>en</strong>e tres columnas <strong>en</strong> lugar <strong>de</strong> cuatro.6.7.1. MulticolumnasEn la tabla anterior, el texto letras y símbolos ocupa mucho más espacio que el resto<strong>de</strong> los textos <strong>en</strong> esa columna. Por ello, se toma la <strong>de</strong>cisión <strong>de</strong> que este texto ocupe doscolumnas. Si lo separas “a pie” queda mal distribuido, pues intervi<strong>en</strong>e el espacio <strong>en</strong>trecolumnas:


6.7 Tablas 167letras y símbolospalabras oraciones párrafos subseccionessecciones capítulos partes docum<strong>en</strong>toPara que se c<strong>en</strong>tre <strong>en</strong> dos columnas pue<strong>de</strong>s utilizar el comando\ multicolumn { } { } { < t e x t o > }don<strong>de</strong> {} es el número <strong>de</strong> columnas <strong>de</strong> la tabla original que va a ocupar; {#}es la manera <strong>de</strong> acomodar esa columna, con sus posibles carácteres <strong>en</strong>tre columnas; y{} es lo que queremos que aparezca <strong>en</strong> esa nueva columna. Un \multicolumn pue<strong>de</strong>aparecer <strong>en</strong> cualquier lugar don<strong>de</strong> pueda aparecer el cont<strong>en</strong>ido <strong>de</strong> una columna, al inicio<strong>de</strong> un r<strong>en</strong>glón o inmediatam<strong>en</strong>te a continuación <strong>de</strong> un &. Debes t<strong>en</strong>er cuidado <strong>de</strong> queel número <strong>de</strong> columnas que se coloca <strong>en</strong> {} no exceda el número <strong>de</strong> columnasque quedan disponibles <strong>en</strong> el r<strong>en</strong>glón, a partir <strong>de</strong> la columna don<strong>de</strong> se está colocandoel comando. La tabla queda como sigue:\ begin { t a b u l a r } [ t ] { cccc }\ multicolumn { 2 } { c } { l e t r a s y símbolos } \ \palabras& oraciones & pá r r a f o s & subsecciones \ \secciones & capí t u l o s & partes & docum<strong>en</strong>to\ <strong>en</strong>d { t a b u l a r }y se forma como sigue:letras y símbolospalabras oraciones párrafos subseccionessecciones capítulos partes docum<strong>en</strong>toPue<strong>de</strong>s usar el comando <strong>de</strong> \multicolumn también para modificar exclusivam<strong>en</strong>te elcont<strong>en</strong>ido <strong>de</strong> una columna <strong>en</strong> un <strong>de</strong>terminado r<strong>en</strong>glón. Por ejemplo, si <strong>de</strong>seas que paraesa columna <strong>en</strong> ese r<strong>en</strong>glón <strong>en</strong> lugar <strong>de</strong> estar c<strong>en</strong>trado esté justificado a la <strong>de</strong>recha,o que no t<strong>en</strong>ga separadores <strong>en</strong>tre columnas. Pue<strong>de</strong>s hacer esto para lograr, sin juntarcolumnas, casi el mismo efecto que lograste uni<strong>en</strong>do dos columnas:


168 L A TEX\ begin { t a b u l a r } [ t ] { cccc }\ multicolumn { 1 } { r } { l e t r a s y}&\ multicolumn { 1 } { l } { símbolos } \ \palabras& oraciones & pá r r a f o s & subsecciones \ \secciones & capí t u l o s & partes & docum<strong>en</strong>to\ <strong>en</strong>d { t a b u l a r }El texto formado queda como se muestra a continuación. Nota que, ahora sí, <strong>de</strong>saparecióel espacio <strong>de</strong> más <strong>en</strong>tre “y” y “símbolos”.letras y símbolospalabras oraciones párrafos subseccionessecciones capítulos partes docum<strong>en</strong>toTambién pue<strong>de</strong>s aprovechar las multicolumnas para poner títulos a la tabla o pies<strong>de</strong> página:Compon<strong>en</strong>tes <strong>de</strong> un docum<strong>en</strong>to <strong>de</strong> LaTeXletras y símbolospalabras oraciones párrafos subseccionessecciones capítulos partes docum<strong>en</strong>toSe pue<strong>de</strong> numerar a partir <strong>de</strong> subseccionesEn g<strong>en</strong>eral pue<strong>de</strong>s agregarle modificadores a las columnas para que el texto <strong>de</strong> esacolumna t<strong>en</strong>ga un tamaño o tipo particular. Por ejemplo, para el título <strong>de</strong> la tabla agregasal principio <strong>de</strong>l texto el modificador \bf y para el último r<strong>en</strong>glón cambias el tamaño<strong>de</strong>l carácter a \footnotesize. Estos cambios se aplican únicam<strong>en</strong>te a esa columna y <strong>en</strong>ese r<strong>en</strong>glón. Asimismo, pue<strong>de</strong>s saltar líneas <strong>en</strong> blanco <strong>en</strong>tre r<strong>en</strong>glones, simplem<strong>en</strong>teagregando cambios <strong>de</strong> línea ( \\ ) al final <strong>de</strong>l r<strong>en</strong>glón.Actividad 6.21 Repite la tabla que construiste y modifícala para agregarle el título yel último r<strong>en</strong>glón.6.7.2. Separación <strong>de</strong> r<strong>en</strong>glones y columnasComo m<strong>en</strong>cionamos al <strong>de</strong>cir qué pue<strong>de</strong> ir <strong>en</strong> {}, dijimos que pue<strong>de</strong>s t<strong>en</strong>er unao dos líneas verticales que separan a las columnas. También pue<strong>de</strong>s t<strong>en</strong>er líneas horizontalesque separ<strong>en</strong> a los r<strong>en</strong>glones. Veamos la sigui<strong>en</strong>te tabla que incluye separadores<strong>de</strong> columna y <strong>de</strong> r<strong>en</strong>glón.


6.7 Tablas 169Ambi<strong>en</strong>te Nombre DescripciónReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libro o unartículo. No ti<strong>en</strong>e capítulos, sino que agrupa a partir <strong>de</strong>secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizarás para la<strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong> pequeños manuales, etc.Permite escribir <strong>en</strong> dos columnas fácilm<strong>en</strong>te.que fue producida por el sigui<strong>en</strong>te código:\ begin { t a b u l a r } [ t ] { | l | l | p {8cm } | }\ h l i n eAmbi<strong>en</strong>te& Nombre& D e s c r i p c i ón \ \\ h l i n eReporte&r e p o r t&Se u t i l i z a para cosas m<strong>en</strong>os formalesque un l i b r o o un a r t ículo . Not i e n e capí t u l o s , sino que agrupaa p a r t i r <strong>de</strong> secciones . \ \\ h l i n eA r t ículo& a r t i c l e &Es , t a l vez , e l ambi<strong>en</strong>te que más seguidou t i l i z a r ás para l a <strong>en</strong>trega<strong>de</strong> tareas , e l a b o r a c i ón <strong>de</strong> pequeñosmanuales , etc . Permite e s c r i b i r <strong>en</strong> doscolumnas f ácilm<strong>en</strong>te . \ \\ h l i n e\ <strong>en</strong>d { t a b u l a r }Observa que antes <strong>de</strong> cada \ hline, excepto el primero, <strong>de</strong>be haber un cambio <strong>de</strong> r<strong>en</strong>glón.En cambio, <strong>de</strong>spués <strong>de</strong>l \ hline no es necesario un cambio <strong>de</strong> r<strong>en</strong>glón. Como yavimos, pue<strong>de</strong>s modificar el tipo y/o tamaño <strong>de</strong> cualquiera <strong>de</strong> los cont<strong>en</strong>idos <strong>de</strong> una columna<strong>en</strong> un <strong>de</strong>terminado r<strong>en</strong>glón. Por ejemplo, se acostumbra que los títulos vayan <strong>en</strong>negritas. También <strong>de</strong>seas líneas dobles horizontales <strong>en</strong>tre los títulos y el cont<strong>en</strong>ido <strong>de</strong> latabla. Juguemos un poco con eso. Para no ocupar tanto espacio nada más mostraremosel r<strong>en</strong>glón o r<strong>en</strong>glones que estemos modificando. Lo primero que haremos es separar alos <strong>en</strong>cabezados <strong>de</strong> columnas con líneas dobles y ponerlos <strong>en</strong> negritas, <strong>de</strong> la sigui<strong>en</strong>temanera:\ h l i n e \ h l i n e\ bf Ambi<strong>en</strong>te& \ Large \ t e x t b f { Nombre } & \ sc D e s c r i p c i ón \ \\ h l i n e \ h l i n eIntegrados estos cambios, la tabla se ve como sigue:


170 L A TEXAmbi<strong>en</strong>teNombre DESCRIPCIÓNReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libroo un artículo. No ti<strong>en</strong>e capítulos, sino queagrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizaránpara la <strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong>pequeños manuales, etc. Permite escribir <strong>en</strong> doscolumnas fácilm<strong>en</strong>te.Supongamos que le agregas dos r<strong>en</strong>glones más, pero que por el mom<strong>en</strong>to no ti<strong>en</strong>es<strong>de</strong>cidido qué escribir <strong>en</strong> la <strong>de</strong>scripción:Acetatos&seminar \ \ \ h l i n eCartas& l e t t e r \ \ \ h l i n eY veamos cómo se ve la tabla:Ambi<strong>en</strong>teNombre DESCRIPCIÓNReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libroo un artículo. No ti<strong>en</strong>e capítulos, sino queagrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizaráspara la <strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong>pequeños manuales, etc. Te permite escribir <strong>en</strong>dos columnas fácilm<strong>en</strong>te.AcetatosCartasseminarletterNota que falta la línea vertical al final. Esto es porque no especificaste nada para latercera columna. Cuando ti<strong>en</strong>es líneas verticales para separar columnas, <strong>de</strong>bes “completar”todas las columnas <strong>en</strong> cada r<strong>en</strong>glón. Los r<strong>en</strong>glones agregados <strong>de</strong>bieron t<strong>en</strong>er lasigui<strong>en</strong>te forma:Acetatos &seminar & \ \ \ h l i n eCartas & l e t t e r & \ \ \ h l i n eVeamos cómo queda la tabla, que se muestra a continuación.


6.7 Tablas 171Nombre DESCRIPCIÓNAmbi<strong>en</strong>teReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libroo un artículo. No ti<strong>en</strong>e capítulos, sino queagrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizaráspara la <strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong>pequeños manuales, etc. Te permite escribir <strong>en</strong>dos columnas fácilm<strong>en</strong>te.Acetatos seminarCartas letterSupongamos ahora que quieres agregarle a la tabla un título, que que<strong>de</strong> <strong>de</strong>ntro<strong>de</strong> la tabla <strong>en</strong> el primer r<strong>en</strong>glón. Para eso pue<strong>de</strong>s utilizar nuevam<strong>en</strong>te el comando\multicolumn. Debes t<strong>en</strong>er cuidado si es que las columnas originales ti<strong>en</strong><strong>en</strong> separaciónpor columnas, porque <strong>de</strong>bes especificar explícitam<strong>en</strong>te las nuevas separaciones. Quieresel título c<strong>en</strong>trado, pero <strong>de</strong> ancho mayor que el resto <strong>de</strong> los r<strong>en</strong>glones. Para lograrlopones un r<strong>en</strong>glón <strong>en</strong> blanco antes y <strong>de</strong>spués. Veamos cómo funciona <strong>en</strong> la tabla queestamos usando como ejemplo:\ multicolumn { 3 } { | c | } { } \ \\ multicolumn { 3 } { | c | } { \ Large \ t e x t b f { Clases <strong>de</strong> docum<strong>en</strong>tos<strong>en</strong> \ textnormal { \ LaTeX { } } } } \ \\ multicolumn { 3 } { | c | } { } \ \ \ h l i n eClases <strong>de</strong> docum<strong>en</strong>tos <strong>en</strong> L A TEXNombre DESCRIPCIÓNAmbi<strong>en</strong>teReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libroo un artículo. No ti<strong>en</strong>e capítulos, sino queagrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizaránpara la <strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong>pequeños manuales, etc. Permite escribir <strong>en</strong> doscolumnas fácilm<strong>en</strong>te.De los ejemplos anteriores, es claro que cuando colocas carácteres <strong>en</strong>tre las columnas,<strong>de</strong>jar r<strong>en</strong>glones <strong>en</strong> blanco no es trivial.Al igual que cuando no ti<strong>en</strong>es líneas <strong>en</strong>tre las columnas, pue<strong>de</strong>s utilizar \multicolumnpara quitar las líneas <strong>de</strong> una <strong>de</strong>terminada columna <strong>en</strong> un cierto r<strong>en</strong>glón. La maneracomo se asocian las separaciones <strong>de</strong> columnas son:


172 L A TEX– La primera columna ti<strong>en</strong>e asociadas la línea a su izquierda y a su <strong>de</strong>recha.– A partir <strong>de</strong> la segunda columna, cada columna <strong>de</strong>be re<strong>de</strong>finir su línea <strong>de</strong>recha.Actividad 6.22 Codifica la sigui<strong>en</strong>te tabla, que es una nueva versión <strong>de</strong> la tabla anterior.T<strong>en</strong> cuidado con las líneas que separan las columnas. Observa que pue<strong>de</strong>s trabajara partir <strong>de</strong> la tabla ya codificada.Tema:Clases <strong>de</strong> docum<strong>en</strong>tos <strong>en</strong> L A TEXAmbi<strong>en</strong>te Nombre DESCRIPCIÓNReporte report Se utiliza para cosas m<strong>en</strong>os formales que un libroo un artículo. No ti<strong>en</strong>e capítulos, sino queagrupa a partir <strong>de</strong> secciones.Artículo article Es, tal vez, el ambi<strong>en</strong>te que más seguido utilizaráspara la <strong>en</strong>trega <strong>de</strong> tareas, elaboración <strong>de</strong>pequeños manuales, etc. Te permite escribir <strong>en</strong>dos columnas fácilm<strong>en</strong>te.** La lista no es exhaustiva6.7.3. Líneas “incompletas” verticales y horizontalesVeamos la tabla que se <strong>en</strong>cu<strong>en</strong>tra a continuación a la izquierda. Entre el segundo ytercer r<strong>en</strong>glón no quieres una línea completa, sino únicam<strong>en</strong>te una que cubra la segunday tercera columna. Esto se consigue con el comando \cline{ci-cf}, don<strong>de</strong> ci es elnúmero <strong>de</strong> la columna inicial y cf es el número <strong>de</strong> la columna final. A su lado se muestrala codificación <strong>de</strong> la tabla, don<strong>de</strong> pue<strong>de</strong>s ver <strong>en</strong> la cuarta línea <strong>de</strong> la codificación el uso<strong>de</strong>l comando \ cline{2−3}, que indica que la línea parcial empieza <strong>en</strong> la columna 2 ytermina <strong>en</strong> la 3.Verificador <strong>de</strong> ParidadSigmaQ 0 1 FPAR PAR NON 1NON NON PAR 0\ begin { t a b u l a r } { | c | c | c | | c | }\ h l i n e\ multicolumn { 4 } { | c | } { \ bf V e r i f i c a d o r \ <strong>de</strong> \Paridad } \ \ \ h l i n e \ h l i n e&\ multicolumn { 2 } { c | | } { \ bf Sigma }& \ \ \ c l i n e {2 −3}\ bf Q & 0 & 1 & F \ \ \ h l i n ePAR & PAR & NON & 1 \ \ \ h l i n eNON & NON & PAR & 0 \ \ \ h l i n e\ <strong>en</strong>d { t a b u l a r }


6.7 Tablas 173Ti<strong>en</strong>es también el comando \vline que introduce una línea <strong>de</strong> separación <strong>de</strong> columna,que cubre toda la columna. Se codificó como se muestra a la <strong>de</strong>recha <strong>de</strong> la tablaformada.Esta esPara mostrar la divisiónuna pruebaartificial\ begin { t a b u l a r } { | c | l | }\ h l i n eEsta es & una prueba \ \\ h l i n ePara mostrar \ v l i n e \ l ad i v i s i ón & a r t i f i c i a l \ \ \\ h l i n e\ <strong>en</strong>d { t a b u l a r }Como se pue<strong>de</strong> ver, <strong>en</strong> la cuarta línea <strong>de</strong>l código aparece, a mitad <strong>de</strong> la columna, elcomando \vline. Va seguido <strong>de</strong> la secu<strong>en</strong>cia \ que obliga a <strong>de</strong>jar un espacio <strong>en</strong> blanco<strong>en</strong>tre el comando y lo que sigue. También hay que recordar que el formato <strong>de</strong>l códigono influye <strong>en</strong> el <strong>de</strong> la tabla, por lo que pue<strong>de</strong>s partir r<strong>en</strong>glones arbitrariam<strong>en</strong>te <strong>en</strong> elcódigo.6.7.4. Espacio <strong>en</strong>tre los r<strong>en</strong>glonesPara terminar con esta sección hablaremos un poco <strong>de</strong> cómo “estirar” el espacio<strong>en</strong>tre r<strong>en</strong>glones <strong>de</strong> una tabla, forzando a que las separaciones <strong>de</strong> columna se mant<strong>en</strong>gan.Esto es <strong>de</strong>seable cuando quieres que haya más separación <strong>en</strong>tre r<strong>en</strong>glones que lanormal, pero no tanto espacio como lo da un r<strong>en</strong>glón <strong>en</strong> blanco. Pue<strong>de</strong>s modificar ladistancia dada por el cambio <strong>de</strong>l r<strong>en</strong>glón colocando un argum<strong>en</strong>to a continuación <strong>de</strong> \\con el formato [< num > < medida >]. Veamos un ejemplo, <strong>en</strong> el que agregamos 4y 10 puntos al cambio <strong>de</strong> r<strong>en</strong>glón. El código se <strong>en</strong>cu<strong>en</strong>tra a la <strong>de</strong>recha y la tabla formadaa la izquierda.Esta esPara mostrar la divisiónuna pruebaartificial\ begin { t a b u l a r } { | c | l | }\ h l i n eEsta es & una prueba \ \ [ 4 pt ]\ h l i n ePara mostrar \ v l i n e \ l ad i v i s i ón &a r t i f i c i a l \ \ [ 1 0 pt ]\ h l i n e\ <strong>en</strong>d { t a b u l a r }Observa que las líneas verticales que separan a las columnas se exti<strong>en</strong><strong>de</strong>n para cubrirtoda la columna.


174 L A TEX< num > pue<strong>de</strong> ser negativo también, forzando a que haya un “retroceso”. Elcódigo se <strong>en</strong>cu<strong>en</strong>tra a la <strong>de</strong>recha <strong>de</strong> la tabla formada:Esta esPara mostrar la divisiónuna pruebaartificialAcá mostramos el efecto <strong>de</strong> “subir” la rayaActividad 6.23 Codifica la sigui<strong>en</strong>te tabla:Bonetería Ci<strong>en</strong>tífica, S. A.PrecioAño bajo alto Com<strong>en</strong>tarios1971 97-245 Mal año.72 245-245 Poco comercio <strong>de</strong>bido aun invierno crudo.73 245-2001 Ningún gnus fue bu<strong>en</strong>gnus este año.\ begin { t a b u l a r } { | c | l | }\ h l i n eEsta es & una prueba \ \ [ 6 pt ]\ h l i n ePara mostrar \ v l i n e \ l ad i v i s i ón& a r t i f i c i a l \ \ [ 1 0 pt ]\ h l i n e\ multicolumn { 2 } { | l | } { Acámostramos \ v l i n e \e l e f e c t o <strong>de</strong> ‘ ‘ subir ’ ’l a raya } \ \ [ − 6 pt ]\ h l i n e\ <strong>en</strong>d { t a b u l a r }6.8. Fórmulas matemáticas y símbolos especialesHasta ahora has escrito texto que si bi<strong>en</strong> te permite escribir, por ejemplo, una novela,no te sirve <strong>de</strong> mucho para cuando quieres escribir texto un poco más especializado.En estas notas han aparecido muchos carácteres especiales. En g<strong>en</strong>eral, <strong>de</strong>seas po<strong>de</strong>rescribir carácteres especiales y, <strong>en</strong> particular, fórmulas matemáticas.Para algunos carácteres especiales, como pudieran ser las vocales ac<strong>en</strong>tuadas <strong>de</strong>lespañol, las diéresis <strong>en</strong> la u o la til<strong>de</strong> <strong>en</strong> la n, hemos logrado que Emacs se comportecomo máquina <strong>de</strong> escribir y haga que el apóstrofo (’), la til<strong>de</strong> (~) y las comillas (")se comport<strong>en</strong> lo que se conoce como símbolos “sordos”, esto es, que “no escuch<strong>en</strong>”hasta que se teclee el sigui<strong>en</strong>te carácter – o bi<strong>en</strong> está configurado el teclado para que


6.8 Matemáticas <strong>en</strong> L A TEX 175la combinación <strong>de</strong> tecla con Alt produzca los carácteres ac<strong>en</strong>tuados –. Sin embargo,pudiera ser que no estuviera Emacs habilitado <strong>de</strong> esta manera. En g<strong>en</strong>eral, L A TEX proveemecanismos para que se impriman una gran cantidad <strong>de</strong> símbolos que no aparec<strong>en</strong> <strong>en</strong>el inglés, pero que se usan <strong>en</strong> idiomas como el francés, el español y el alemán. Casitodos empiezan con una diagonal inversa \ y sigu<strong>en</strong> con el código especial dado a esecarácter. L A TEX los llama símbolos. Veamos a continuación una lista <strong>de</strong> los más usados:Tabla 6.6Ac<strong>en</strong>tos\‘{o} ò \~{o} õ \v{o} ǒ \c{o} o¸ \’{o} ó\={o} ō \H{o} ő \d{o} ọ \^{o} ô \.{o} ȯ\t{oo} ⁀oo \b{o} ō \"{o} ö \u{o} ŏ \’{\i} íEn todas estas combinaciones pue<strong>de</strong> aparecer cualquier carácter alfabético. En elcaso <strong>de</strong> que lo que siga a la \ sea un símbolo especial, no es necesario poner al argum<strong>en</strong>to<strong>en</strong>tre llaves: \~a ã y \^d ˆd.Los símbolos que sigu<strong>en</strong> no ti<strong>en</strong><strong>en</strong> argum<strong>en</strong>tos, sino que se sustituy<strong>en</strong> tal cual seespecifican.Tabla 6.7Símbolos no ingleses\ae æ \oe œ \aa å \AA Å \AE Æ\OE Œ \O Ø \l ł \L Ł ?‘ ¿!‘ ¡ \o ø \ss ßSe ti<strong>en</strong><strong>en</strong> algunos símbolos <strong>de</strong> puntuación que resultan útiles. Se incluy<strong>en</strong> acá tambiénlos símbolos que ti<strong>en</strong><strong>en</strong> algún significado especial <strong>en</strong> L A TEX.Tabla 6.8Símbolos <strong>de</strong> puntuación y especiales\dag † \S § \copyright c○ \P \ddag ‡ \pounds £ \# # \$ $\% % \& & \_ \& _ &&verb+{ }+ { }Finalm<strong>en</strong>te, cuando se trate <strong>de</strong> que un símbolo aparezca “tal cual”, sin que sea interpretadopor L A TEX (por ejemplo, la diagonal inversa \) simplem<strong>en</strong>te usas el comando


176 L A TEX\verb+texto+ y todo el texto que aparece <strong>en</strong>tre los símbolos “+” no será interpretado yaparecerá <strong>en</strong> la página tal cual lo tecleaste 2 .Actividad 6.24 Crea un archivo nuevo copiando el preámbulo que hemos visto hastaahora.Actividad 6.25 Construye una tabla <strong>de</strong> cinco columnas <strong>en</strong> las que veas el resultado <strong>de</strong>aplicar seis <strong>de</strong> los tipos <strong>de</strong> ac<strong>en</strong>tos a las cinco vocales.6.8.1. Fórmulas matemáticasEl tipo <strong>de</strong> texto que hemos escrito hasta ahora es lo que L A TEX <strong>de</strong>nomina texto LR(left to right) y que consiste fundam<strong>en</strong>talm<strong>en</strong>te <strong>de</strong> párrafos que se acomodan <strong>en</strong> la hojacomo vi<strong>en</strong><strong>en</strong>. Cuando quieres escribir fórmulas matemáticas, éstas conti<strong>en</strong><strong>en</strong> símbolosque obligan al compilador a realizar un formato también vertical, no nada más <strong>en</strong> elr<strong>en</strong>glón correspondi<strong>en</strong>te. Para lograrlo <strong>de</strong>berás introducir un “ambi<strong>en</strong>te” matemático.Ti<strong>en</strong>es dos tipos <strong>de</strong> ambi<strong>en</strong>tes matemáticos:i. En la línea, don<strong>de</strong> lo que buscas es po<strong>de</strong>r intercalar una fórmula o un carácter(α i = 2 · β 3 ). Esto se logra, <strong>de</strong> cualquiera <strong>de</strong> las sigui<strong>en</strong>tes maneras:Se escribe:Se forma:α = 2 · β 3 α i = 2 · β 3\(\ alpha_i=2\cdot\beta^3\) α i = 2 · β 3\begin{math}\alpha_i=2\cdot\beta^3\<strong>en</strong>d{math} α i = 2 · β 3ii. En un “recuadro” que conti<strong>en</strong>e a la fórmula matemática. Introduces también unambi<strong>en</strong>te que <strong>de</strong>jará espacio <strong>en</strong> blanco <strong>en</strong>tre el párrafo anterior y el sigui<strong>en</strong>te.D<strong>en</strong>tro <strong>de</strong> ese párrafo pue<strong>de</strong>s escribir las fórmulas. Para mostrar esta modalidad,se mostrará <strong>de</strong>l lado izquierdo el texto fu<strong>en</strong>te y <strong>de</strong>l <strong>de</strong>recho el texto formado:\ [ \ alpha =2\ cdot \ beta ^ 3 \ ]\ begin { displaymath }\ alpha_i =2\ cdot \ beta ^3\ <strong>en</strong>d { displaymath }α i = 2 · β 3α i = 2 · β 3La difer<strong>en</strong>cia fundam<strong>en</strong>tal <strong>en</strong>tre el modo <strong>de</strong> <strong>de</strong>spliegue (párrafo) y el <strong>de</strong> línea es eltamaño <strong>de</strong> los términos. Mi<strong>en</strong>tras que <strong>en</strong> el modo <strong>de</strong> línea se ajusta el tamaño a la alturanormal <strong>de</strong> una línea, <strong>en</strong> el modo <strong>de</strong> párrafo ocupa tanto espacio vertical como requiera.Compara estos dos modos <strong>en</strong> el sigui<strong>en</strong>te esquema.2 Usando este comando es como se han escrito algunos <strong>de</strong> los comandos <strong>en</strong> todo este texto.


6.8 Matemáticas <strong>en</strong> L A TEX 177\(2\ frac {n}{n+1\}\) 2 nn+1\[2\ frac {n}{n+1}\] 2 nn + 1Cuando estás <strong>en</strong> modo matemático, ya sea <strong>de</strong> línea o <strong>de</strong> recuadro, los espacios<strong>en</strong> blanco únicam<strong>en</strong>te t<strong>en</strong>drán s<strong>en</strong>tido para separar comandos. No aparecerán <strong>en</strong> lasfórmulas que escribas como tales, a m<strong>en</strong>os que utilices un blanco precedido por ladiagonal inversa. El texto que escribas se formará con un tipo parecido al <strong>de</strong> las itálicas,y si escribes varias palabras, aparecerán sin los espacios. Compara el modo matemáticocon el tipo itálico <strong>en</strong> los sigui<strong>en</strong>tes r<strong>en</strong>glones.\( Esta\ es\ una\ prueba\) Esta es una prueba{\ it Esta es una prueba} Esta es una pruebaNota que el lugar que ocupa cada carácter es ligeram<strong>en</strong>te mayor <strong>en</strong> el modo matemático.Revisemos ahora cuáles son los compon<strong>en</strong>tes principales <strong>de</strong> las fórmulas matemáticas.Expon<strong>en</strong>tesUna <strong>de</strong> las acciones más comunes que quieres realizar es la <strong>de</strong> poner expon<strong>en</strong>tes.Esto se logra fácilm<strong>en</strong>te si don<strong>de</strong> quieres <strong>de</strong>seas un expon<strong>en</strong>te colocas el símbolo ^seguido <strong>de</strong> un sólo símbolo, para que ese símbolo aparezca como expon<strong>en</strong>te; o bi<strong>en</strong>seguido <strong>de</strong> varios símbolos, todos ellos <strong>en</strong>tre llaves. No se permit<strong>en</strong> secu<strong>en</strong>cias <strong>de</strong> más<strong>de</strong> una combinación <strong>de</strong> ^ con el expon<strong>en</strong>te. Sigu<strong>en</strong> algunos ejemplos:$a^m b^n c^{n+m}$$x^{y^2}$$x^{2y}$$x^2y$a m b n c n+mx y2x 2yx 2 yEn el segundo ejemplo nos vimos forzados a <strong>en</strong>cerrar el segundo expon<strong>en</strong>te <strong>en</strong>tre llavespara que no se infringiera la regla <strong>de</strong> que hubiera más <strong>de</strong> uno seguido. De esta manera,el expon<strong>en</strong>te <strong>de</strong> x es, simplem<strong>en</strong>te, otra expresión con expon<strong>en</strong>te.Como pue<strong>de</strong>s observar <strong>en</strong> todos estos ejemplos, las llaves sirv<strong>en</strong> para indicar dón<strong>de</strong>empieza y termina el expon<strong>en</strong>te. Es claro, por ejemplo <strong>en</strong> el último caso, que <strong>en</strong>aus<strong>en</strong>cia <strong>de</strong> llaves L A TEX consi<strong>de</strong>rará únicam<strong>en</strong>te al primer carácter que sigue a ^.Actividad 6.26 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:3x 2 + 4xy + 2y 2 = 0


178 L A TEXSubíndices−b + (b 2 − 4ac) 1/2 /(2a)a n! b m! c (n+m)!(x − y) 2 (x 2 − y 2 )(x + y) 2Funcionan <strong>de</strong> la misma manera que los expon<strong>en</strong>tes, excepto que se usa el símbolo_ <strong>de</strong> subrayado <strong>en</strong> lugar <strong>de</strong>l ^. Las mismas reglas aplican para subíndices que paraexpon<strong>en</strong>tes. Sigu<strong>en</strong> algunos ejemplos:$a_m b_n c_{n+m}$$x_{y_2}$$x_{2y}$$x_2y$a m b n c n+mx y2x 2yx 2 yActividad 6.27 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes expresiones:P i log 2 P i(x i1 − y i1 ) + (x 2 i 2− yi 2 2) + (x 3 i 3− yi 3 3)(x 2 1 + y1) 2 1/2(X max − X min ) 2 /(Y max − Y min ) 26.9. Emacs y L A TEXEn este mom<strong>en</strong>to ya conoces una bu<strong>en</strong>a cantidad <strong>de</strong> herrami<strong>en</strong>tas L A TEX, has incursionadoincluso <strong>en</strong> matemáticas <strong>en</strong> L A TEX. Éste es un bu<strong>en</strong> mom<strong>en</strong>to para que revisesqué pue<strong>de</strong> hacer Emacs por ti. Mejor dicho, qué pue<strong>de</strong> hacer AUCTEX, el modo mayorpara editar L A TEX <strong>en</strong> Emacs por ti.En la sección 6.12.1, <strong>en</strong> la página 238, explicamos con <strong>de</strong>talle qué comandos <strong>de</strong>AUCTEX ejecutan las secu<strong>en</strong>cias C-c C–e y otras que hemos m<strong>en</strong>cionado <strong>en</strong> estecapítulo. También agregamos información sobre el modo para ingresar símbolos matemáticos<strong>de</strong> manera rápida y un bu<strong>en</strong> número <strong>de</strong> <strong>de</strong>talles más.AUCTEX, <strong>de</strong>sgraciadam<strong>en</strong>te, no es parte estándar <strong>de</strong> todas las distribuciones <strong>de</strong>Emacs. Por ello, <strong>en</strong> la sección 6.12.1 te explicamos cómo obt<strong>en</strong>er, instalar y configurarAUCTEX.


6.9 Emacs y LATEX 179Letras griegasPara que se imprima una letra griega haces prece<strong>de</strong>r el nombre <strong>de</strong> la misma (<strong>en</strong>inglés) por la diagonal inversa. En la tabla 6.9 se muestran las letras griegas disponibles:Tabla 6.9Símbolos griegosMinúsculas\alpha α \theta θ o o \tau τ\beta β \vartheta ϑ \pi π \upsilon υ\gamma γ \iota ι \varpi ϖ \phi φ\<strong>de</strong>lta δ \kappa κ \rho ρ \varphi ϕ\epsilon ɛ \lambda λ \varrho ϱ \chi χ\varepsilon ε \mu µ \sigma σ \psi ψ\zeta ζ \nu ν \varsigma ς \omega ω\eta η \xi ξMayúsculas\Gamma Γ \Lambda Λ \Sigma Σ \Psi Ψ\Delta ∆ \Xi Ξ \Upsilon Υ \Omega Ω\Theta Θ \Pi Π \Phi ΦPue<strong>de</strong>s ver que no para todas las letras griegas hay la versión <strong>en</strong> mayúscula. Sino aparece <strong>en</strong> esta lista es porque no la hay. También existe, para algunas <strong>de</strong> ellas, laversión para variable.Actividad 6.28 Haz una tabla que cont<strong>en</strong>ga únicam<strong>en</strong>te las letras griegas para lascuales hay mayúsculas, y aquéllas para las cuales hay versión <strong>en</strong> var. En la primeracolumna <strong>de</strong> la tabla <strong>de</strong>berá aparecer el “nombre” <strong>de</strong> la letra <strong>en</strong> minúscula; <strong>en</strong> lasegunda columna <strong>de</strong>berá imprimirse el símbolo; <strong>en</strong> la tercera columna, si es que hay,el símbolo para la mayúscula; y <strong>en</strong> la cuarta columna, si es que hay, el símbolo parala variable.


180 L A TEXSímbolos con flechasEn matemáticas, y <strong>en</strong> computación <strong>en</strong> g<strong>en</strong>eral, se usan muy frecu<strong>en</strong>tem<strong>en</strong>te distintostipos <strong>de</strong> flechas. Pres<strong>en</strong>tamos algunos <strong>en</strong> la tabla 6.10.Tabla 6.10Símbolos con flechas\ leftarrow ← \ longleftarrow ←− \Leftarrow ⇐\Longleftarrow ⇐= \rightarrow → \longrightarrow −→\Rightarrow ⇒ \Longrightarrow =⇒ \ leftrightarrow ↔\ longleftrightarrow ←→ \ Leftrightarrow ⇔ \ Longleftrightarrow ⇐⇒\uparrow ↑ \Uparrow ⇑ \downarrow ↓\Downarrow ⇓ \updownarrow ↕ \Updownarrow ⇕\mapsto ↦→ \longmapsto ↦−→ \hookleftarrow ←↪\hookrightarrow ↩→ \leftharpoonup ↼ \rightharpoonup ⇀\leftharpoondown ↽ \rightharpoondown ⇁ \ rightleftharpoons ⇋\leadsto ❀ \nearrow ↗ \searrow ↘\swarrow ↙ \nwarrow ↖OperadoresTabla 6.11En la tabla 6.11 te mostramos símbolos comúnm<strong>en</strong>te usados <strong>en</strong> matemáticas comooperadores y símbolos relacionales.Operadores y símbolos relacionales\pm ± \cap ∩ \diamond ⋄\oplus ⊕ \mp ∓ \cup ∪\ bigtriangleup △ \ominus ⊖\times × \uplus ⊎ \bigtriangledown ▽\otimes ⊗ \div ÷ \sqcap ⊓\ triangleleft ⊳ \oslash ⊘ \ast ∗\sqcup ⊔ \ triangleright ⊲ \odot ⊙\ star ⋆ \vee ∨ \lhd ✁\ bigcirc ○ \ circ ◦ \wedge ∧\rhd ✄ \dagger † \ bullet •\setminus \ \unlhd ✂ \ddagger ‡\cdot · \wr ≀ \unrhd ☎Continúa <strong>en</strong> la sigui<strong>en</strong>te página


6.9 Emacs y LATEX 181Tabla 6.11 Operadores y símbolos relacionales Continúa <strong>de</strong> la página anterior\amalg ∐ \leq ≤ \geq ≥\equiv ≡ \mo<strong>de</strong>ls |= \prec ≺\succ ≻ \sim ∼ \perp ⊥\preceq ≼ \succeq ≽ \simeq ≃\mid | \ ll ≪ \gg ≫\asymp ≍ \ parallel ‖ \subset ⊂\supset ⊃ \approx ≈ \bowtie ⊲⊳\subseteq ⊆ \supseteq ⊇ \cong ∼ =\Join ✶ \sqsubset ❁ \sqsupset ❂\neq ≠ \smile ⌣ \sqsubseteq ⊑.\sqsupseteq ⊒ \doteq = \frown ⌢\ in ∈ \ ni ∋ \ notin /∈\propto ∝ \vdash ⊢ \dashv ⊣Actividad 6.29 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:f X (y i )∆ i log[f X (y i )∆ i ]‖ X − Y (k)i‖ 2 f X dXm k (t ij ) = i(α k t ij + ∆ k )Actividad 6.30 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:p ∧ 1 ≡ ¬p ⇒ q(p ∧ q) ⇔ ¬(¬p ∨ ¬q)‖ X − Y j ‖ 2 ≤‖ X − Y i ‖ 2 , Y i ∈ Cd(x i , y i ) = x i ⊕ y jSímbolos variosNotarás que a pesar <strong>de</strong> que hemos dado ya muchísimos símbolos matemáticos, todavíanos faltan algunos que ya conoces como el “para todo”. En la tabla 6.12 ponemosalgunos símbolos más que te van a ser <strong>de</strong> utilidad.


182 L A TEXTabla 6.12Símbolos varios\aleph ℵ \prime ′ \ forall ∀ \ infty ∞\hbar \emptyset ∅ \ exists ∃ \Box ✷\imath ı \nabla ∇ \neg ¬ \Diamond ✸√\jmath j \surd\ flat ♭ \ triangle △\ ell l \top ⊤ \ natural ♮ \ clubsuit ♣\wp ℘ \bot ⊥ \sharp ♯ \diamondsuit ♦\Re R \| ‖ \backslash \ \ heartsuit ♥\Im I \angle ∠ \ partial ∂ \spa<strong>de</strong>suit ♠\mho ✵Actividad 6.31 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes figuras (pista: utiliza una tabla tabularpara acomodar las figuras):6 6 4 4♣ ♣ ♥ ♥♣♣♣ ♣ ♥ ♥6 6 4 4Nombres <strong>de</strong> funciones comunesTabla 6.13L A TEX proporciona varios nombres <strong>de</strong> funciones comunes para que las escribas <strong>de</strong>manera especial, y no simplem<strong>en</strong>te como ca<strong>de</strong>nas. Éstas se pres<strong>en</strong>tan <strong>en</strong> la tabla 6.13.Nombres <strong>de</strong> funciones comunes\arccos arc cos \cos cos \csc csc \exp exp\ker ker \limsup lím sup \min mín \sinh sinh\arcsin arcsin \cosh cosh \<strong>de</strong>g <strong>de</strong>g \gcd gcd\ lg lg \ ln ln \Pr Pr \sup sup\arctan arctan \cot cot \<strong>de</strong>t <strong>de</strong>t \hom hom\lim lím \log log \sec sec \tan tan\arg arg \coth coth \dim dim \ inf ínfContinúa <strong>en</strong> la sigui<strong>en</strong>te página


6.9 Emacs y LATEX 183Tabla 6.13 Nombres <strong>de</strong> funciones comunes Continúa <strong>de</strong> la página anteriorFracciones\ liminf lím inf \max máx \sin sin \tanh tanha \mod b a mód b \pmod{b} (mód b)Nota que como estamos trabajando <strong>en</strong> español (paquete babel) aquellas abreviaturasque lo requier<strong>en</strong> llevan ac<strong>en</strong>to.En el modo matemático ti<strong>en</strong>es dos maneras <strong>de</strong> escribir fracciones. La primera <strong>de</strong>ellas es con la diagonal, como <strong>en</strong>$3/4$ 3/4$1/(n+1)$ 1/(n + 1)También se pue<strong>de</strong> usar el comando \frac{numerador}{<strong>de</strong>nominador} queescribe la fracción <strong>de</strong> la sigui<strong>en</strong>te forma:$\frac {3}{4} $34\[\ frac {3}{4}\]34$\frac {1}{n+1}$1n+1\[\ frac {1}{n+1}\]1n + 1Si \ frac usas <strong>en</strong> el modo matemático <strong>en</strong> línea, L A TEX va a tratar <strong>de</strong> ajustar la fórmulaal alto <strong>de</strong> un r<strong>en</strong>glón, mi<strong>en</strong>tras que si usas el modo matemático <strong>de</strong> recuadro, ocuparátanto espacio vertical como requiera.Actividad 6.32 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:z n = x n − y n = x n − x n + x n−12f X (x) log 2X máx/M∆c ′ i(x)= x n − x n−12RaícesLa raíz <strong>de</strong> una fórmula o expresión se logra con el comando \ sqrt y poniéndolecomo argum<strong>en</strong>to <strong>en</strong>tre llaves a la expresión que quieres cubra la raíz.\ frac {x+y}{1+\sqrt {\ frac {y}{z+1}}}1 +x + y√yz+1


184 L A TEXPue<strong>de</strong>s también poner valor <strong>en</strong> el radical, agregando ese valor <strong>en</strong>tre corchetes comoprimer argum<strong>en</strong>to <strong>de</strong> \ sqrt:\ frac {x+y}{1+\sqrt[n ]{\ frac {y}{z+1}}}x + y1 + n √yz+1Actividad 6.33 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:−b ± 2√ b 2 · a · c2 · a√Σ 3 (χ) = ( 1 κ − 12 (κ + 1) 2 )χ−κSímbolos agrandablesT<strong>en</strong>emos <strong>en</strong> matemáticas muchos símbolos, como el <strong>de</strong> la integral o las series, que<strong>de</strong>b<strong>en</strong> tomar el tamaño dado por todo lo que está a su <strong>de</strong>recha. Como vimos <strong>en</strong> el ejercicioanterior, la raíz cuadrada, por ejemplo, crece al tamaño que toma su argum<strong>en</strong>to.Esto lo hace automáticam<strong>en</strong>te. Los símbolos <strong>en</strong> la tabla 6.14 son con los que cu<strong>en</strong>taL A TEX para el modo matemático. El tamaño aum<strong>en</strong>ta únicam<strong>en</strong>te cuando aparece <strong>en</strong> elmodo <strong>en</strong> que acomoda a la fórmula <strong>en</strong> un párrafo, no <strong>en</strong> una línea.Tabla 6.14Símbolos agrandables∑ ⋂\sum\bigcap∏⋃\prod\bigcup⊙\bigodot⊗\bigotimes∐ ⊔ \coprod \bigsqcup \bigoplus∫∨\ int\bigvee\biguplus∮∧\ oint\bigwedge⊕⊎Cuando pones subíndice o expon<strong>en</strong>te a cualquiera <strong>de</strong> estos símbolos, L A TEX los acomodará<strong>de</strong> tal manera que se vean bi<strong>en</strong>. Por ejemplo,\ [ \ sum_{ −\ i n f t y } ^ \ i n f t y f_ {X | Y } ( x _ i | y _ j ) \ ]∞∑f X|Y (x i |y j )−∞


6.9 Emacs y LATEX 185\ [ \ i n t _ 0 ^n f ( x )^2 g ( y ) ^ 2 \ ]∫ nf(x) 2 g(y) 20Mi<strong>en</strong>tras que si los pones <strong>en</strong> modo <strong>de</strong> línea, aparecerán como sigue:∑$\sum_{−\infty}^\ infty f_{X|Y}(x_i | y_j)$ se forma ∞−∞ f X|Y (x i |y j )∫ n$\int_0^n f (x)^2g(y)^2$se forma a0 f(x)2 g(y) 2 .Otra manera <strong>de</strong> agrandar algunos <strong>de</strong> los símbolos, sobre todo aquellos que formanparejas como los paréntesis, los corchetes o las llaves, es “aclarando” que vas a t<strong>en</strong>er un<strong>de</strong>limitador izquierdo y uno <strong>de</strong>recho para un <strong>de</strong>terminado pedazo <strong>de</strong> fórmula, usandolos comandos \ left y \ right, y colocando inmediatam<strong>en</strong>te a continuación el símboloque se va a usar. En el ejemplo que dimos para las raíces, los paréntesis no crecieron altamaño <strong>de</strong> la fórmula que par<strong>en</strong>tizan. Para lograrlo haces lo sigui<strong>en</strong>te:\ [ \ 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κ 2 − 1(κ + 1) 2 )χ −κ )Pue<strong>de</strong>s querer únicam<strong>en</strong>te el símbolo <strong>de</strong> la izquierda o el <strong>de</strong> la <strong>de</strong>recha. En ese caso,como símbolo 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^2−y ^ 2 ) ^ 2 } } \ r i g h t . \ ]{x 2 + y 2P (x) = √(x2 − y 2 ) 2Actividad 6.34 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:∫ tε)(E y L x,y (s)ϕ(χ)dsky n =0D (k) =N∑a i x n−i +i=0M∑i=1∫ b(k)iM∑b i y n−ii=1b ( i−1 k) (x − y i ) 2 f X (x)dxEquival<strong>en</strong>te a \ left y \ right t<strong>en</strong>emos manera <strong>de</strong> pedir distintos tamaños <strong>de</strong> <strong>de</strong>limitadorescon las sigui<strong>en</strong>tes parejas, listadas <strong>de</strong> m<strong>en</strong>or a mayor. El comando se hace seguirpor un único símbolo.


186 L A TEX\ b i g l \ b i g r\ B i g l \ Bigr\ b i g g l \ b i g g r\ B i g g l \ BiggrPor ejemplo, la sigui<strong>en</strong>te fórmula\ [ \ B i g g l \ { \ b i g g l [ \ B i g l ( \ b i g l | prueba \ b i g r | \ Bigr ) \ b i g g r ] \ Biggr \ } \ ]se forma <strong>de</strong> la sigui<strong>en</strong>te manera:{ [(∣∣prueba∣ ∣) ]}La lista <strong>de</strong> los símbolos que pue<strong>de</strong>s usar como <strong>de</strong>limitadores y que se agrandan se<strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la tabla 6.15.Tabla 6.15Delimitadores↑ \uparrow ⇑ \Uparrow ↓ \downarrow ⇓ \Downarrow{ \{ } \} ↕ \updownarrow ⇕ \Updownarrow⌊ \ lfloor ⌋ \ rfloor ⌈ \ lceil ⌉ \ rceil〈 \langle 〉 \rangle / / \ \backslash| | ‖ \| { \rmoustache { \lmoustache⎭ \rgroup ⎩ \lgroup | \arrowvert ‖ \Arrowvert⎪\bracevertActividad 6.35 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te fórmula:∑⌊ ( ∑ ⌊ ⌋ ) ⌋ −1(m/k)/⌈m/k⌉ .1


6.9 Emacs y LATEX 187\ [ \ t e x t { valores para } x_1 , \ l d o t s , x_n \ ]valores para x 1 , . . . , x ndon<strong>de</strong> los puntos susp<strong>en</strong>sivos se colocan alineados con la parte inferior <strong>de</strong> la línea(\ ldots); o bi<strong>en</strong>, alineados con la parte c<strong>en</strong>tral <strong>de</strong> la línea (\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 x 2 + 1 x 4 + · · · + 1x 2ndon<strong>de</strong> los puntos susp<strong>en</strong>sivos se alinean con el operador para darle continuidad. Tambiéncu<strong>en</strong>tas con puntos susp<strong>en</strong>sivos verticales, \vdots:(.) y diagonales, \ddots ( . . .).Actividad 6.36 Codifica <strong>en</strong> L A TEX las sigui<strong>en</strong>tes fórmulas:F (χ) = a d χ d + a d−1 χ d−1 + · · · + a 1 χ 1 + a 0 χ 0( ) ( ) ( )χ∆ n χχf(χ) = c d + c d−1 + · · · + c 0d − n d − 1 − n−nCambios <strong>de</strong> tipos y tamaños <strong>de</strong> letrasEn el modo para matemáticas no van a funcionar los comandos que cambian el tipoo tamaño <strong>de</strong> letra. Tampoco vas a po<strong>de</strong>r utilizar las letras ac<strong>en</strong>tuadas o los símbolos qu<strong>en</strong>o son <strong>de</strong>l idioma inglés. Para intercalar un símbolo <strong>de</strong> éstos <strong>en</strong> un ambi<strong>en</strong>te matemáticolo <strong>de</strong>bes colocar como argum<strong>en</strong>to <strong>de</strong> un comando \mbox. Veamos un ejemplo:δ(qō, a) \ begin { displaymath }\ d e l t a ( q \ mbox { \ b { o } } , a )\ <strong>en</strong>d { displaymath }Tabla 6.16En el modo matemático tampoco van a funcionar las negritas u otros cambios <strong>en</strong>el tipo <strong>de</strong> letra. El modo matemático ti<strong>en</strong>e sus propios tipos, que se muestran <strong>en</strong> latabla 6.16.Tipos <strong>de</strong> letras <strong>en</strong> modo matemático$\mathcal{ABCDEF...}$ABCDEF...$\mathit{ it \acute{a}licas \cdot 2^{ ft }\ Psi \log [\ psi ]} $itálicas · 2 ft Ψ log[ψ]$\mathrm{romanas \cdot 2^{ft}\Psi \log [\ psi ]} $romanas · 2 ft Ψ log[ψ]Continúa <strong>en</strong> la sigui<strong>en</strong>te página


188 L A TEXTabla 6.16 Tipos <strong>de</strong> letras <strong>en</strong> modo matemático Continúa <strong>de</strong> la página anterior$\mathbf{negritas \cdot 2^{ ft }\ Psi \log [\ psi ]} $$\mathsf{sans\ serif \cdot 2^{ ft }\ Psi \log [\ psi ]} $negritas · 2 ft Ψ log[ψ]sans serif · 2 ft Ψ log[ψ]$\mathtt{m\acute{a}quina\ <strong>de</strong>\ escribir \cdot 2^{ ft }\ Psi \log [\ psi ]} $máquina <strong>de</strong> escribir · 2 ft Ψ log[ψ]$\mathbb{BLACKBOARD CON BORDES DOBLES}$BLACKBOARD CON BORDES DOBLESDebes notar que todos estos tipos <strong>de</strong> letra manti<strong>en</strong><strong>en</strong> al texto <strong>en</strong> modo matemático.También es importante repetir que para separar palabras <strong>de</strong>bes teclear un espacio “\ ”,pues si no el modo matemático no respeta espacios <strong>en</strong> blanco.El primer y último tipo (\mathcal y mathbb únicam<strong>en</strong>te los pue<strong>de</strong>s usar con mayúsculas.Cuando pi<strong>de</strong>s negritas <strong>en</strong> modo matemático con \mathbf hay símbolos que no se imprim<strong>en</strong><strong>en</strong> negritas. Observa que <strong>en</strong> el cuarto ejemplo, los símbolos correspondi<strong>en</strong>tes aΨ log[ψ] no salieron obscurecidos. Para que salgan obscurecidos <strong>de</strong>bes usar el comando\ boldsymbol { . . . }que logra poner <strong>en</strong> negritas también a los símbolos matemáticos. Mostramos ambasopciones juntas para que se note la difer<strong>en</strong>cia:\ [ \ mathbf { n e g r i t a s \ cdot 2^{ f t } \ Psi \ log [ \ p s i ] } \ ]negritas · 2 ft Ψ log[ψ]\ [ \ mathbf { n e g r i t a s \ cdot 2^{ f t } \ boldsymbol { \ Psi \ log [ \ p s i ] } } \ ]negritas · 2 ft Ψ log[ψ]Otra manera <strong>de</strong> lograr que todo el texto matemático se escriba <strong>en</strong> negritas es medianteel comando <strong>de</strong> cambio <strong>de</strong> estado \boldmath (\unboldmath), que a partir <strong>de</strong>l mom<strong>en</strong>to<strong>en</strong> que aparece pr<strong>en</strong><strong>de</strong> (apaga) las negritas <strong>en</strong> modo matemático. Veamos unejemplo:\ hspace ∗{4em } \ boldmath \ ( a+b \ Box c \ )\ unboldmath \ qquad \ ( a+b ) \ Box c \ )a + b✷ca + b✷cCabe hacer la aclaración que estos comandos los ti<strong>en</strong>es que poner antes <strong>de</strong> que<strong>en</strong>tres al modo matemático, para que t<strong>en</strong>gan efecto.Actividad 6.37 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te fórmula, cuidando el tipo <strong>de</strong> letra y lasnegritas:Sea x ≠ y∀x ∈ N, y y ≥ x


6.9 Emacs y LATEX 189Insertar texto <strong>en</strong> modo matemáticoEs necesario muchas veces introducir <strong>en</strong> un recuadro o línea matemática texto quequieres aparezca <strong>en</strong> modo normal. Nota que esto no es lo mismo que hicimos cuandocambiamos el tipo <strong>de</strong> letra para los símbolos matemáticos. Para ello se pue<strong>de</strong> usar elcomando \ text {...} poni<strong>en</strong>do <strong>en</strong>tre llaves el texto que <strong>de</strong>seas aparezca. También pue<strong>de</strong>sutilizar, <strong>en</strong> g<strong>en</strong>eral, cualquiera <strong>de</strong> los comandos \ textxx que vimos al inicio <strong>de</strong> estasección para modificar tipo <strong>de</strong> texto (don<strong>de</strong> xx es uno <strong>de</strong> bf, sf, tt, etc.).Este comando preserva los espacios <strong>en</strong>tre palabras:\ [ x =\ f r a c {−b \pm \ s q r t { b^2−4ac } } { 2 a } \ \\ t e x t {Da l a s o l u c i ón <strong>de</strong> ecuación cuadrá t i c a } \ ]x = −b ± √ b 2 − 4ac2aDa la solución <strong>de</strong> ecuación cuadráticaTablas <strong>de</strong> fórmulasHay dos maneras <strong>de</strong> organizar varias fórmulas <strong>en</strong> una tabla. La primera <strong>de</strong> ellas escon un tabular y colocando <strong>en</strong> cada celda el modo matemático <strong>en</strong> línea ($ \(... $\)). Laotra manera es <strong>de</strong>clarando un ambi<strong>en</strong>te <strong>de</strong> línea o recuadro y colocando allí un arreglomatemático, \begin{array }...\ <strong>en</strong>d{array}. Es importante insistir <strong>en</strong> que un array sólopue<strong>de</strong> estar <strong>en</strong> un ambi<strong>en</strong>te matemático. Las <strong>de</strong>claraciones <strong>de</strong> columnas y r<strong>en</strong>glones lashaces exactam<strong>en</strong>te igual que con tabular, excepto que el cont<strong>en</strong>ido es interpretado comofórmulas. La excepción es cuando para <strong>de</strong>scribir la columna diste p{},pues <strong>en</strong> ese caso automáticam<strong>en</strong>te esa columna quedará <strong>en</strong> modo texto.Este mecanismo se utiliza también para imprimir matrices o, <strong>en</strong> g<strong>en</strong>eral, tablas que<strong>en</strong> su mayoría van a cont<strong>en</strong>er fórmulas matemáticas.\ [ \ begin { array } { l l c l }a_{11}&a_ {12}&\ l d o t s&a_ {1m} \ \a_{21}&a_ {22}&\ l d o t s &\ l d o t s \ \\ cdots &\ cdots &\ l d o t s &\ l d o t s \ \a_ { n1}&a_ { n2 } & \ cdots&a_ {nm}\ <strong>en</strong>d { array } \ ]a 11 a 12 . . . a 1ma 21 a 22 . . . . . .· · · · · · . . . . . .a n1 a n2 · · · a nmSiempre que ti<strong>en</strong>es una fórmula que ocupa más <strong>de</strong> un r<strong>en</strong>glón, pue<strong>de</strong>s ponerle algúncarácter a la izquierda y otro a la <strong>de</strong>recha que crezcan tanto como la fórmula <strong>en</strong>cuestión. Esto lo haces marcando la fórmula con \ left y \ right a su izquierda y <strong>de</strong>recharespectivam<strong>en</strong>te, y poni<strong>en</strong>do el símbolo que quieras. Por ejemplo, la matriz anteriorpodría quedar:


190 L A TEX\ [ \ l e f t [ \ begin { array } { 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 \ \\ cdots &\ cdots &\ l d o t s &\ l d o t s \ \a_ { n1}&a_ { n2 } & \ cdots&a_ {nm}\ <strong>en</strong>d { array } \ r i g h t ] \ ]⎡⎢⎣⎤a 11 a 12 . . . a 1ma 21 a 22 . . . . . .· · · · · · . . . . . . ⎥⎦a n1 a n2 · · · a nmSi <strong>de</strong>seas omitir ya sea el símbolo <strong>de</strong> la izquierda o el <strong>de</strong> la <strong>de</strong>recha, pones un punto(.) <strong>en</strong> lugar <strong>de</strong>l carácter. No ti<strong>en</strong><strong>en</strong> porqué ser carácteres correspondi<strong>en</strong>tes al inicio y alfinal. En g<strong>en</strong>eral, se usan aquellos que lo son, pero no es forzoso:\ [ \ l e f t \ | \ begin { array } { 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 \ \\ cdots &\ cdots &\ l d o t s &\ l d o t s \ \a_ { n1}&a_ { n2 } & \ cdots&a_ {nm}\ <strong>en</strong>d { array } \ r i g h t \ } \ ]a 11 a 12 . . . a 1m⎫⎪ a 21 a 22 . . . . . . ⎬ · · · · · · . . . . . .⎪∥ a n1 a n2 · · · a ⎭nmTambién pue<strong>de</strong>s t<strong>en</strong>er un array <strong>en</strong> el modo línea,$\begin{array}[ t ]{ l }a+b\\a−b\<strong>en</strong>d{array}$,que queda a + b . Debes notar que usa tantos r<strong>en</strong>glones como necesite, corrigi<strong>en</strong>do ela − bsigui<strong>en</strong>te r<strong>en</strong>glón para que no se <strong>en</strong>cime.Las líneas <strong>en</strong>tre columnas y <strong>en</strong>tre los r<strong>en</strong>glones se utilizan exactam<strong>en</strong>te igual que <strong>en</strong>el caso <strong>de</strong> las tablas no numéricas (tabular). También habrás notado que la <strong>de</strong>scripción<strong>de</strong> las columnas se hace también <strong>de</strong> la misma manera que <strong>en</strong> un tabular. También sepue<strong>de</strong>n re<strong>de</strong>finir las columnas.Actividad 6.38 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te tabla:(a + b) 2 = a 2 + 2ab + b 2 Suma <strong>de</strong> cuadradosa 2 − b 2 = (a + b)(a − b) Difer<strong>en</strong>cia <strong>de</strong> cuadrados(a + b) n = a n + 2a n−1 b + · · · + b n Expansión binomialMatrices y combinacionesSi bi<strong>en</strong> pue<strong>de</strong>s armar matrices usando arrays, L A TEX provee comandos especialespara ello. Por ejemplo, es muy común que quieras <strong>de</strong>finir una función “por casos”como la que sigue:


6.9 Emacs y LATEX 191P r−j ={0 si r − j es impar,r!(−1) (r−j)/2si r − j es par.Si esto lo hicieras con un array, lo haría como sigue:{ 0 si r − j es impar,P r−j =r!(−1) (r−j)/2 si r − j es par.\ [ P_ { r−j }=\ begin { cases }0&\ t e x t { s i r − j es impar } , \ \r ! ( −1)^{( r−j ) / 2 }&\ t e x t { s i r − j es par } .\ <strong>en</strong>d { cases }\ ]\ [ P_ { r−j } = \ l e f t \ {\ begin { array } { l l }0&\ t e x t { s i r − j es impar } , \ \r ! ( −1)^{( r−j ) / 2 }&\ t e x t { s i r − j es par } .\ <strong>en</strong>d { array }\ r i g h t .\ ]que pue<strong>de</strong>s corroborar <strong>en</strong> la parte izquierda que forma exactam<strong>en</strong>te la misma ecuación.Por ello, el ambi<strong>en</strong>te <strong>de</strong> casos es, simplem<strong>en</strong>te, un atajo para codificar este tipo <strong>de</strong>“tablas”.Otro atajo común es el que se usa para matrices. L A TEX <strong>de</strong>fine varios ambi<strong>en</strong>tesespecíficos para matrices, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> los <strong>de</strong>limitadores que quieras t<strong>en</strong>er:\ [ \ begin { matrix }a&b \ \c&d\ <strong>en</strong>d { m atrix } \ ]acbd\ [ \ begin { pmatrix }e& f \ \g&h\ <strong>en</strong>d { pmatrix } \ ]( ) e fg h\ [ \ begin { bmatrix }i & j \ \k& l\ <strong>en</strong>d { bmatrix } \ ][ i] \ [ \ begin { vmatrix }jm&n \ \k lo&p\ <strong>en</strong>d { vmatrix }∣ monp∣\ [ \ begin { Vmatrix }q&r \ \s& t\ <strong>en</strong>d { Vmatrix } \ ]∥ qsrt∥Como pue<strong>de</strong>s ver, lo que te ahorras al usar estos ambi<strong>en</strong>tes es la especificación <strong>de</strong>los <strong>de</strong>limitadores y <strong>de</strong> las columnas <strong>de</strong> cada matriz.Actividad 6.39 Codifica cada una <strong>de</strong> las matrices anteriores usando array y <strong>de</strong>limitadores.


192 L A TEXActividad 6.40 Codifica la sigui<strong>en</strong>te fórmula:(n!r!(n − r)!)6.9.1. Anotaciones <strong>en</strong> los símbolosEs frecu<strong>en</strong>te que quieras anotar a tus variables con distintos símbolos, que van <strong>de</strong>s<strong>de</strong>prima hasta vectores. También pudieses hacerlo abajo <strong>de</strong> la variable o expresión.Veamos algunos ejemplos:\overset{\ rightarrow }{a}\un<strong>de</strong>rset{i=1}{\cup}→a∪i=1Como pue<strong>de</strong>s notar, aun cuando estemos <strong>en</strong> modo <strong>de</strong> línea, acomoda el texto que leindiques don<strong>de</strong> le indiques. El primer parámetro L A TEX lo escribe con un tamaño m<strong>en</strong>ory lo coloca <strong>en</strong>cima (over) o <strong>de</strong>bajo (un<strong>de</strong>r) <strong>de</strong>l segundo argum<strong>en</strong>to. El segundo argum<strong>en</strong>toúnicam<strong>en</strong>te pue<strong>de</strong> ser un símbolo. El primer argum<strong>en</strong>to, como ya vimos, pue<strong>de</strong>ser cualquier cosa. Para aquellos símbolos que son muy comunes, t<strong>en</strong>emos <strong>de</strong>finidoscomandos que colocan <strong>de</strong>terminado carácter. Éstos se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> la tabla 6.17.Tabla 6.17Ac<strong>en</strong>tos <strong>en</strong> modo matemáticoâ \hat{a} á \acute{a} ā \bar{a} ȧ \dot{a}ǎ \check{a} à \grave{a} ⃗a \vec{a} ä \ddot{a}ă \breve{a} ã \ til<strong>de</strong> {a}Muchas veces quieres poner una flecha, raya, llave, <strong>en</strong>cima <strong>de</strong> toda una expresiónque ti<strong>en</strong>e más <strong>de</strong> un símbolo. Para ello t<strong>en</strong>emos los sigui<strong>en</strong>tes símbolos que se exti<strong>en</strong><strong>de</strong>npara cubrir a más <strong>de</strong> un símbolo:\ [ \ 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 } = \ un<strong>de</strong>rbrace { a+b+c } \ ]{ }} {a + b + c = a}+{{b +}c\ [ \ o v e r r i g h t a r r o w { a+b+c } = \ u n d errightarrow { a+b+c } \ ]−−−−−→a + b + c = a + b + c−−−−−→


6.9 Emacs y LATEX 193\ [ \ 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 pue<strong>de</strong>s anidar todos estos comandos y combinarlos <strong>de</strong> la maneraque <strong>de</strong>sees.Actividad 6.41 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te expresión:⎧A⎪⎨BA ∩ B =∅⎪⎩Ā ∪ ¯Bsi A ⊆ Bsi B ⊆ Asi A y B son aj<strong>en</strong>ospor la ley <strong>de</strong> De Morgan6.9.2. Arreglos <strong>de</strong> fórmulasSeguram<strong>en</strong>te estás p<strong>en</strong>sando <strong>en</strong> escribir fórmulas (o ecuaciones) <strong>en</strong> modo párrafo.Hasta ahora has utilizado para ello el ambi<strong>en</strong>te displaymath. Sin embargo, si <strong>de</strong>seasnumerar las ecuaciones o algo por el estilo, <strong>de</strong>bes usar el ambi<strong>en</strong>te equation.\ begin { equation } \ l a b e l { eq : dia3 −1}R=\ f r a c { 1 } {M} \ sum_{ k =1}^M R_k\ <strong>en</strong>d { equation }R = 1 MM∑R k (6.1)k=1Nota que el número <strong>de</strong> la ecuación aparece <strong>en</strong> el extremo <strong>de</strong>recho <strong>de</strong> la línea don<strong>de</strong>se <strong>en</strong>cu<strong>en</strong>tra la misma. Esto se pue<strong>de</strong> cambiar, así como la forma <strong>de</strong> numeración 3 . Elcontador <strong>de</strong> ecuaciones se va increm<strong>en</strong>tando progresivam<strong>en</strong>te <strong>de</strong>ntro <strong>de</strong>l capítulo.Si quieres colocar varias fórmulas alineadas, un array ti<strong>en</strong>e el problema <strong>de</strong> que noimporta si está <strong>en</strong> modo línea o párrafo, nos dará modo línea para cada r<strong>en</strong>glón <strong>de</strong>larreglo.3 Consulta alguno <strong>de</strong> los manuales <strong>de</strong> L A TEX que se m<strong>en</strong>cionan <strong>en</strong> la bibliografía si así lo <strong>de</strong>seas.


194 L A TEX\ [ \ begin { array } [ t ] { l l }x_1 =\sum_{ k =1}^n a_ky^k&\ t e x t { primer v a l o r } \ \ [ 1 0 pt ]x_2 =\sum_{ k =1}^n b_ky^k&\ t e x t { segundo v a l o r }\ <strong>en</strong>d { array }\ ]x 1 = ∑ nk=1 a ky k primer valorx 2 = ∑ nk=1 b ky k segundo valorSi quieres varias líneas, pero cada una <strong>de</strong> ellas <strong>en</strong> modo párrafo, ti<strong>en</strong>es que usar elambi<strong>en</strong>te <strong>de</strong> arreglos <strong>de</strong> ecuaciones \eqnarray.\ begin { eqnarray }x_1 =\sum_{ k =1}^n a_ky^k&\ 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 }\ <strong>en</strong>d { eqnarray }x 1 =x 2 =n∑a k y k Primer valor (6.2)k=1n∑b k y k segundo valor (6.3)k=1Nota que el modo matemático se introduce junto con el ambi<strong>en</strong>te eqnarray, lo mismoque suce<strong>de</strong> con equation. Si <strong>de</strong>seas eliminar el número <strong>de</strong> la(s) ecuación(es) usa losambi<strong>en</strong>tes eqnarray∗ y equation∗ respectivam<strong>en</strong>te:\ begin { eqnarray ∗}x_1 =\sum_{ k =1}^n a_ky^k&\ 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 }\ <strong>en</strong>d { eqnarray ∗}x 1 =x 2 =n∑a k y kk=1n∑b k y kk=1Primer valorsegundo valorLas ecuaciones que aparec<strong>en</strong> <strong>de</strong>ntro <strong>de</strong> ambi<strong>en</strong>tes sin numeración no increm<strong>en</strong>tanel contador <strong>de</strong> ecuaciones.Suce<strong>de</strong> a veces que no cabe una ecuación <strong>en</strong> una sola línea, por lo que ti<strong>en</strong>es que repartirla<strong>en</strong> varios r<strong>en</strong>glones. Esto lo logras con el ambi<strong>en</strong>te split <strong>de</strong>ntro <strong>de</strong> un ambi<strong>en</strong>teequation. Este comando es muy útil cuando, por ejemplo, quieres mostrar procesos porlos que pasa una expresión. Nota que <strong>de</strong> esta manera se asigna un único número a laecuación, <strong>en</strong> at<strong>en</strong>ción a que es una sola.


6.9 Emacs y LATEX 195\ begin { equation }\ begin { s p l i t }\ begin { bmatrix }\ Theta_1 \ \\ Theta_2\ <strong>en</strong>d { bmatrix }&+\ f r a c { 1 } { \ s q r t { 2 } }\ begin { bmatrix }1&1\\1&−1\ <strong>en</strong>d { bmatrix }\ begin { bmatrix }\ alpha \ \\ alpha\ <strong>en</strong>d { bmatrix } \ \ [ 1 0 pt ]&−\begin { bmatrix }\ s q r t { 2 } \ alpha \ \0\ <strong>en</strong>d { bmatrix }\ <strong>en</strong>d { s p l i t }\ <strong>en</strong>d { equation }[Θ1Θ 2]+ √ 1 [ [ ] 1 1 α2 1 −1]α[√ ] 2α−0(6.4)Pue<strong>de</strong>s conseguir un efecto similar, pero asignando un número a cada r<strong>en</strong>glón, siusamos el arreglo <strong>de</strong> ecuaciones, como se muestra a continuación <strong>de</strong>l ambi<strong>en</strong>te split ,que com<strong>en</strong>tamos <strong>en</strong> la segunda versión. En los ambi<strong>en</strong>tes <strong>de</strong> matrices, ecuaciones yarreglos te ahorras especificar número <strong>de</strong> columnas y tipo <strong>de</strong> columnas, ya que estosambi<strong>en</strong>tes los toman <strong>de</strong> los elem<strong>en</strong>tos que aparec<strong>en</strong> <strong>en</strong> las mismas.\ begin { eqnarray }% \ begin { s p l i t }\ begin { bmatrix }\ Theta_1 \ \\ Theta_2\ <strong>en</strong>d { bmatrix }&+\ f r a c { 1 } { \ s q r t { 2 } }\ begin { bmatrix }1&1\\1&−1\ <strong>en</strong>d { bmatrix }\ begin { bmatrix }\ alpha \ \\ alpha\ <strong>en</strong>d { bmatrix } \ \ [ 1 0 pt ]&−\begin { bmatrix }\ s q r t { 2 } \ alpha \ \0\ <strong>en</strong>d { bmatrix }% \ <strong>en</strong>d { s p l i t }\ <strong>en</strong>d { eqnarray }[Θ1Θ 2][ [ ] 1 1 α+ √ 12 1 −1]α[√ ] 2α−0(6.5)(6.6)


196 L A TEXExist<strong>en</strong> otros ambi<strong>en</strong>tes más para matemáticas. Si los quieres revisar, consulta alguno<strong>de</strong> los libros <strong>de</strong> L A TEX.Espacios <strong>en</strong> fórmulas matemáticasTabla 6.18En el modo <strong>de</strong> matemáticas es muchas veces necesario acomodar <strong>de</strong> manera específicaalgunos símbolos, moviéndolos hacia la izquierda o hacia la <strong>de</strong>recha. En latabla 6.18 vemos los distintos tipos <strong>de</strong> espacios que pue<strong>de</strong>s t<strong>en</strong>er. Están divididos <strong>en</strong>trepositivos (hacia la <strong>de</strong>recha) y negativos (<strong>de</strong> retroceso).Comandos <strong>de</strong> espacio <strong>en</strong> modo matemáticoEspacio positivoAbr Completo Ejemplo Normalmu \mspace{1mu} xx xx\, \thinspace x \, x x x xx\: \medspace x\medspace x x x xx\; \thickspace x \; x x x xx\<strong>en</strong>skip x\<strong>en</strong>skip x x x xx\quad x\quad x x x xx\qquad x\qquad x x x xxEspacio negativoAbr Completo Ejemplo Normal\! \negthinspace x \! x x x xx\negmedspace x\negmedspace x xx xx\negthickspace x\negthickspace x xx xxEs necesario aclarar que estos espacios se pue<strong>de</strong>n utilizar también fuera <strong>de</strong>l <strong>en</strong>tornomatemático, <strong>en</strong> el modo <strong>de</strong> texto, excepto por \mspace{} que se usa únicam<strong>en</strong>te <strong>en</strong> modomatemático.Actividad 6.42 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te ecuación:G T C =∑1 N−1N i=0 σ2 i( ∏N−1) 1i=0 σ2 Ni(6.7)


6.10 Imág<strong>en</strong>es y figuras 197Actividad 6.43 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te ecuación:s n ≠ s n−1 = s n−2 M 1 = 0.4 (6.8)s n ≠ s n−1 ≠ s n−2 M 2 = 0.9 (6.9)s n = s n−1 ≠ s n−2 M 3 = 1.5 (6.10)s n = s n−1 = s n−2 M 4 = 2.0 (6.11)Actividad 6.44 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te ecuación:[ ] [ ] [ ] [ ]x 01 x 01= 1 1 1 θ 00 θ 01 1 1x 10 x 11 2 1 −1 θ 10 θ 11 1 −1[]θ 00 + θ 01 + θ10 + θ 11 θ 00 − θ 01 + θ10 − θ 11(6.12)=θ 00 + θ 01 − θ10 − θ 11 θ 00 − θ 01 − θ10 + θ 11= θ 00 α 0,0 + θ 01 α 0,1 + θ 10 α 1,0 + θ 11 α 1,1Marcos alre<strong>de</strong>dor <strong>de</strong> expresionesEl comando \box{ ...} sirve para <strong>en</strong>marcar una expresión. Veamos un ejemplo:\ [ \ begin { pmatrix }\ <strong>en</strong>skip \ boxed { a}& b &c \ \d&\ boxed { e}& f \ \g&h&\ boxed { i } \ <strong>en</strong>skip \\ <strong>en</strong>d { pmatrix }\ ]⎛⎜⎝⎞a b c⎟d e f ⎠g h iCon esto damos por terminada la parte correspondi<strong>en</strong>te a fórmulas matemáticas. Porsupuesto que esto no agota el material relevante, pues por cuestiones <strong>de</strong> tiempo <strong>de</strong>jamosfuera muchísimas características y posibilida<strong>de</strong>s que ti<strong>en</strong>e L A TEX. Sin embargo, creemosque con esta introducción, podrás seguir a<strong>de</strong>lante <strong>de</strong> manera in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te, <strong>de</strong> existirel interés <strong>en</strong> ti.6.10. Imág<strong>en</strong>es y figuras6.10.1. Tablas, figuras, etc.Habrás notado a lo largo <strong>de</strong> este libro que aparec<strong>en</strong> figuras o tablas que se vannumerando. Más aún, la numeración <strong>de</strong> las tablas, por ejemplo, es in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> la


198 L A TEX<strong>de</strong> las gráficas o, <strong>en</strong> g<strong>en</strong>eral, figuras que queramos incluir. Esto se hace mediante loque L A TEX llama flotantes. Les llama así porque le pue<strong>de</strong>s indicar al compilador quelas acomo<strong>de</strong> no forzosam<strong>en</strong>te don<strong>de</strong> aparec<strong>en</strong>, sino <strong>en</strong> la primera página <strong>en</strong> la qu<strong>en</strong>o ocasion<strong>en</strong> que se <strong>de</strong>je espacio <strong>en</strong> blanco innecesario. Por supuesto que también lepue<strong>de</strong>s indicar que las coloque exactam<strong>en</strong>te don<strong>de</strong> aparec<strong>en</strong>, sin importar el armado <strong>de</strong>las páginas que las prece<strong>de</strong>n, o haci<strong>en</strong>do tú el armado a pie.Las flotantes que vamos a revisar acá son únicam<strong>en</strong>te dos:Figuras (figure)Tablas (table)Ambas flotantes ti<strong>en</strong><strong>en</strong> los mismos argum<strong>en</strong>tos, que ti<strong>en</strong><strong>en</strong> que ver fundam<strong>en</strong>talm<strong>en</strong>tecon dón<strong>de</strong> se <strong>de</strong>sea que se les acomo<strong>de</strong>; ambas prove<strong>en</strong> un espacio con la posibilidad<strong>de</strong> ponerles un título (\caption) 4 . Defin<strong>en</strong> un ambi<strong>en</strong>te don<strong>de</strong> los cambios <strong>de</strong>tipo <strong>de</strong> letra o tamaño serán efectivos únicam<strong>en</strong>te <strong>de</strong>ntro <strong>de</strong> ese ambi<strong>en</strong>te. En g<strong>en</strong>eral,el ambi<strong>en</strong>te table se usa para material que se pres<strong>en</strong>ta <strong>en</strong> forma <strong>de</strong> tabla o lista, mi<strong>en</strong>trasque el <strong>de</strong> figure se usa para material gráfico. La sintaxis <strong>de</strong> estos ambi<strong>en</strong>tes es lasigui<strong>en</strong>te:Para figuras:\ begin { f i g u r e } [ posicionador ]Cont<strong>en</strong>ido\ caption { Título <strong>de</strong> la figura }\ <strong>en</strong>d { f i g u r e }Para tablas (o cuadros):\ begin { t a b l e } [ posicionador ]Cont<strong>en</strong>ido\ caption { Título <strong>de</strong> la tabla }\ <strong>en</strong>d { t a b l e }Tabla 6.19Si el cont<strong>en</strong>ido <strong>de</strong> la figura o tabla va antes <strong>de</strong> \caption, <strong>en</strong>tonces el título apareceráabajo <strong>de</strong> la figura. Si va <strong>de</strong>spués, esto es que \caption sea el primer r<strong>en</strong>glón <strong>de</strong>spués <strong>de</strong>que empieza la figura o tabla, el título irá arriba. La posición <strong>de</strong> la figura o tabla pue<strong>de</strong>ser:Posiciones posibles para los flotantesletratbphsignificadotop: Lo coloca <strong>en</strong> la parte superior <strong>de</strong> la primera página disponible.bottom: Lo coloca <strong>en</strong> la parte inferior <strong>de</strong> la primera página don<strong>de</strong>quepa.page: Lo coloca <strong>en</strong> una página <strong>de</strong> flotantes, la primera que pueda.here: Lo coloca, si es que pue<strong>de</strong>, <strong>en</strong> el punto don<strong>de</strong> aparece.Continúa <strong>en</strong> la sigui<strong>en</strong>te página4 También hay la posibilidad <strong>de</strong> marcarlas con una etiqueta para po<strong>de</strong>r hacer refer<strong>en</strong>cias a ellas, perodado lo poco <strong>de</strong>l tiempo no <strong>en</strong>traremos <strong>en</strong> eso <strong>en</strong> esta ocasión.


6.10 Imág<strong>en</strong>es y figuras 199Tabla 6.19 Posiciones posibles para los flotantes Continúa <strong>de</strong> la página anteriorletraHsignificadoHere: Incondicionalm<strong>en</strong>te don<strong>de</strong> aparece. Si es necesario, porque lafigura no quepa <strong>en</strong> esa página, <strong>de</strong>ja página <strong>en</strong> blanco y lo coloca <strong>en</strong> lasigui<strong>en</strong>te página.! Try har<strong>de</strong>r: Int<strong>en</strong>ta <strong>de</strong> manera más firme acomodar la figura o tabladon<strong>de</strong> se especifica con los posicionadores que sigu<strong>en</strong> a !.Para acomodar una figura o tabla proce<strong>de</strong>s a dar tus prefer<strong>en</strong>cias, que son combinaciones<strong>de</strong> las primeras tres letras. L A TEX tratará <strong>de</strong> acomodar la figura, colocándola <strong>en</strong>la misma página o posponiéndola, procurando <strong>de</strong>jar poco espacio <strong>en</strong> blanco. Si no seespecifica, el valor por omisión es tbp. L A TEX podría no acomodar las figuras como leindicas porque ti<strong>en</strong>e parámetros que le indican, por ejemplo, cuántas figuras pue<strong>de</strong>n ir<strong>en</strong> una misma página o qué porc<strong>en</strong>taje <strong>de</strong>l total <strong>de</strong> la página pue<strong>de</strong>n ocupar. No <strong>en</strong>traremos<strong>en</strong> estos <strong>de</strong>talles por falta <strong>de</strong> tiempo. En la mayoría <strong>de</strong> los casos, y sobre todo <strong>en</strong>un principio, pue<strong>de</strong>s trabajar con los valores por omisión, excepto posiblem<strong>en</strong>te parael posicionami<strong>en</strong>to. Te recom<strong>en</strong>damos, <strong>en</strong> g<strong>en</strong>eral, poner H y si no se forma “bonito”,proce<strong>de</strong>r a acomodar la figura o tabla a pie. Veamos algunos ejemplos s<strong>en</strong>cillos, con elcódigo <strong>de</strong> L A TEX que los produce.Tabla 6.20Conversión <strong>de</strong> grados Far<strong>en</strong>heit a C<strong>en</strong>tígradosFahr C<strong>en</strong>t32 040 4.580 27\ begin { t a b l e } [ ! h ]\ caption { Conversión <strong>de</strong> Far<strong>en</strong>heita C<strong>en</strong>tígrados }\ begin { t a b u l a r } [ t ] { | r | r | }\ h l i n e\ bf Fahr & \ bf C<strong>en</strong>t \ \ \ h l i n e32 & 0 \ \40 & 4 . 5 \ \80 & 2 7 \ \ \ h l i n e\ <strong>en</strong>d { t a b u l a r }\ <strong>en</strong>d { t a b l e }Pue<strong>de</strong>s cambiar varios aspectos <strong>de</strong> esta tabla. Si, como ya dijimos, quieres que laacomo<strong>de</strong> <strong>en</strong> la parte superior <strong>de</strong> una página, conseguirías que coloque primero el textoque dimos como código y <strong>de</strong>spués la tabla misma. Sin embargo, es poco recom<strong>en</strong>dabledar una única posición como opción, porque <strong>en</strong>tonces si L A TEX no pue<strong>de</strong> acomodar a latabla o figura <strong>en</strong> la sigui<strong>en</strong>te página, lo más seguro es que ya no la coloque <strong>en</strong> ningúnlugar y la perdamos. Observa cómo la tabla 6.21 que estás colocando inmediatam<strong>en</strong>te<strong>de</strong>spués <strong>de</strong> estas líneas, queda acomodada <strong>de</strong> manera apar<strong>en</strong>tem<strong>en</strong>te “arbitraria” (está


200 L A TEXacomodada utilizando sólo la mitad <strong>de</strong>l ancho <strong>de</strong> la página).Tabla 6.21Conversión <strong>de</strong> Far<strong>en</strong>heit a C<strong>en</strong>tígradosFahr C<strong>en</strong>t32 040 4.580 27La tabla 6.21 fue g<strong>en</strong>erada con el sigui<strong>en</strong>te<strong>en</strong>cabezado: \begin{table }[ H]. Las líneas\ begin { c<strong>en</strong>ter }. . .\ <strong>en</strong>d { c<strong>en</strong>ter }se pue<strong>de</strong>n usar para c<strong>en</strong>trar cualquier párrafo,línea, figura o tabla.Cuando <strong>de</strong>jas que L A TEX acomo<strong>de</strong> a la tabla o figura don<strong>de</strong> mejor pueda – <strong>en</strong> aus<strong>en</strong>cia<strong>de</strong> H – <strong>de</strong>berá haber un r<strong>en</strong>glón <strong>en</strong> blanco antes y <strong>de</strong>spués <strong>de</strong> la tabla, para evitarque se <strong>en</strong>cim<strong>en</strong> o mezcl<strong>en</strong> r<strong>en</strong>glones que pusimos <strong>en</strong> párrafos separados.En una flotante <strong>de</strong> tabla pue<strong>de</strong> colocar uno o más array, cuidando nada más <strong>de</strong><strong>de</strong>clarar un ambi<strong>en</strong>te matemático a<strong>de</strong>ntro.Actividad 6.45 Codifica <strong>en</strong> L A TEX la tabla 6.22 <strong>en</strong> la sigui<strong>en</strong>te página. Pon el posicionami<strong>en</strong>topara que aparezca exactam<strong>en</strong>te don<strong>de</strong> se tecleó.Tabla 6.22Repres<strong>en</strong>taciones numéricasDecimal Binario Octal Hexa<strong>de</strong>cimal1 1 1 12 10 2 23 11 3 35 101 5 57 111 7 78 1000 10 815 1111 17 F16 10000 20 10Todo lo que dijimos <strong>de</strong> las tablas se aplica a las figuras. El contador <strong>de</strong> tablas es in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te<strong>de</strong>l <strong>de</strong> figuras. L A TEX provee un mecanismo s<strong>en</strong>cillo para incluir imág<strong>en</strong>eso figuras g<strong>en</strong>eradas <strong>de</strong>s<strong>de</strong> fuera y que estén codificadas <strong>en</strong> postscript o imág<strong>en</strong>es .png.Esto se hace con el comando \inclu<strong>de</strong>graphics {...} que toma como argum<strong>en</strong>to un archivo<strong>en</strong> el que se <strong>en</strong>cu<strong>en</strong>tre la imag<strong>en</strong> o figura que se <strong>de</strong>sea incluir. En el archivo dummy.psse <strong>en</strong>cu<strong>en</strong>tra una figura (hecha <strong>en</strong> xfig) que <strong>de</strong>seamos incorporar <strong>en</strong> nuestro docum<strong>en</strong>to.Para hacerlo, t<strong>en</strong>emos que incluir el uso <strong>de</strong>l paquete graphics <strong>en</strong> el preámbulo <strong>de</strong>l


6.10 Imág<strong>en</strong>es y figuras 201docum<strong>en</strong>to: \usepackage{graphics}. Este paquete cu<strong>en</strong>ta con los mecanismos para po<strong>de</strong>rmanipular la figura:Figura 6.1Gráfico introducido con inclu<strong>de</strong>graphicsque fue incluida con el sigui<strong>en</strong>te código:\ begin { f i g u r e } [ H]\ l a b e l { f i g : 1 }\ caption { 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 [ width = . . 5 \ t e x t w i d t h ] { l a t e x /dummy}\ <strong>en</strong>d { f i g u r e }El paquete graphics conti<strong>en</strong>e a<strong>de</strong>más comandos que permit<strong>en</strong> girar y escalar unaimag<strong>en</strong>, párrafo, tabla, símbolo, etc. Ti<strong>en</strong>es dos maneras <strong>de</strong> escalar un objeto: <strong>de</strong> manerarelativa, dici<strong>en</strong>do el factor <strong>de</strong> escala, como se muestra <strong>en</strong> la figura 6.3a (\scalebox{.25});o indicando la proporción <strong>en</strong> la escala horizontal <strong>en</strong>tre llaves y con la escala vertical<strong>en</strong>tre corchetes: \scalebox{.2}[.3], como <strong>en</strong> 6.3b (\scalebox {.25}[.5]). Tambiénpue<strong>de</strong>s dar medidas absolutas, como <strong>en</strong> la figura 6.3c (\resizebox{8cm}{2cm}) o bi<strong>en</strong>,utilizar una escala relativa, don<strong>de</strong> omitimos el factor vertical, y se asumirá el mismoque el horizontal, por ejemplo 6.3d (\resizebox{2cm}{!}). En la escala absoluta se <strong>de</strong>b<strong>en</strong>dar las dos medidas. Cualquiera <strong>de</strong> ellas pue<strong>de</strong> ser sustituida por !.


202 L A TEXFigura 6.2Escalando objetos con graphics.(a) Misma horizontal y vertical(b) Distinta horizontal quevertical(c) Escala absoluta(d) Escala relativaOtras dos posibilida<strong>de</strong>s que ti<strong>en</strong>es con objetos es la <strong>de</strong> rotarlos o “espejearlos”.En la figura 6.3 pue<strong>de</strong>s ver rotaciones <strong>de</strong> 45 grados 6.4a (\rotatebox{45}), <strong>de</strong> 180 6.4b(\rotatebox{180}) y una figura y su reflejo 6.4c (\ reflectbox). En cada una <strong>de</strong> ellas semarca la línea base como una línea punteada, ya que algunas <strong>de</strong> las figuras (como larotada) fueron “subidas” para que no quedara <strong>de</strong>sproporcionada la figura.Se pue<strong>de</strong> observar también que estas figuras pue<strong>de</strong>n aparecer mezcladas con el texto,como aquí sin necesidad <strong>de</strong> incluir <strong>en</strong> una figura o tabla, don<strong>de</strong> lo únicoque se hizo fue insertar \ reflectbox {\ scalebox {.1}{\ inclu<strong>de</strong>graphics{dummy.ps}}} <strong>en</strong>tre laspalabras “aquí” y “sin”.Es importante insistir <strong>en</strong> que estas operaciones <strong>de</strong> escalar, rotar y reflejar las pue<strong>de</strong>saplicar a cualquier objeto: texto, fórmulas matemáticas (siempre y cuando estén <strong>en</strong>modo matemático .. o \(.. \)), tablas completas, figuras, etc.


6.10 Imág<strong>en</strong>es y figuras 203Figura 6.3Rotaciones y reflejos con graphics(a) Rotación <strong>de</strong> 45 (b) Rotación <strong>de</strong> 180(c) Figura y su reflejoSi por ejemplo quieres el reflejo <strong>de</strong> algo pero a lo largo <strong>de</strong>l eje horizontal, lo pue<strong>de</strong>sconseguir con el código que sigue\ scalebox { 2 } { r e f l e j o h o r i z o n t a l \ rotatebox {180}{ %\ r e f l e c t b o x { r e f l e j o h o r i z o n t a l } } }y que producereflejo horizontalreflejo horizontalDebes notar que lo que pasa al texto “abajo” <strong>de</strong> la línea base es la rotada, ya quetoma la esquina inferior izquierda como punto <strong>de</strong> rotación.Actividad 6.46 Codifica <strong>en</strong> L A TEX lo sigui<strong>en</strong>te:


204 L A TEXTabla 6.23Comparación <strong>de</strong> tamañosEntradaEdo 0 1q 0 q 0 q 1Entrada1Edo 0 q0 q0 q1q1 q0 q1q 1 q 0 q 1Actividad 6.47 Codifica <strong>en</strong> L A TEX la sigui<strong>en</strong>te expresión:α = b 2 − 4acα = b 2− 4acActividad 6.48 Importa a un archivo <strong>de</strong> L A TEX que use el paquete graphics alguna <strong>de</strong>las gráficas que elaboraste con xfig (la <strong>de</strong>l árbol g<strong>en</strong>ealógico, por ejemplo). La <strong>de</strong>best<strong>en</strong>er guardada <strong>en</strong> tu cu<strong>en</strong>ta, por lo que si no la exportaste, abre otra v<strong>en</strong>tana y ejecutaxfig para exportarla <strong>en</strong> postscript.6.10.2. Cortando figurasPue<strong>de</strong>s mostrar únicam<strong>en</strong>te parte <strong>de</strong> una figura utilizando el modo \inclu<strong>de</strong>graphics∗<strong>de</strong>l comando (agregando un asterisco al nombre <strong>de</strong>l comando) y dándole parámetrosopcionales <strong>en</strong>tre corchetes. La primera pareja le indica la posición <strong>de</strong> la esquina inferiorizquierda y la segunda pareja la posición <strong>de</strong> la esquina superior <strong>de</strong>recha. Pue<strong>de</strong>sobservar el resultado <strong>en</strong> la figura 6.4.Figura 6.4Tomando pedazos <strong>de</strong> figurasi n c l u d e g r a p h i c s ∗[100 pt ,130 pt ] [ 2 2 0 pt ,260 pt ] \ { dummy. ps \ }


6.10 Imág<strong>en</strong>es y figuras 205En la figura 6.4 colocamos un marco alre<strong>de</strong>dor <strong>de</strong>l “recorte” para hacerlo más claro.Ese marco no aparece como resultado <strong>de</strong>l comando.6.10.3. ColoresTabla 6.24En el contexto <strong>de</strong> g<strong>en</strong>erar archivos pdf, utilizaremos para colorear dos paquetes,color y tikz. Aunque el primero es claro su objetivo, el segundo, tikz, es un paquete<strong>de</strong> L A TEX mucho muy po<strong>de</strong>roso para graficación y que incluye un sistema <strong>de</strong> colores –a<strong>de</strong>más compila tanto con pdflatex como con latex – . Está incluido <strong>de</strong>ntro <strong>de</strong>l paquetepgf aunque aporta una interfaz más s<strong>en</strong>cilla que la que soporta pgf. Es tan gran<strong>de</strong> ypo<strong>de</strong>roso que está dividido <strong>en</strong> varios paquetes para que elijas únicam<strong>en</strong>te aquellos queva a usar. En la tabla 6.24 damos una lista <strong>de</strong> los que vamos a requerir, por lo pronto,para g<strong>en</strong>erar colores. Cabe aclarar que para utilizar tikz es necesario cargar tambiénalgunos paquetes que nos sirv<strong>en</strong> como soporte, que listamos también a continuación 5 .Paquetes <strong>de</strong> pgf para colores y dibujosNombre Uso Descripcióntikz \usepackage{tikz} Éste es el paquete más importante <strong>de</strong> pgf,ya que da una interfaz s<strong>en</strong>cilla <strong>de</strong> usar paragraficar. Incluye también un sistema paracolores que permite combinar los coloresprincipales.xkeyval \usepackage{xkeyval} Permite asociar nombres <strong>de</strong> parámetros <strong>de</strong>lpaquete con los valores correspondi<strong>en</strong>tes.Se requiere también para otros paquetes.pifont usepackage{pifont} Se <strong>en</strong>carga <strong>de</strong>l manejo <strong>de</strong> bajo nivel para lasgráficas. Lo requiere el paquete tikz.color \usepackage{color} Proporciona una interfaz para po<strong>de</strong>r crearnuevos colores y un sistema para hacerlo.Veamos <strong>en</strong>tonces algunas manipulaciones que involucran color 6 . Por ejemplo, siquieres cambiar el color <strong>de</strong> lo que estamos haci<strong>en</strong>do t<strong>en</strong>emos el comando\ c o l o r { red }y <strong>de</strong>s<strong>de</strong> ese mom<strong>en</strong>to <strong>en</strong> a<strong>de</strong>lante, <strong>en</strong> el rango <strong>de</strong>l ambi<strong>en</strong>te <strong>en</strong> el que esté, todose escribirá <strong>en</strong> rojo. Los colores básicos con los que contamos se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> latabla 6.25.5 Todos estos paquetes pue<strong>de</strong>n obt<strong>en</strong>erse gratuitam<strong>en</strong>te <strong>de</strong> la direcciónhttp://www.tex.ac.uk/tex-archive/help/Catalogue/catalogue.htmlque es una excel<strong>en</strong>te fu<strong>en</strong>te <strong>de</strong> paquetes junto con su docum<strong>en</strong>tación6 Si ti<strong>en</strong>es una impresora <strong>en</strong> blanco y negro, esto aparecerá <strong>en</strong> distintos tonos <strong>de</strong> grises, pero <strong>en</strong> la


206 L A TEXTabla 6.25.Colores básicos con los que se cu<strong>en</strong>taCódigoResultado\ color{black}black black\colorbox{gray }{\ color{white}white} white\ color{red}red red\ color{yellow}yellow yellow\ color{cyan}cyan cyan\ color{blue}blue blue\ color{gre<strong>en</strong>}gre<strong>en</strong> gre<strong>en</strong>\ color{mag<strong>en</strong>ta}mag<strong>en</strong>ta mag<strong>en</strong>tay a<strong>de</strong>más t<strong>en</strong>emos los sigui<strong>en</strong>tes tonos <strong>de</strong> grises pre<strong>de</strong>finidos:\ color{black}black black\ color{darkgray}darkgray darkgray\ color{gray}gray gray\ color{ lightgray } lightgray lightgray\ color{white}white whiteComo colocamos todo <strong>en</strong> un tabular, el efecto <strong>de</strong>l cambio <strong>de</strong> color es únicam<strong>en</strong>te<strong>de</strong>ntro <strong>de</strong> la celda <strong>en</strong> que está escrito.T<strong>en</strong>emos la posibilidad <strong>de</strong> cambiar únicam<strong>en</strong>te el texto <strong>de</strong>seado con el sigui<strong>en</strong>tecódigo:Vamos cambiar <strong>de</strong> \ 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 } { azul }Vamos cambiar <strong>de</strong> rojo acolor azulEl paquete color también nos ofrece la posibilidad <strong>de</strong> conformar cajas con el fondo<strong>de</strong> ciertos colores para realzar algunos textos:\ colorbox { red } { \ t e x t c o l o r { blue }{ %Esta es una prueba } }Esta es una pruebaActividad 6.49 Teclea <strong>en</strong> un archivo fu<strong>en</strong>te <strong>de</strong> L A TEX don<strong>de</strong> uses el paquete color ygraphics, las líneas correspondi<strong>en</strong>tes a color y ve <strong>en</strong> la pantalla cómo quedan (<strong>de</strong>safortunadam<strong>en</strong>tela impresión no muestra el color, sino únicam<strong>en</strong>te distintos niveles <strong>de</strong>grises, pero <strong>en</strong> la pantalla sí lo pue<strong>de</strong>s apreciar).pantalla lo verás tal cual


6.10 Imág<strong>en</strong>es y figuras 2076.10.4. Dibujando objetos geométricosHay varios paquetes que te permit<strong>en</strong> dibujar objetos geométricos como líneas, círculos,arcos, etc. Utilizaremos acá TikZ – el subpaquete shapes y arrows –, que nos ofreceuna gran versatilidad. No veremos acá más que algunos objetos, ya que este paquete essumam<strong>en</strong>te ext<strong>en</strong>so.Para po<strong>de</strong>r usar comandos <strong>de</strong> tikz t<strong>en</strong>emos que estar <strong>de</strong>ntro <strong>de</strong> un ambi<strong>en</strong>te <strong>de</strong> estepaquete. tikz ti<strong>en</strong>e dos tipos <strong>de</strong> ambi<strong>en</strong>te, el <strong>de</strong> línea y el <strong>de</strong> párrafo:\ t ikz{} Ambi<strong>en</strong>te <strong>de</strong> línea.\ begin { t i k z p i c t u r e } . . .\ <strong>en</strong>d { t i k z p i c t u r e }Ambi<strong>en</strong>te <strong>de</strong> párrafo.Los modificadores van <strong>en</strong>tre corchetes y ti<strong>en</strong><strong>en</strong> que ver con aspectos g<strong>en</strong>erales <strong>de</strong>las figuras que <strong>de</strong>seamos construir. Ambos ambi<strong>en</strong>tes presupon<strong>en</strong> un tamaño, ya sea<strong>de</strong> líneas o <strong>de</strong> párrafo, dado <strong>en</strong> la unidad <strong>de</strong> medida que se especifique. La unidad <strong>de</strong>medida por omisión es <strong>en</strong> c<strong>en</strong>tímetros, pero se pue<strong>de</strong> cambiar. Prácticam<strong>en</strong>te todo loque <strong>de</strong>seemos dibujar va a t<strong>en</strong>er implícitas coor<strong>de</strong>nadas y longitu<strong>de</strong>s, que estarán dadasimplícitam<strong>en</strong>te <strong>en</strong> la unidad <strong>de</strong> medida.Para <strong>de</strong>notar a estas unida<strong>de</strong>s <strong>de</strong> medida, tikz utiliza vectores <strong>en</strong> el eje <strong>de</strong> las x,<strong>de</strong> las y’s y <strong>de</strong> las z’s. Es conv<strong>en</strong>i<strong>en</strong>te asegurarnos con qué unidad <strong>de</strong> medida estamostrabajando. La pue<strong>de</strong>s <strong>de</strong>finir <strong>en</strong> milímetros, pulgadas, c<strong>en</strong>tímetros o puntos. Preferimostrabajar con puntos, ya que ésta es una unidad que se usa <strong>en</strong> muchos otros lugares.Para establecer al punto como unidad <strong>de</strong> medida <strong>en</strong> los comandos <strong>de</strong> tikz utilizamos elsigui<strong>en</strong>te modificador:\ t i k z [ x=1pt , y=1pt , z=1 pt ] { . . . }\ begin { t i k z p i c t u r e } [ x=1pt , y=1pt , z=1 pt ]. . .\ <strong>en</strong>d { t i k z p i c t u r e }y a partir <strong>de</strong> ese mom<strong>en</strong>to y <strong>de</strong>ntro <strong>de</strong>l ambi<strong>en</strong>te <strong>de</strong>clarado, la unidad <strong>de</strong> medida será 1punto (1pt). Si se <strong>de</strong>clara otro ambi<strong>en</strong>te <strong>en</strong> otro lugar, habrá que hacer lo mismo, o bi<strong>en</strong>trabajar <strong>en</strong> c<strong>en</strong>tímetros.6.10.5. LíneasEl comando que permite dibujar líneas es \draw y hay que darle como argum<strong>en</strong>toslas coor<strong>de</strong>nadas <strong>de</strong> los puntos por los que quieres que pase. El formato más simple <strong>de</strong>lcomando es el sigui<strong>en</strong>te:


208 L A TEX\ draw ( ) – – ( ) . . . ;don<strong>de</strong> los puntos sucesivos indican que pue<strong>de</strong>s poner tantas coor<strong>de</strong>nadas como <strong>de</strong>sees.Las coor<strong>de</strong>nadas se pue<strong>de</strong>n dar como puntos relativos con la unidad <strong>de</strong> longitud <strong>de</strong>lambi<strong>en</strong>te; o bi<strong>en</strong> pue<strong>de</strong> ser algún objeto etiquetado 7 ; también pue<strong>de</strong> aparecer allí unacoor<strong>de</strong>nada con una unidad <strong>de</strong> medida específica. Si se trata <strong>de</strong> coor<strong>de</strong>nadas, consiste<strong>de</strong> una pareja con los elem<strong>en</strong>tos separados <strong>en</strong>tre sí por coma, don<strong>de</strong> el primer elem<strong>en</strong>to<strong>de</strong> la pareja es el <strong>de</strong>splazami<strong>en</strong>to sobre el eje x y el segundo sobre el eje y. También esimportante notar que los comandos <strong>de</strong> tikz <strong>en</strong> su mayoría terminan con punto y coma(;).Es importante m<strong>en</strong>cionar que el texto seguirá inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong>l puntoque el comando consi<strong>de</strong>re que requiere. Veamos algunos ejemplos:\ tikz [x=1pt,y=1pt]\draw(0,0) −− (20,30) −− (30,0) . Nota cómo el r<strong>en</strong>glón se acomodaverticalm<strong>en</strong>te para dar lugar al trazo y el texto continúa a partir <strong>de</strong>l final <strong>de</strong>lespacio ocupado. Si <strong>de</strong>seamos que el texto se acomo<strong>de</strong> <strong>en</strong>cima <strong>de</strong>l dibujo, t<strong>en</strong>emos quehacerlo a pie recorriéndonos hacia arriba y hacia la izquierda con comandos <strong>de</strong> \vspacey \hspace.\ vspace∗{−30 pt } % El máximo <strong>de</strong> l a segunda coor<strong>de</strong>nada y e l cambio% <strong>de</strong> l ínea .\ t i k z [ x=1pt , y=1 pt ] { \ draw (0 ,0) − −(20 ,30) − −(30 ,0);}\ hspace∗{−30 pt} %\ t i k z [ x=1pt , y=1 pt ] { \ draw(0 ,0) − −(20 ,30) − −(30 ,0);} %y l a s l íneas se acomoda como se está observandoy las líneas se acomodan como se está observando.Veamos más ejemplos <strong>de</strong> algunas figuras. Una manera <strong>de</strong> <strong>de</strong>jar espacio vertical paraacomodar algunas <strong>de</strong> las figuras es con \vspace. Observa:\ t i k z [ x=1pt , y=1 pt ] { \ draw ( 0 , 0 ) −− (30 ,5) −− (20 ,10) −− (60 ,15) %−− (70 ,50) −− (50 ,100) −− ( 1 2 0 , 1 0 0 ) ; }\ t i k z [ x=1pt , y=1 pt ] { \ draw (140 ,40) −− (190 ,40) −− (190 ,80)−− (140 ,80) −− ( 1 4 0 , 4 0 ) ; }7 Veremos más a<strong>de</strong>lante cómo etiquetar objetos para usarlos <strong>en</strong> un dibujo.


6.10 Imág<strong>en</strong>es y figuras 209Pue<strong>de</strong>s cambiar el ancho <strong>de</strong> la línea también con un modificador, line width y el tamaño <strong>de</strong>la línea se pue<strong>de</strong> dar <strong>en</strong> cualquier unidad <strong>de</strong> medida:\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ draw [ l i n e width =2 pt ] ( 0 , 0 ) −− ( 3 0 , 2 0 ) ;\ draw [ l i n e width =.13 i n ] (30,20)−− ( 5 0 , 0 ) ;\ draw [ l i n e width =.15cm] (50,0)−− ( 7 0 , 2 0 ) ;\ draw (70,20)−− ( 9 0 , 0 ) ;\ draw [ l i n e width =1 pt ] (90,0)−− ( 1 1 0 , 2 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }También se pue<strong>de</strong> dar el ancho <strong>de</strong> línea para todo un ambi<strong>en</strong>te, poniéndolo <strong>de</strong> modificador<strong>de</strong> ambi<strong>en</strong>te:\ begin { t i k z p i c t u r e } [ x=1pt , y=1pt, %l i n e width =2 pt ]\ draw ( 0 , 0 ) −− (30 ,20) −− (30 ,20) %−− (50 ,0) −− (50,0)−− (70 ,20) %−− (70,20)−− (90 ,0) −− (90 ,0) %−− ( 1 1 0 , 2 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }El comando \draw es fundam<strong>en</strong>tal <strong>en</strong> tikz ya que servirá también para acomodar objetos ydibujar figuras. Por ejemplo, para dibujar un rectángulo combinamos \draw con esa forma:\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ draw ( 0 , 0 ) r e c t a n g l e (140 ,120);\ <strong>en</strong>d { t i k z p i c t u r e }Siempre que introduces un ambi<strong>en</strong>te tikz, <strong>de</strong>bes p<strong>en</strong>sar que reservas un espacio rectangulardado por lo que dibujaste. Ese espacio logra cont<strong>en</strong>er todos los objetos que hayas acomodadoo dibujado <strong>en</strong> ese ambi<strong>en</strong>te. El (0,0) es la esquina inferior izquierda (aunque esto lo pue<strong>de</strong>smodificar) y la esquina superior <strong>de</strong>recha está dada por lo que hayas hecho <strong>de</strong>ntro <strong>de</strong>l ambi<strong>en</strong>te.Actividad 6.50 Escribe el código necesario para que se dibuje lo que sigue (el tamaño relativoes lo que importa).


210 L A TEXComo ya m<strong>en</strong>cionamos, tikz provee varias figuras geométricas con las que pue<strong>de</strong>s trabajarusando la biblioteca shapes <strong>de</strong> este paquete. Y como las figuras son cierto tipo <strong>de</strong> objetos,pue<strong>de</strong>s acomodarlos también <strong>en</strong> la retícula mediante draw. A<strong>de</strong>más <strong>de</strong>l rectángulo, contamoscon círculos (circle), diamantes (diamond) y elipses (ellipse). El formato para cada una <strong>de</strong> estasfiguras es el sigui<strong>en</strong>te: una vez que se ubica el punto don<strong>de</strong> se va a colocar la figura mediantedraw, cada una <strong>de</strong> las figuras ti<strong>en</strong>e sus propios parámetros. Quisiéramos antes m<strong>en</strong>cionarun modificador más que altera la forma <strong>de</strong> los puntos <strong>de</strong> quiebre para redon<strong>de</strong>arlos y que esroun<strong>de</strong>d corners. Observa el efecto que ti<strong>en</strong>e <strong>en</strong> el rectángulo que hicimos arriba:\ begin { t i k z p i c t u r e } %[x=1pt , y=1 pt ]\ draw [ x=1pt , y=1pt , roun<strong>de</strong>d corners ]( 0 , 0 ) r e c t a n g l e (140 ,120);\ <strong>en</strong>d { t i k z p i c t u r e }Pue<strong>de</strong>s jugar con qué tan redon<strong>de</strong>adas estén las esquinas, agregándole el redon<strong>de</strong>o <strong>en</strong> términos<strong>de</strong> una unidad <strong>de</strong> medida a continuación <strong>de</strong>l signo =. La medida se refiere a la distancia<strong>de</strong> lo que sería la esquina sin redon<strong>de</strong>ar a la redon<strong>de</strong>ada, medido verticalm<strong>en</strong>te.roun<strong>de</strong>dcornersroun<strong>de</strong>d corners=4ptroun<strong>de</strong>d corners=8ptroun<strong>de</strong>d corners=16ptque se consiguió con el sigui<strong>en</strong>te código:


6.10 Imág<strong>en</strong>es y figuras 211\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ draw [ roun<strong>de</strong>d corners ] (0 ,60) r e c t a n g l e ( 4 0 , 1 2 0 ) ;\ draw [ roun<strong>de</strong>d corners =4 pt ] (80 ,60) r e c t a n g l e (120 ,120);\ draw [ roun<strong>de</strong>d corners =8 pt ] (160 ,60) r e c t a n g l e (200 ,120);\ draw [ roun<strong>de</strong>d corners =16 pt ] (240 ,60) r e c t a n g l e (280 ,120);\ <strong>en</strong>d { t i k z p i c t u r e }Otros <strong>de</strong> los modificadores que pue<strong>de</strong>s poner a \draw son el color <strong>de</strong> las mismas – blue,red, yellow, cyan, gre<strong>en</strong>, mag<strong>en</strong>ta –; el tipo <strong>de</strong> línea – [loosely|<strong>de</strong>nsely]{solid |dotted|dashed}–. Estos últimos parámetros no llevan signo = o i<strong>de</strong>ntificador cuando aparec<strong>en</strong> <strong>en</strong> el contexto <strong>de</strong>un comando \draw y pue<strong>de</strong>s usarlos con figuras, líneas o arcos. Hay que m<strong>en</strong>cionar también queel redon<strong>de</strong>o <strong>de</strong> esquinas pue<strong>de</strong> aplicarse únicam<strong>en</strong>te a un segm<strong>en</strong>to <strong>de</strong> la trayectoria pintada,si se coloca antes <strong>de</strong> las coor<strong>de</strong>nadas a partir <strong>de</strong> la cual <strong>de</strong>be aparecer. Veamos un pequeñoejemplo:\ begin { t i k z p i c t u r e } [ x=1pt , y =1.5 pt ]\ draw ( 0 , 0 ) [ blue , roun<strong>de</strong>d corners =10 pt ]−− (30 ,50) −− (80 ,25)[ sharp corners ] −− (75 , 75)−− ( 0 , 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Como es muy común querer terminar <strong>en</strong> la coor<strong>de</strong>nada <strong>en</strong> la que se empezó (cerrar unpolígono), tikz proporciona la meta-coor<strong>de</strong>nada cycle que, don<strong>de</strong> aparezca, regresa la primerpunto dado <strong>en</strong> la trayectoria, como por ejemplo <strong>en</strong> el sigui<strong>en</strong>te dibujo, <strong>en</strong> que ambas vecesregresa la coor<strong>de</strong>nada (0,0).\ begin { t i k z p i c t u r e } [ x=1pt , y =1.5 pt ]\ draw ( 0 , 0 ) [ blue , roun<strong>de</strong>d corners =10 pt ]−− (30 ,50) −− (80 ,25)[ sharp corners ] −− (75 , 75)−− cycle −− (27 ,12) −− (35 ,80) −− cycle ;\ <strong>en</strong>d { t i k z p i c t u r e }En la tabla 6.26, se refiere siempre a una cantidad <strong>de</strong> medida, como mm, cm, in, pt,em, ex, mi<strong>en</strong>tras que es un número que pue<strong>de</strong> o no ser un <strong>en</strong>tero, y <strong>en</strong> algunos casospue<strong>de</strong> ser negativo. Estos modificadores pue<strong>de</strong>n aparecer <strong>en</strong> el ambi<strong>en</strong>te o <strong>en</strong> el comando.


212 L A TEXTabla 6.26Modificadores para el trazo <strong>de</strong> líneas y figurasParámetro Descripción Por omisióncolor=x=y=z=line width=very thickthickvery thinthinpattern= patrónpattern color=roun<strong>de</strong>d cornersroun<strong>de</strong>d corners= dimsharp cornersfillfill = < color >dashedloosely dashed<strong>de</strong>nsely dasheddottedloosely dotted<strong>de</strong>nsely dottedsolidEspecifica el color <strong>en</strong> que se va a pintarla línea. Pue<strong>de</strong> aparecer directam<strong>en</strong>teel color nada más.Unida<strong>de</strong>s para cada uno <strong>de</strong> los ejes.Son opcionales cualquier subconjunto<strong>de</strong> ellos.Especifica el grosor <strong>de</strong> las líneas quese dibujan (ver tabla 6.27.Rell<strong>en</strong>a la figura o el polígono con esepatrón 8 .Deci<strong>de</strong> el color <strong>de</strong> los trazos que compon<strong>en</strong>al patrón.Indica si los cambios <strong>de</strong> dirección sehac<strong>en</strong> redon<strong>de</strong>ados o no, y si sí concuánto redon<strong>de</strong>o.Indica que la figura <strong>de</strong>berá ser sólida,rell<strong>en</strong>ada. Si se indica el color, el rell<strong>en</strong>o<strong>de</strong>berá ser <strong>de</strong> ese < color > –ver figura 6.5 don<strong>de</strong> se ejemplifica estaopción – .Da el tipo o estilo <strong>de</strong> lineas que se vana dibujar (ver tabla 6.27).color: blackdim: 1cmdim: 1ptestilo: solidblacksharp cornersnosolid8 Para ver los tipos <strong>de</strong> patrones disponibles, consultar el manual <strong>de</strong> TikZ.


6.10 Imág<strong>en</strong>es y figuras 213Tabla 6.27Opciones <strong>de</strong> grosor y estilos <strong>de</strong> líneasvery thin loosely dotted dotted <strong>de</strong>nsely dottedthin loosely dotted dotted <strong>de</strong>nsely dottednormal loosely dotted dotted <strong>de</strong>nsely dottedthick loosely dotted dotted <strong>de</strong>nsely dottedvery thick loosely dotted dotted <strong>de</strong>nsely dottedvery thin loosely dashed dashed <strong>de</strong>nsely dashedthin loosely dashed dashed <strong>de</strong>nsely dashednormal loosely dashed dashed <strong>de</strong>nsely dashedthick loosely dashed dashed <strong>de</strong>nsely dashedvery thick loosely dashed dashed <strong>de</strong>nsely dashedFigura 6.5Ejemplo <strong>de</strong> opciones para dibujar\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ draw [ f i l l ] ( 0 , 0 ) [ blue , roun<strong>de</strong>d corners =10 pt ]−− (30 ,50) −− ( 8 0 , 2 5 ) [ sharp corners ]−− (75 , 75)−− cycle −− (27 ,12)−− (35 ,80) −− cycle ;\ <strong>en</strong>d { t i k z p i c t u r e }Pasemos ya a ver las distintas figuras que pue<strong>de</strong>s dibujar con el comando \draw. Las mostramos<strong>en</strong> la tabla 6.28.


214 L A TEXTabla 6.28Ejemplos <strong>de</strong> figuras <strong>en</strong> TikZComandoFigura\ tikz [x=1pt,y=1pt]{\draw(25,10) ellipse (20pt and 10pt);}Como pue<strong>de</strong>s observar, la coor<strong>de</strong>nada dada a continuación <strong>de</strong> \draw da elc<strong>en</strong>tro <strong>de</strong> la elipse, mi<strong>en</strong>tras que la primera dim<strong>en</strong>sión da el diámetro horizontaly la segunda el vertical.\ tikz [x=1pt,y=1pt]{\draw (25,10) circle (12.5pt );}En este caso, también la primera coor<strong>de</strong>nada nos da el c<strong>en</strong>tro <strong>de</strong>l círculo,mi<strong>en</strong>tras que la dim<strong>en</strong>sión nos da el diámetro.\ tikz [x=1pt,y=1pt]{\draw (25,10) arc (90:0:25pt );}Igual que antes, la primera coor<strong>de</strong>nada te da el c<strong>en</strong>tro <strong>de</strong>l círculo completo,aunque únicam<strong>en</strong>te vayas a pintar un arco. Los tres números <strong>en</strong>tre paréntesisti<strong>en</strong><strong>en</strong> el sigui<strong>en</strong>te significado: pue<strong>de</strong>s ver al circulo <strong>en</strong> el eje coor<strong>de</strong>nadocon el c<strong>en</strong>tro <strong>en</strong> (0,0); el primer numero da el ángulo <strong>en</strong> el que empieza elarco; el segundo da el ángulo <strong>en</strong> el que termina, moviéndose siempre <strong>en</strong> els<strong>en</strong>tido <strong>de</strong> las manecillas <strong>de</strong>l reloj; el tercer numero da el radio <strong>de</strong>l círculo<strong>de</strong>l que el arco forma parte.\ tikz [x=1pt,y=1pt]{\draw (5,0) .. controls (15,15) and (30,15) .. (40,0);}Esta construcción te permite dibujar curvas que no son forzosam<strong>en</strong>te arcos<strong>de</strong> círculos. Las coor<strong>de</strong>nadas <strong>de</strong> control repres<strong>en</strong>tan puntos para dibujar elbezier: <strong>en</strong>tre el orig<strong>en</strong> y el primer punto la recta que los une es tang<strong>en</strong>te a lacurva; similarm<strong>en</strong>te para el segundo punto.Tabla 6.29A<strong>de</strong>más <strong>de</strong> las variaciones <strong>en</strong> la forma y el tipo <strong>de</strong> línea, también pue<strong>de</strong>s pedir que la líneasea doble, como lo ejemplificamos <strong>en</strong> la tabla 6.29.Líneas 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);Realm<strong>en</strong>te el número <strong>de</strong> variaciones sobre estos cuatro simples comandos es muy gran<strong>de</strong>,así que te recom<strong>en</strong>damos consultar el manual <strong>de</strong> TikZ para po<strong>de</strong>r usar todas ellas.


6.10 Imág<strong>en</strong>es y figuras 215En el caso <strong>de</strong> las líneas y los polígonos, pue<strong>de</strong>s t<strong>en</strong>er el último segm<strong>en</strong>to tome o no la forma<strong>de</strong> flecha. Los tipos <strong>de</strong> flechas que t<strong>en</strong>emos disponibles se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> las tablas 6.30 y seconsigu<strong>en</strong> poni<strong>en</strong>do como modificador <strong>de</strong> la línea el tipo <strong>de</strong> flecha que <strong>de</strong>seas. Vi<strong>en</strong><strong>en</strong> <strong>en</strong> elpaquete <strong>de</strong> biblioteca <strong>de</strong> flechas <strong>de</strong> TikZ que se invoca con la sigui<strong>en</strong>te línea <strong>en</strong> el preámbulo<strong>de</strong>l docum<strong>en</strong>to.\ u s e t i k z l i b r a r y { arrows }Algunas puntas <strong>de</strong> flechas vi<strong>en</strong><strong>en</strong> por omisión <strong>en</strong> TikZ. Los estilos <strong>de</strong>l cuerpo <strong>de</strong> la flechapue<strong>de</strong>n ser cualesquiera <strong>de</strong> los listados anteriorm<strong>en</strong>te, por lo que los ejemplos los daremos conlínea sólida para ejemplificar nada más las puntas. Los distintos tipos <strong>de</strong> puntas <strong>de</strong> flechas se<strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> la tabla 6.30.Tabla 6.30Tipos <strong>de</strong> puntas <strong>de</strong> flechas <strong>en</strong> 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 pue<strong>de</strong>s observar hay bastante juego con el tipo <strong>de</strong> flecha y el orig<strong>en</strong> <strong>de</strong>l segm<strong>en</strong>to.Para más información, consulta el manual <strong>de</strong> TikZ.Otro aspecto bonito <strong>de</strong> TikZ es que pue<strong>de</strong>s dar distintos patrones para el rell<strong>en</strong>o <strong>de</strong> figuras.Esto se logra cargando el paquete <strong>de</strong> biblioteca patterns <strong>en</strong> el preámbulo <strong>de</strong>l docum<strong>en</strong>to.\ u s e t i k z l i b r a r y { p a t t e r n s }En el manual <strong>de</strong> TikZ vi<strong>en</strong>e una lista <strong>de</strong> patrones interesantes que pue<strong>de</strong>s <strong>de</strong>sear usar.En las tablas 6.31 y 6.32 daremos ejemplos <strong>de</strong> distintos objetos geométricos que pue<strong>de</strong>spintar con TikZ. Es importante que recuer<strong>de</strong>s que las coor<strong>de</strong>nadas que se dan supon<strong>en</strong> queel comando inicia <strong>en</strong> (0,0), y a partir <strong>de</strong> ahí se calcula la posición <strong>de</strong>l dibujo. Sin embargo,el acomodo <strong>de</strong> las figuras se hizo con mecanismos que se darán a continuación. Asimismose hicieron algunos trucos para que la altura <strong>de</strong>l r<strong>en</strong>glón fuera la a<strong>de</strong>cuada para cada figura.Deberás tomar <strong>en</strong> cu<strong>en</strong>ta la sección que sigue don<strong>de</strong> <strong>en</strong>señaremos a acomodar <strong>de</strong> mejor maneralas figuras.


216 L A TEXTabla 6.31Figuras geométricas que se pue<strong>de</strong>n lograr <strong>en</strong> TikZ\ begin { t i k z p i c t u r e } [ x=1pt , y=1pt , l i n e width =3 pt] %\ useasboundingbox ( 0 , 0 ) r e c t a n g l e( 1 4 0 , 6 0 ) ;\ draw[− l a t e x , roun<strong>de</strong>d corners] %(100 ,50) −− (0 ,20) −− ( 5 0 , 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=3 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 7 0 , 7 0 ) ;\ draw [ t h i c k ] (0 ,60) −− (70 ,10)−− (70 ,60) −− (0 ,10)−− cycle ;\ draw [ t h i c k , f i l l =red ] (90 ,60)−− (160 ,10) −− (160 ,60)−− (90 ,10) −− cycle ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 ) r e c t a n g l e ( 1 7 0 , 7 0 ) ;\ draw [ f i l l ] (10 ,10) r e c t a n g l e ( 8 0 , 6 0 ) ;\ draw [ f i l l =white ] (20 ,20) r e c t a n g l e ( 4 0 , 4 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −10) r e c t a n g l e ( 1 4 0 , 6 0 ) ;\ draw [ very t h i c k ] (30 ,30) c i r c l e (20 pt ) ;\ draw [ very t h i c k , red ] (100 ,30) c i r c l e (20 pt ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Continúa <strong>en</strong> la página sigui<strong>en</strong>te


6.10 Imág<strong>en</strong>es y figuras 217Tabla 6.31 Figuras geométricas que se pue<strong>de</strong>n lograr <strong>en</strong> TikZ Continúa <strong>de</strong> la página anterior\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 4 0 , 7 0 ) ;\ draw [ very t h i c k ] (20 ,38) −− (10 ,0)−− (50 ,0) arc ( 0 : 7 6 : 4 0 pt ) ;\ draw [ f i l l ] (100 ,38) −− (90 ,0)−− (130 ,0) arc ( 0 : 7 6 : 4 0 pt ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 4 0 , 7 0 ) ;\ draw [ very t h i c k , red ] (70 ,30)e l l i p s e (50 pt and 20 pt ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 4 0 , 7 0 ) ;\ draw [ very t h i c k , step=5mm, red ,p a t t e r n = f i v e p o i n t stars ,p a t t e r n c o l o r =red ] \(70 ,30) e l l i p s e (50 pt and 20 pt ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −50)r e c t a n g l e (170 ,100);\ draw (80 ,60) arc (50:90:100 pt ) ;\ draw [ f i l l ] (160 ,60)arc (50:90:100 pt ) ;\ draw [ very t h i n , l o o s e l y dashed ](160 ,60) −− (95 , −50)−− (140 , −50) −− (95 , −50)−− ( 9 5 , 8 3 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Otro aspecto que es frecu<strong>en</strong>te que quieras t<strong>en</strong>er <strong>en</strong> un docum<strong>en</strong>to es la graficación <strong>de</strong> funciones.TikZ proporciona algunas funciones típicas que pue<strong>de</strong>s querer graficar, como lo son laparábola, el círculo, s<strong>en</strong>o y cos<strong>en</strong>o. Para otras funciones se t<strong>en</strong>drán que preparar las tablas <strong>en</strong>


218 L A TEXTabla 6.32un archivo aparte, pero se pue<strong>de</strong>n graficar. Veamos primero estas cuatro <strong>en</strong> la tabla 6.32.Graficación <strong>de</strong> funciones comunes <strong>en</strong> TikZ\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 4 0 , 7 0 ) ;\ draw [ t h i c k ] (45 ,50)arc (60:360:20 pt ) ;\ draw [ t h i c k , f i l l ] (115 ,50)arc (60:360:20 pt ) ;\ <strong>en</strong>d { t i k z p i c t u r e }\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 0 0 , 5 0 ) ;\ draw ( 0 , 0 )parabola [ parabola h e i g h t =30 pt ]( 3 0 , 0 ) ;\ draw (50 ,30)parabola [ parabola h e i g h t=−30pt ]( 9 0 , 3 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Pue<strong>de</strong>s obt<strong>en</strong>er pedazos <strong>de</strong> parábola si das como segunda coor<strong>de</strong>nada algo que no seala imag<strong>en</strong> <strong>de</strong>l punto <strong>de</strong> orig<strong>en</strong>, o bi<strong>en</strong> con modificadores:\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e ( 1 4 0 , 6 0 ) ;\ draw ( 0 , 0 ) parabola ( 3 0 , 4 5 ) ;\ draw (50 ,0)parabola [ b<strong>en</strong>d at <strong>en</strong>d ]( 8 0 , 4 5 ) ;\ draw (100 ,0)parabola b<strong>en</strong>d(122.5 ,52.25) ( 1 3 0 , 4 5 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Continúa <strong>en</strong> la sigui<strong>en</strong>te página


6.10 Imág<strong>en</strong>es y figuras 219Tabla 6.32 Graficación <strong>de</strong> funciones comunes <strong>en</strong> TikZ Continúa <strong>de</strong> la página anterior\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −30)r e c t a n g l e ( 1 4 0 , 4 0 ) ;\ draw ( 0 , 0 ) s i n (20 ,20)s i n (60 , −20)cos (80 ,0)s i n ( 1 0 0 , 2 0 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Tabla 6.33Tanto el s<strong>en</strong>o como el cos<strong>en</strong>o únicam<strong>en</strong>te están <strong>de</strong>finidos para el intervalo(0, π 2), por lo que es necesario combinar ambas funciones para pintar latrayectoria completaOtro mecanismo también muy importante para graficar funciones es el <strong>de</strong> po<strong>de</strong>r darle unalista <strong>de</strong> puntos y que vaya marcándolos con algún símbolo. Para marcar los puntos con símbolosrequieres <strong>de</strong> 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 <strong>de</strong> marcas, pue<strong>de</strong>s elegir <strong>en</strong>tre las que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> latabla 6.33.Símbolos para marcar curvas que se graficanMarca I<strong>de</strong>ntificación Descripciónmark=−guionesmark=|barras verticalesmark=ocírculos huecosmark=asteriskasteriscosmark=starestrellasContinúa <strong>en</strong> la página sigui<strong>en</strong>te


220 L A TEXTabla 6.33 Símbolos para marcar curvas que se grafican Continúa <strong>de</strong> la página anteriorMarca I<strong>de</strong>ntificación Descripciónmark=opluscírculos con sumamark=oplus∗círculos con sumamark=otimescírculos con productomark=otimes∗círculos con productomark=squarecuadradomark=square∗cuadrado sólidomark=triangletriángulomark=triangle∗triángulo sólidomark=diamonddiamantemark=diamond∗diamante sólidomark=p<strong>en</strong>tagonp<strong>en</strong>tágonomark=p<strong>en</strong>tagon∗p<strong>en</strong>tágono sólidoPara graficar funciones usamos también el comando \draw con modificadores y parámetros.


6.10 Imág<strong>en</strong>es y figuras 221Figura 6.6Graficación <strong>de</strong> funciones arbitrarias\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −2) r e c t a n g l e (200 ,200);\ draw ( 0 , 0 ) −− p l o t [ mark=x , smooth ]coordinates{ %(30 ,5)(60 ,20)(90 ,45)(120 ,80)(150 ,125)(180 ,180)( 2 0 0 , 2 2 0 ) } ;\ draw [ red ] ( 0 , 0 ) p l o t [ mark=o , smooth ]coordinates { ( 3 0 , 1 )(60 ,8)(90 ,27)(120 ,64)(150 ,125)(166 ,220)} ;\ <strong>en</strong>d { t i k z p i c t u r e }Marcas un punto inicial y a continuación dices que quieres graficar una función (plot). Aesta última opción le aplicas modificadores, como el símbolo para las marcas, posiblem<strong>en</strong>te siquieres o no la curva suave (smooth) y el color <strong>de</strong> las marcas, que pue<strong>de</strong> no ser el mismo queel <strong>de</strong> la curva.Sin embargo, las gráficas que pintamos <strong>en</strong> la figura 6.6 son realm<strong>en</strong>te muy pobres. Quisiéramospo<strong>de</strong>r dibujar los ejes cartesianos y colocar indicaciones respecto a los valores <strong>en</strong> estosejes. T<strong>en</strong>emos dos formas <strong>de</strong> hacerlo.Usando el comando \draw con el argum<strong>en</strong>to grid, cuya sintaxis es:\draw grid [ ] ;La parte <strong>de</strong>l [< intervalo >] correspon<strong>de</strong> a que tan cerrada quieres la rejilla para lascoor<strong>de</strong>nadas. Sin embargo, con esta opción no t<strong>en</strong>emos todavía los ejes o las anotaciones<strong>en</strong> los mismos. Veamos cómo queda <strong>en</strong> la figura 6.7.Sin embargo, con esta opción <strong>de</strong>bemos poner los ejes y las marcas a pie. Los ejes no esningún problema pues lo hacemos simplem<strong>en</strong>te utilizando \draw, como se muestra <strong>en</strong> lafigura 6.8.La otra forma <strong>de</strong> pintar la retícula es “a pie” . Afortunadam<strong>en</strong>te, como el pintar las líneasse trata <strong>de</strong> una tarea repetitiva, pue<strong>de</strong>s usar la construcción \foreach que proporciona TikZ.Esta es una construcción muy po<strong>de</strong>rosa que funciona como sustitución <strong>de</strong> macros, por loque se pue<strong>de</strong> introducir <strong>en</strong> casi cualquier <strong>en</strong>unciado. Daremos el ejemplo <strong>en</strong> la figura 6.9y <strong>de</strong>spués analizaremos su formato.


222 L A TEXFigura 6.7Impresión <strong>de</strong> la retícula\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −2)r e c t a n g l e (200 ,250);\ draw [ dotted ] ( 0 , 0 )g r i d [ xstep =15 , ystep =12.5](210 ,225);\ draw ( 0 , 0 ). . .. . .\ <strong>en</strong>d { t i k z p i c t u r e }Figura 6.8Colocación <strong>de</strong> los ejes\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −2)r e c t a n g l e (200 ,220);\ draw [ dotted ] ( 0 , 0 )g r i d [ xstep =15 , ystep = 1 2 . 5 ) ](210 ,225);\ draw [ very t h i c k , −l a t e x ]( 0 , 0 ) −− ( 0 , 2 2 5 ) ; %eje y\ draw [ very t h i c k , −l a t e x ]( 0 , 0 ) −− ( 2 1 0 , 0 ) ; %eje x\ draw ( 0 , 0 )−− p l o t [ mark=x , smooth ]. . .. . .\ <strong>en</strong>d { t i k z p i c t u r e }


6.10 Imág<strong>en</strong>es y figuras 223El <strong>en</strong>unciado \foreach ti<strong>en</strong>e las sigui<strong>en</strong>tes partes:Las variables <strong>de</strong>l foreach que van separadas <strong>en</strong>tre sí por una diagonal y que consist<strong>en</strong><strong>de</strong> diagonal inversa y un i<strong>de</strong>ntificador. Se recomi<strong>en</strong>da que los i<strong>de</strong>ntificadores consistanúnicam<strong>en</strong>te <strong>de</strong> letras, porque a veces, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l contexto, al sustituirse pue<strong>de</strong>n darproblemas inesperados. En los dos ejemplos anteriores, la lista <strong>de</strong> variables consiste <strong>de</strong>una variable a las que llamamos \x y y <strong>en</strong> el primero y segundo for, respectivam<strong>en</strong>te.Una lista <strong>de</strong> valores que <strong>de</strong>b<strong>en</strong> tomar las variables. Cada elem<strong>en</strong>to <strong>de</strong> la lista consiste <strong>de</strong>un valor por cada variable <strong>en</strong>unciada, separados los elem<strong>en</strong>tos <strong>en</strong>tre sí por comas y losvalores <strong>de</strong> un mismo elem<strong>en</strong>to por diagonales. Esta lista va <strong>en</strong>tre llaves.Por último t<strong>en</strong>emos una lista <strong>de</strong> <strong>en</strong>unciados don<strong>de</strong> pue<strong>de</strong>n o no aparecer las variables <strong>de</strong>lfor.Figura 6.9Segunda forma <strong>de</strong> pintar la retícula\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (0 , −2)r e c t a n g l e (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 width =.3 pt , dotted ]( \ 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 width =.3 pt , dotted ]( 0 , \ y ) −− ( 2 1 0 , \ y ) ;}\ draw ( 0 , 0 ). . .. . .\ <strong>en</strong>d { t i k z p i c t u r e }Ambos ejemplos ti<strong>en</strong><strong>en</strong> una sola variable y las líneas que se pintan están a intervalos constantes.En g<strong>en</strong>eral, cuando se dan estas dos condiciones pue<strong>de</strong>s reemplazar a parte o toda la listapor una lista don<strong>de</strong> se infier<strong>en</strong> los puntos que faltan y que ti<strong>en</strong>e la sigui<strong>en</strong>te forma:〈primer valor〉 , 〈segundo valor〉 , . . . , 〈último valor〉


224 L A TEXLos dos \foreach que t<strong>en</strong>emos los podríamos haber escrito <strong>de</strong> las formas que se muestran <strong>en</strong> ellistado 6.1.Código 6.1Formas <strong>de</strong> hacer retículas\ foreach \ x i n {15 ,30 ,45 ,60 ,75 ,90 ,105 ,120 ,135 ,150 ,165 ,180 ,195 ,210} {\ draw [ l i n e width =.3 pt , dotted ] ( \ 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 width =.3 pt , dotted ] ( 0 , \ y ) −− ( 2 1 0 , \ y ) ;}\ foreach \ x i n { 1 5 , 3 0 , . . . , 2 1 0 } {\ draw [ l i n e width =.3 pt , dotted ] ( \ x , 0 ) −− ( \ x , 2 2 5 ) ;}\ foreach \ y i n { %1 2 . 5 , 2 5 , 3 7 . 5 , . . . , 2 2 5 } {\ draw [ l i n e width =.3 pt , dotted ] ( 0 , \ y ) −− ( 2 1 0 , \ y ) ;}Aunque apar<strong>en</strong>tem<strong>en</strong>te el colocar los números sobre los ejes parece s<strong>en</strong>cillo, no sabemoscómo colocar objetos cuando trabajamos con TikZ, y no se logra simplem<strong>en</strong>te con un \drawcuyo objetivo es pintar líneas. En la sigui<strong>en</strong>te sección resolveremos este problema. Antes <strong>de</strong>abandonar esta sección quisiéramos hacerte notar que hay otra forma <strong>de</strong> alim<strong>en</strong>tarle coor<strong>de</strong>nadasa \draw y que es mediante un archivo con las mismas, que pudo ser g<strong>en</strong>erado por una utilería<strong>de</strong> linux. Para el lector interesado le recom<strong>en</strong>damos que vea el manual <strong>de</strong> TikZ. Terminamosesta sección con un divertim<strong>en</strong>to <strong>en</strong> la figura 6.10 que usa únicam<strong>en</strong>te los conceptos que hemosdado hasta ahora.Figura 6.10Divertim<strong>en</strong>to con sólo trazo <strong>de</strong> líneas


6.10 Imág<strong>en</strong>es y figuras 225Los comandos <strong>de</strong> TikZ que logran el dibujo anterior se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el listado 6.2.Código 6.2 Dibujos arbitrarios (1/2)\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox (30 ,30) r e c t a n g l e (350 ,180);% 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 pt ) ;\ draw [ f i l l ] ( \ x , \ y ) c i r c l e (3 pt ) ;}% cejas\ foreach \ 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 ,3 10/120/325/85/20/0/40/0} {\ draw ( \ x , \ y ) . . c o n t r o l s + ( \ a:20 pt ) and + ( \ b :20 pt ) . .( \ xx , \ yy ) ;\ draw ( \ x , \ y ) . . c o n t r o l s + ( \ aa :30 pt ) and + ( \ bb :30 pt ) . .( \ xx , \ yy ) ;}% n a r i z\ foreach \ x / \ y i n { 0 / 7 5 , 9 0 / 0 } { %\ p g f p u t a t { \ pgfxy ( \ x , \ y )}{ %\ draw [ roun<strong>de</strong>d corners ] (75 ,80) −− (70 ,65) −− (65 ,60) −−(70 ,55) −− ( 8 0 , 5 5 ) ;\ foreach \ xx i n {70 ,74} { %\ draw [ f i l l ] ( \ xx , 6 0 ) c i r c l e (1 pt ) ;}% boca\ draw (40 ,45) . . c o n t r o l s +(320:20 pt ) and +(220:20 pt ) . .( 1 1 0 , 4 5 ) ;\ draw (40 ,45) . . c o n t r o l s +(320:30 pt ) and +(220:30 pt ) . .( 1 1 0 , 4 5 ) ;} %\p g f p u t a t} %foreach


226 L A TEXCódigo 6.2 Dibujos arbitrarios (2/2)% Tercera cara\ p g f p u t a t { \ pgfxy ( −40 ,50)}{ %\ draw [ roun<strong>de</strong>d corners ] (330 ,70) −− (310 ,65) −−(305 ,60) −− ( 3 1 0 , 5 0 ) ;\ foreach \ x / \ y i n {310/58 ,312/52}\ draw [ f i l l ] ( \ x , \ y ) c i r c l e (1 pt ) ;% boca\ draw (270 ,70) . . c o n t r o l s +(0:30 pt ) and +(80:30 pt ) . .( 3 1 0 , 0 ) ;\ draw (270 ,70) . . c o n t r o l s +(340:10 pt ) and +(70:10 pt ) . .( 3 0 9 , 0 ) ;} %p g f p u t a t\ <strong>en</strong>d { t i k z p i c t u r e }El único comando nuevo <strong>en</strong> el listado anterior es el <strong>de</strong> pgfputat que lo que hace es tomar lascoor<strong>de</strong>nadas <strong>de</strong>ntro <strong>de</strong> su alcance (<strong>en</strong>tre las llaves) relativas al primer parámetro (\pgfxy(x,y)).Actividad 6.51 Escribe los comandos necesarios <strong>en</strong> TikZ para dibujar lo sigui<strong>en</strong>te:♣♣♣♣♣6.10.6. Acomodando objetosEl po<strong>de</strong>r pintar una retícula <strong>de</strong> la superficie que usamos para dibujar suele ser útil no nadamás para graficar funciones, sino también para dibujar y colocar objetos. En g<strong>en</strong>eral, asociamosobjetos – que pue<strong>de</strong>n ser letreros, dibujos, puntos, etc. – a nodos. Un nodo ti<strong>en</strong>e las sigui<strong>en</strong>tescaracterísticas:Ocupa una cierta posición, dada por una pareja (x,y).Ti<strong>en</strong>e alguna forma que pue<strong>de</strong> ser circle , rectangle, diamond, ellipse .Pue<strong>de</strong> t<strong>en</strong>er un i<strong>de</strong>ntificador asociado.Pue<strong>de</strong> dibujarse o no su contorno con cualquier tipo <strong>de</strong> línea.Pue<strong>de</strong> rell<strong>en</strong>arse o no con distintos patrones y <strong>en</strong> colores diversos.El formato g<strong>en</strong>eral para colocar un nodo es el sigui<strong>en</strong>te:\ no<strong>de</strong> ( 〈etiqueta〉 ) [ 〈modificadores〉 ] at ( 〈posición〉 ) { 〈cont<strong>en</strong>ido〉 } ;


6.10 Imág<strong>en</strong>es y figuras 227Por ejemplo, pue<strong>de</strong>s marcar algunas posiciones <strong>en</strong> el espacio <strong>en</strong> el que graficas las funcionespara colocar allí una <strong>de</strong>scripción <strong>de</strong> las mismas.\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 ) r e c t a n g l e (200 ,220);% r e t ícula\ foreach \ x i n {15 ,30 ,45 ,60 ,75 ,90 ,. . . . . .% nodos\ no<strong>de</strong> ( x2 ) % e t i q u e t a[ i n n e r sep=0pt , outer sep=0 pt ]% modif .at (95 ,50) % dón<strong>de</strong>{ } ; % cont<strong>en</strong>ido\ no<strong>de</strong> ( l e t x 2 )[ rectangle , draw , f i l l =white ]at (40 ,100) { f(x) = x 2 } ;f(x) = x 3f(x) = x 2\ draw[− l a t e x ] ( l e t x 2 ) −− ( x2 ) ;% l ínea <strong>en</strong>tre dos nodos\ no<strong>de</strong> ( x3 )[ i n n e r sep=0pt , outer sep=0 pt ]at (161 ,175) { } ;\ no<strong>de</strong> ( l e t x 3 )[ red , rectangle , draw , f i l l =white ]at (80 ,200) { f(x) = x 3 } ;\ draw[− l a t e x , red ] ( l e t x 3 ) −− ( x3 ) ;\ <strong>en</strong>d { t i k z p i c t u r e }Pue<strong>de</strong>s p<strong>en</strong>sar <strong>en</strong> acomodar los nodos con un \foreach. Aunque <strong>en</strong> este caso sólo son <strong>en</strong>realidad dos objetos (tres líneas que se repit<strong>en</strong> – casi – dos veces), pue<strong>de</strong>s parametrizar <strong>de</strong> lasigui<strong>en</strong>te manera:. . . . . .e \ foreach \ e t i q/ %\ xe / \ ye / \ l e t r / \ x l / \ y l / \ cont / \ c l o ri n { x2 / 9 5 / 5 0 / l e t r x 2 / 4 0 /100/f(x) = x 2 / black ,x3 /161/175/ l e t x 3 /80/200/f(x) = x 3 / red } {\ no<strong>de</strong> ( \ e t i q) %[ i n n e r sep=0pt , outer sep=0 pt ]at ( \ xe , \ ye ) { } ;\ no<strong>de</strong> ( \ l e t r) %[ \ c l o r , diamond , draw , f i l l =white ]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) = x 2 f(x) = x 3


228 L A TEXExplicamos ahora algunos <strong>de</strong> los modificadores.La forma (shape) pue<strong>de</strong> ser cualquiera <strong>de</strong> las que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> la biblioteca shapes <strong>de</strong>TikZ, que se carga mediante el comando\ u s e t i k z l i b r a r y { shapes }colocado <strong>en</strong> el preámbulo <strong>de</strong>l docum<strong>en</strong>to. En este caso, <strong>en</strong> el ejemplo no parametrizadoutilizamos rectangle, mi<strong>en</strong>tras que <strong>en</strong> el parametrizado utilizamos diamond. La forma poromisión es rectangle.En algunos casos no <strong>de</strong>seas separación <strong>en</strong>tre la posición <strong>de</strong>l nodo y su exterior. Esta separaciónse da por omisión alre<strong>de</strong>dor <strong>de</strong>l texto cont<strong>en</strong>ido <strong>en</strong> el nodo, aun cuando no hayatexto. Por eso ti<strong>en</strong>es que aclarar que la separación <strong>en</strong>tre el texto y el bor<strong>de</strong> (inner sep) yla separación <strong>en</strong>tre el bor<strong>de</strong> y el <strong>en</strong>torno (outer sep) es <strong>de</strong> cero puntos. Este modificadorlo utilizamos para marcar que quieres colocarte exactam<strong>en</strong>te sobre la línea <strong>de</strong> la función.Hay otra manera <strong>de</strong> hacer esto, que veremos un poco más a<strong>de</strong>lante.La opción <strong>de</strong> dibujar o no contorno está dada por draw, que indica que sí se haga. Laopción por omisión es no pintar contorno.Ya vimos la opción <strong>de</strong> rell<strong>en</strong>ar el nodo ( fill ). Para darle un color al rell<strong>en</strong>o y un patrón sehace exactam<strong>en</strong>te igual que con el comando \draw. El valor por omisión es transpar<strong>en</strong>te,por lo que <strong>de</strong>ja ver lo que sea que se haya pintado “abajo”; para que no se viera la retículaabajo <strong>de</strong> nuestras etiquetas es que rell<strong>en</strong>amos <strong>de</strong> blanco.Por último, el cont<strong>en</strong>ido <strong>de</strong> un nodo pue<strong>de</strong> ser cualquier cosa, <strong>en</strong>tre otros, un arreglo, undibujo, otra retícula, ecuaciones (como lo hicimos nosotros). Ésta es una <strong>de</strong> las característicasprincipales por las que nos gusta usar TikZ: te permite trasplantar el po<strong>de</strong>río y lo fino<strong>de</strong> LATEX a cualquier dibujo o gráfica.Para colocar los números a lo largo <strong>de</strong> los ejes haremos uso <strong>de</strong> la construcción \foreach y<strong>de</strong>l <strong>en</strong>unciado \no<strong>de</strong>.\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]\ useasboundingbox ( 0 , 0 )r e c t a n g l e (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} {\ no<strong>de</strong> at ( \ x , − 5 ) { \ t i n y \ e t i q } ;}\ foreach \ y i n { %2 5 , 5 0 , . . . , 2 0 0 } {\ no<strong>de</strong> [ l e f t ] at ( 0 , \ y ) { \ t i n y \ y } ;} . . . . . .\ <strong>en</strong>d { t i k z p i c t u r e }200175150125100755025f(x) = x 2 f(x) = x 31 2 3 4 5 6 7


6.10 Imág<strong>en</strong>es y figuras 229Al acomodar los números <strong>en</strong> el eje x ti<strong>en</strong>es que utilizar posición y etiqueta, pues éstas nocoinci<strong>de</strong>n. En el eje <strong>de</strong> las y, <strong>en</strong> cambio, como coinci<strong>de</strong>n la posición y la etiqueta, pue<strong>de</strong>s utilizarla misma variable para ambas.Al colocar las etiquetas <strong>en</strong> el eje <strong>de</strong> las y utilizamos un nuevo modificador <strong>en</strong> el nodo – notaque no utilizamos nombre para el nodo pues no es necesario – que acomoda al cont<strong>en</strong>ido <strong>de</strong>lnodo respecto a la posición <strong>de</strong>l mismo. En este caso <strong>de</strong>seamos que los números se aline<strong>en</strong> a la<strong>de</strong>recha, por lo que indicamos que el cont<strong>en</strong>ido se exti<strong>en</strong>da hacia la izquierda (left). T<strong>en</strong>emoslas sigui<strong>en</strong>tes posibilida<strong>de</strong>s para este modificador:aboveabove leftabove rightleftrightbelowbelow leftbelow rightanchor=northanchor=north westanchor=north eastanchor=westanchor=eastanchor=southanchor=south westanchor=south eastEn los modificadores a la izquierda <strong>en</strong> la tabla pue<strong>de</strong>s agregar un <strong>de</strong>splazami<strong>en</strong>to, usandopor ejemplo left =2pt.También pue<strong>de</strong>s usar el \foreach para repetir figuras. Por ejemplo, si <strong>de</strong>seas dibujar unagráfica, pue<strong>de</strong>s colocar nodos y <strong>de</strong>spués unirlos con líneas, como se pue<strong>de</strong> apreciar <strong>en</strong> la figura6.11 que se hizo con el código <strong>de</strong>l listado 6.3.Figura 6.11Dibujo <strong>de</strong> una gráfica <strong>en</strong> LATEXc0d010a01b


230 L A TEXCódigo 6.3Dibujo <strong>de</strong> una gráfica\ begin { t i k z p i c t u r e } [ x=1pt , y=1 pt ]% Colocación <strong>de</strong> l o s nodos\ foreach \ 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} {\ no<strong>de</strong> [ c i r c l e , draw ] ( \ name) at ( \ x , \ y ) { \ e t i q } ;}% d i b u j o <strong>de</strong> l o s arcos r e c t o s\ foreach \ 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 60] ( \ f f r ) −− no<strong>de</strong> [ \ pos ] { \ e t i q } ( \ t t o ) ;}% d i b u j o <strong>de</strong> l o s arcos curveados\ foreach \ f f r / \ t t o / \ e t i q / \ pos / \ sale / \ <strong>en</strong>tra i n {b / a / 1 / above /270/270 ,d / b / 0 / r i g h t / 0 / 0 } {\ draw[− angle 60] ( \ f f r ) . . c o n t r o l s + ( \ sale :40 pt )and + ( \ <strong>en</strong>tra :40 pt ) . . no<strong>de</strong> [ \ pos ] { \ e t i q } ( \ t t o ) ;}\ <strong>en</strong>d { t i k z p i c t u r e }De <strong>en</strong>tre lo que no revisamos antes está el signo <strong>de</strong> + al fr<strong>en</strong>te <strong>de</strong> las coor<strong>de</strong>nadas <strong>de</strong>controls. Esto se refiere a que el ángulo, que correspon<strong>de</strong> a la primera coor<strong>de</strong>nada, sea tomado<strong>en</strong> relación al c<strong>en</strong>tro <strong>de</strong>l nodo al que se refiere; la segunda coor<strong>de</strong>nada indica la distancia<strong>de</strong>l c<strong>en</strong>tro <strong>de</strong>l nodo a la parte más alta <strong>de</strong> la curva (un bezier). También es nueva la colocación<strong>de</strong> etiquetas, que se hace también colocando un nodo sobre la trayectoria, antes <strong>de</strong>l <strong>de</strong>stino <strong>de</strong>la línea.Este tipo <strong>de</strong> dibujos pue<strong>de</strong>n alcanzar muchísima complejidad <strong>en</strong> TikZ, por lo que no seguimoscon el tema. Recom<strong>en</strong>damos nuevam<strong>en</strong>te al lector interesado que consulte el manual <strong>de</strong>TikZ.Actividad 6.52 Codifica los dibujos <strong>de</strong> la figura 6.12 <strong>en</strong> LATEX.Actividad 6.53 Haz el código necesario para dibujar una cara similar a la que se usó <strong>en</strong> estasección.Con esto damos por terminada la parte <strong>de</strong> dibujar con LATEX. Sobre todo <strong>en</strong> el paquete TikZhay una casi infinidad <strong>de</strong> posibilida<strong>de</strong>s. Nos faltó, por ejemplo, cómo dibujar árboles o gráficas<strong>de</strong> manera más directa, pero se supone que este material lo que <strong>de</strong>be hacer es abrirles el apetitoy no emparcharlos, así que por lo pronto acá <strong>de</strong>jamos este tema.


6.11 Refer<strong>en</strong>cias e índices 231Figura 6.12 Actividad 6.52β γ δTúYoEllos6.11. Refer<strong>en</strong>cias e índicesUn docum<strong>en</strong>to ci<strong>en</strong>tífico o, <strong>en</strong> g<strong>en</strong>eral, un docum<strong>en</strong>to profesional como un artículo, un libro,un reporte, requiere, a<strong>de</strong>más <strong>de</strong>l cont<strong>en</strong>ido, una serie <strong>de</strong> elem<strong>en</strong>tos estéticos y <strong>de</strong> ayudamuy importantes para el lector <strong>de</strong> la obra. Estos elem<strong>en</strong>tos incluy<strong>en</strong>: tipos <strong>de</strong> letras, sus tamaños,la numeración <strong>de</strong> los capítulos, secciones, fórmulas, cuadros o tablas, así como una serie<strong>de</strong> elem<strong>en</strong>tos (opcionales) como tablas <strong>de</strong> cont<strong>en</strong>ido, <strong>de</strong> figuras, índices. Al conjunto <strong>de</strong> estoselem<strong>en</strong>tos se les conoce como tipografía.La tipografía <strong>de</strong> una obra, <strong>en</strong> g<strong>en</strong>eral, la fija y ati<strong>en</strong><strong>de</strong> el editor, sobre todo <strong>en</strong> cuanto acuestiones estéticas. Los índices y la bibliografía o refer<strong>en</strong>cias son, necesariam<strong>en</strong>te, provistaspor el autor. En muchos <strong>de</strong> los casos, t<strong>en</strong>drás que actuar como ambos: autor y editor <strong>de</strong> tustrabajos.LATEX es i<strong>de</strong>al para ayudarte <strong>en</strong> la <strong>de</strong>finición <strong>de</strong> la tipografía, incluy<strong>en</strong>do los elem<strong>en</strong>tosopcionales. En este capítulo hemos revisado ya prácticam<strong>en</strong>te todo lo que necesitas para realizardocum<strong>en</strong>tos complejos, por lo que nos resta aclarar cómo realizar algunos <strong>de</strong> los elem<strong>en</strong>tosopcionales que m<strong>en</strong>cionamos <strong>en</strong> el párrafo anterior.6.11.1. Refer<strong>en</strong>cias bibliográficasComo ya discutimos, la pres<strong>en</strong>cia <strong>de</strong> refer<strong>en</strong>cias bibliográficas <strong>en</strong> tus trabajos te permiteincursionar <strong>en</strong> más temas que consi<strong>de</strong>res interesantes. Esto significa que las refer<strong>en</strong>cias <strong>de</strong>b<strong>en</strong>


232 L A TEXser precisas y dirigir al lector <strong>de</strong> tu obra con el m<strong>en</strong>or esfuerzo posible.Hay varias formas <strong>de</strong> darle formato a las bibliografías; <strong>de</strong> hecho, <strong>en</strong> la mayoría <strong>de</strong> los casoste <strong>en</strong>contrarás sigui<strong>en</strong>do las reglas que para tal efecto dicte la editorial. Por tanto, una <strong>de</strong> lastareas más importantes cuando <strong>en</strong>vías un libro, artículo o cualquier otro trabajo escrito para supublicación, es g<strong>en</strong>erar la lista <strong>de</strong> refer<strong>en</strong>cias bibliográficas sigui<strong>en</strong>do dichas reglas.En la prehistoria <strong>de</strong> la computadoraBIBT E XEn la pre-historia <strong>de</strong> las computadoras, es <strong>de</strong>cir hace una veint<strong>en</strong>a <strong>de</strong> años, t<strong>en</strong>íamos quecomponer a mano la lista <strong>de</strong> bibliografías. Por ejemplo, t<strong>en</strong>íamos que teclear esto:\ begin { t h e b i b l i o g r a p h y } { alguna−<strong>en</strong>trada }\ bibitem [ 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 <strong>en</strong>trada b i b l i o g r á f i c a\ bibitem [ 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 <strong>en</strong>trada b i b l i o g r á f i c a. . .\ <strong>en</strong>d { t h e b i b l i o g r a p h y }Para citar esas refer<strong>en</strong>cias usamos el comando \ cite y usamos la llave apropiada, por ejemplo,\ cite {llave1}.Algunos <strong>de</strong> los problemas con esta forma tradicional <strong>de</strong> ingresar bibliografía <strong>en</strong> nuestrostrabajos son:1. Es muy difícil mant<strong>en</strong>er la consist<strong>en</strong>cia <strong>en</strong> las citas, particularm<strong>en</strong>te <strong>en</strong> un docum<strong>en</strong>tocon contribuciones <strong>de</strong> varios autores. Entre las dificulta<strong>de</strong>s más comunes, <strong>en</strong>contramos,ewntre otros, variaciones <strong>en</strong> el uso <strong>de</strong> abreviaturas o nombres completos, el uso <strong>de</strong> itálicaso comillas para los títulos.2. Si ya ti<strong>en</strong>es una lista bibliográfica or<strong>de</strong>nada <strong>de</strong> acuerdo a cierto estilo, por ejemplo alfabéticopor autor y año, es extremadam<strong>en</strong>te difícil <strong>de</strong> convertir a otro estilo, por ejemplousando números <strong>de</strong> acuerdo al or<strong>de</strong>n <strong>de</strong> cita.3. Es virtualm<strong>en</strong>te imposible mant<strong>en</strong>er una gran base <strong>de</strong> refer<strong>en</strong>cias bibliográficas que puedaser reutilizada <strong>en</strong> distintos docum<strong>en</strong>tos.A continuación <strong>de</strong>scribiremos una posible forma <strong>de</strong> resolver el problema <strong>de</strong> las listas <strong>de</strong>bibliografías. Está basado <strong>en</strong> LATEX y su programa hermano BIBT E X. Es importante hacer notarque BIBT E X ha estado <strong>en</strong> circulación por muchos años y, por lo tanto, exist<strong>en</strong> muchos estilosque hoy podríamos llamar estándar y que están a nuestra disposición, por lo que es muy fácil<strong>en</strong>contrar el estilo a<strong>de</strong>cuado para tu trabajo.La estructura básica <strong>de</strong> una <strong>en</strong>trada BIBT E X ti<strong>en</strong>es tres partes básicas:(a) El tipo <strong>de</strong> la <strong>en</strong>trada (book, article, inproceedings y otros). Nótese que el tipo siempre va<strong>en</strong> inglés.(b) Una llave elegida por el usuario que i<strong>de</strong>ntifica la publicación. Esta llave es la que <strong>de</strong>beusarse como parámetro para el comando \ cite.


6.11 Refer<strong>en</strong>cias e índices 233(c) Una serie <strong>de</strong> campos separados <strong>en</strong>tre sí por comas, don<strong>de</strong> cada campo consiste <strong>de</strong> uni<strong>de</strong>ntificador <strong>de</strong> campo y sus datos <strong>en</strong>tre comillas o llaves, por ejemplo:author =" 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 } ,Exist<strong>en</strong> varios esquemas para asociar conv<strong>en</strong>i<strong>en</strong>tem<strong>en</strong>te las llaves con sus respectivas <strong>en</strong>tradas<strong>en</strong> la base. Un esquema popular es el conocido como Harvard, don<strong>de</strong> tomamos el apellido<strong>de</strong>l autor (<strong>en</strong> minúsculas) y el año <strong>de</strong> la publicación y los combinamos para crear la llave usandodos puntos. Por ejemplo, smith:1987. BIBT E X lee las <strong>en</strong>tradas <strong>de</strong>l archivo <strong>de</strong> bibliografías, conext<strong>en</strong>sión .bib, y al formato que se le dará a las <strong>en</strong>tradas lo controla un archivo <strong>de</strong> estilo, conext<strong>en</strong>sión .bst. Por razones <strong>de</strong> espacio, no discutiremos <strong>en</strong> este trabajo los comandos que pue<strong>de</strong>nusarse <strong>en</strong> los archivos <strong>de</strong> estilo, a<strong>de</strong>más <strong>de</strong> que, como ya hemos m<strong>en</strong>cionado, hay muchosestilos ya <strong>de</strong>finidos por personas o por organizaciones, por ejemplo por la Sociedad MatemáticaAmericana (AMS, por sus siglas <strong>en</strong> inglés), por la Association for Computing Machinery(ACM), revistas <strong>de</strong> prestigio, casas editoriales. A continuación <strong>de</strong>scribimos algunos estilos muyusados y que no están asociados a ninguna asociación o casa editorial. Es importante notar qu<strong>en</strong>o necesitas obt<strong>en</strong>er una copia <strong>de</strong> los archivos <strong>de</strong> estilo (.bst) <strong>de</strong> los que usamos aquí comoejemplos, ya que se incluy<strong>en</strong> con todas las distribuciones <strong>de</strong> LATEX.plain El estilo estándar <strong>de</strong> BIBT E X. Las <strong>en</strong>tradas son or<strong>de</strong>nadas alfabéticam<strong>en</strong>te con etiquetasnuméricas.unsrt Similar al anterior, pero las <strong>en</strong>tradas son impresas <strong>en</strong> el or<strong>de</strong>n <strong>en</strong> que fueron citadas <strong>en</strong>el docum<strong>en</strong>to. Utiliza etiquetas numéricas.alpha Similar a plain, pero las etiquetas <strong>de</strong> las <strong>en</strong>tradas son formadas a partir <strong>de</strong>l nombre <strong>de</strong>lautor y <strong>de</strong>l año <strong>de</strong> publicación.abbrv Similar a plain, pero las <strong>en</strong>tradas son más compactas, dado que los nombres <strong>de</strong> pila, losmeses y los nombres <strong>de</strong> las revistas son abreviados.acm Usado para las publicaciones <strong>de</strong> la Association for Computing Machinery. Ti<strong>en</strong>e el nombre<strong>de</strong>l autor (apellido y luego nombre) <strong>en</strong> mayúsculas pequeñas y usa números comoetiquetas.Ahora te vamos a mostrar el efecto <strong>de</strong> usar BIBT E X <strong>en</strong> un docum<strong>en</strong>to y luego te mostraremosqué fácil es cambiar el estilo y los dramáticos cambios que g<strong>en</strong>eran estos cambios <strong>en</strong> la salida.Nuestros archivos fu<strong>en</strong>te serán: ejemplo.tex, nuestro docum<strong>en</strong>to LATEX y bejemplo.bib,nuestra base <strong>de</strong> datos <strong>de</strong> bibliografías. En las figuras 6.13 y 6.15 pue<strong>de</strong>s ver estos docum<strong>en</strong>tos.Figura 6.13 Ejemplo <strong>de</strong> LATEX usando BIBT E X (1/2)\ docum<strong>en</strong>tclass { a r t i c l e }\ usepackage [ l a t i n 1 ] { input<strong>en</strong>c }\ pagestyle { empty }\ begin { docum<strong>en</strong>t }\ s e c t i o n { Ejemplo <strong>de</strong> c i t a s }


234 L A TEXFigura 6.13 Ejemplo <strong>de</strong> LATEX usando BIBT E X (2/2)Iniciamos con l a c i t a <strong>de</strong> 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 } .También quieres c i t a r un a r t ículo e s c r i t o por un únicoautor ~\ c i t e { boehm88 } y luego o t r o don<strong>de</strong> hay más <strong>de</strong> unautor ~\ c i t e { boehm89 : _theor_w } . También quieres i n t e n t a r , porsupuesto , hacer una c i t a a unos proceedings <strong>de</strong> unaconfer<strong>en</strong>cia ~\ c i t e { 0 1 : _progr_web_high_level_languag } y para t e rminarvamos a hacer una c i t a mú l t i p l e , don<strong>de</strong> l a primer <strong>en</strong>trada es a una r t ículo publicado <strong>en</strong> e l Web~\ c i t e { wadler−how , boehm89 : _theor_w } .\ b i b l i o g r a p h y s t y l e { p l a i n }\ b i b l i o g r a p h y { bejemplo }\ <strong>en</strong>d { docum<strong>en</strong>t }Lo primero que <strong>de</strong>bes <strong>en</strong>t<strong>en</strong><strong>de</strong>r es cómo funcionan LATEX y BIBT E X juntos: primero corresel comando latex con el archivo fu<strong>en</strong>te como argum<strong>en</strong>to (figura 6.14); <strong>de</strong>spués corres elcomando bibtex con el mismo argum<strong>en</strong>to y luego <strong>de</strong>berás ejecutar latex dos veces paraque LATEX pueda resolver todas las refer<strong>en</strong>cias. El resultado, pue<strong>de</strong>s apreciarlo <strong>en</strong> la figura 6.16,don<strong>de</strong> lo hemos puesto usando tanto el estilo plain como el estilo acm.Figura 6.14Salida <strong>de</strong> LATEX al ejecutarlo por primera vez sobre el archivo usando BIBT E X% l a t e x ejemploThis i s TeX , Version 3.14159 (Web2C 7 . 4 . 5 )LaTeX Warning : C i t a t i o n ‘ nonaka95 : _knowl_creat_compan ’ on page 1un<strong>de</strong>fined 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 un<strong>de</strong>finedon i n p u t l i n e 7.LaTeX Warning : C i t a t i o n ‘ boehm88 ’ on page 1 un<strong>de</strong>fined on i n p u tl i n e 10.LaTeX Warning : C i t a t i o n ‘ boehm89 : _theor_w ’ on page 1 un<strong>de</strong>finedon i n p u t l i n e 11.LaTeX Warning : C i t a t i o n ‘ 0 1 : _progr_web_high_level_languag ’ onpage 1 un<strong>de</strong>fined on i n p u t l i n e 13.LaTeX Warning : C i t a t i o n ‘ wadler−how ’ on page 1 un<strong>de</strong>fined oni 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 un<strong>de</strong>finedon i n p u t l i n e 15.No f i l e ejemplo . bbl .


6.11 Refer<strong>en</strong>cias e índices 235Figura 6.15Ejemplo <strong>de</strong> una base <strong>de</strong> datos BIBT E X@Book{ nonaka95 : _knowl_creat_compan ,author = { Nonaka , I . and Takeuchi , H. } ,t i t l e = { The Knowledge−Creating Company } ,p u b l i s h e r = { Oxford Univ Press } ,year = 1995 ,address = {New York } }@PhdThesis { van96 : _impac_kbs ,author = { Van Weg<strong>en</strong>, B} ,t i t l e = { Impacts of KBS on cost and s t r u c t u r e ofprouduction processes } ,school = { U n i v e r s e i t van Amsterdan } ,year = 1996}@Article { boehm88 ,author = {Boehm, B . } ,t i t l e = {A s p i r a l mo<strong>de</strong>l of software <strong>de</strong>velopm<strong>en</strong>t an<strong>de</strong>nhancem<strong>en</strong>t } ,j o u r n a l = { IEEE Computers } ,year = 1988 ,pages = {61 −62}}@Article { boehm89 : _theor_w ,author = {Boehm, B . and Ross , R. } ,t i t l e = { Theory−W software p r o j e c t managem<strong>en</strong>t : p r i n c i p l e sand examples } ,j o u r n a l = { IEEE Trans . Softw . Eng . } ,year = 1989 ,volume = 15 ,number = 7 ,pages = {902 −916}}@Proceedings { 0 1 : _progr_web_high_level_languag ,t i t l e = { Programming the Web w ith High−Level Languages } ,year = 2001 ,volume = 2028 ,s e r i e s = { Lecture Notes i n Computer Sci<strong>en</strong>ce } ,month = { A p r i l } ,o r g a n i z a t i o n = {10 th European Symposium on Programming ,ESOP 2001} ,p u b l i s h e r = { Springer Verlag } }@misc{ wadler−how ,author = " P h i l i p Wadler " ,t i t l e = {How to Add Laziness to a S t r i c t Language WithoutEv<strong>en</strong> Being Odd } ,u r l = " c i t e s e e r . n j . nec . com/102172. html " }


236 L A TEXFigura 6.16Ejemplo usando los estilos BIBT E X: acm (arriba) y plain (abajo)1 Ejemplo <strong>de</strong> citasIniciamos con la cita <strong>de</strong> un libro [4] y una tesis doctoral a continuación [5].También queremos citar un artículo escrito por un único autor [2] y luegootro don<strong>de</strong> hay más <strong>de</strong> un autor [3]. También queremos int<strong>en</strong>tar, por supuesto,hacer una cita a unos proceedings <strong>de</strong> una confer<strong>en</strong>cia [1] y para terminar vamosa hacer una cita múltiple, don<strong>de</strong> la primer <strong>en</strong>trada es a un artículo publicado<strong>en</strong> el Web [6, 3].Refer<strong>en</strong>ces[1] 10th European Symposium on Programming, ESOP 2001. Programming theWeb with High-Level Languages, volume 2028 of Lecture Notes in ComputerSci<strong>en</strong>ce. Springer Verlag, April 2001.[2] B. Boehm. A spiral mo<strong>de</strong>l of software <strong>de</strong>velopm<strong>en</strong>t and <strong>en</strong>hancem<strong>en</strong>t. IEEEComputers, pages 61–62, 1988.[3] B. Boehm and R. Ross. Theory-w software project managem<strong>en</strong>t: principlesand examples. IEEE Trans. Softw. Eng., 15(7):902–916, 1989.[4] I. Nonaka and H. Takeuchi. The Knowledge-Creating Company. OxfordUniv Press, New York, 1995.[5] B Van Weg<strong>en</strong>. 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 ev<strong>en</strong> beingodd.1 Ejemplo <strong>de</strong> citasIniciamos con la cita <strong>de</strong> un libro [4] y una tesis doctoral a continuación [5].También queremos citar un artículo escrito por un único autor [2] y luegootro don<strong>de</strong> hay más <strong>de</strong> un autor [3]. También queremos int<strong>en</strong>tar, por supuesto,hacer una cita a unos proceedings <strong>de</strong> una confer<strong>en</strong>cia [1] y para terminar vamosa hacer una cita múltiple, don<strong>de</strong> la primer <strong>en</strong>trada es a un artículo publicado<strong>en</strong> el Web [6, 3].Refer<strong>en</strong>ces[1] 10th European Symposium on Programming, ESOP 2001. Programmingthe Web with High-Level Languages (April 2001), vol. 2028 of LectureNotes in Computer Sci<strong>en</strong>ce, Springer Verlag.[2] Boehm, B. A spiral mo<strong>de</strong>l of software <strong>de</strong>velopm<strong>en</strong>t and <strong>en</strong>hancem<strong>en</strong>t. IEEEComputers (1988), 61–62.[3] Boehm, B., and Ross, R. Theory-w software project managem<strong>en</strong>t: principlesand examples. IEEE Trans. Softw. Eng. 15, 7 (1989), 902–916.[4] Nonaka, I., and Takeuchi, H. The Knowledge-Creating Company. OxfordUniv Press, New York, 1995.[5] Van Weg<strong>en</strong>, B. Impacts of KBS on cost and structure of prouductionprocesses. PhD thesis, Universeit van Amsterdan, 1996.[6] Wadler, P. How to add laziness to a strict language without ev<strong>en</strong> beingodd.


6.12 Emacs 2376.11.2. ÍndicesPara <strong>en</strong>contrar un tema <strong>de</strong> interés <strong>en</strong> un docum<strong>en</strong>to gran<strong>de</strong>, el lector ti<strong>en</strong>e dos alternativas,usar la tabla <strong>de</strong> cont<strong>en</strong>idos o el índice. En g<strong>en</strong>eral, el índice es la forma <strong>de</strong> acceso más común aun docum<strong>en</strong>to técnico y, por tanto, una parte es<strong>en</strong>cial <strong>de</strong>l docum<strong>en</strong>to.Al igual que las refer<strong>en</strong>cias bibliográficas, para g<strong>en</strong>erar un índice requerimos <strong>de</strong> la combinación<strong>de</strong> LATEX y otro programa externo llamado MakeIn<strong>de</strong>x. En tu docum<strong>en</strong>to LATEX <strong>de</strong>besusar el comando \in<strong>de</strong>x para indicar una nueva <strong>en</strong>trada <strong>en</strong> el índice <strong>de</strong>l docum<strong>en</strong>to. Cuando ejecuteslatex <strong>en</strong> tu docum<strong>en</strong>to, se crea un nuevo archivo con ext<strong>en</strong>sión .idx <strong>en</strong> el que aparec<strong>en</strong> las<strong>en</strong>tradas seleccionadas por \in<strong>de</strong>x y las páginas <strong>en</strong> que éstas aparec<strong>en</strong>. Después <strong>de</strong> esto, cuandoejecutes el comando makein<strong>de</strong>x, al igual que como sucedía con bibtex, leerá un archivo <strong>de</strong> estilo(con ext<strong>en</strong>sión .ist) y creará el archivo con ext<strong>en</strong>sión .ind que ti<strong>en</strong>e la versión con formato<strong>de</strong>l índice <strong>de</strong> tu docum<strong>en</strong>to.Crear un bu<strong>en</strong> índice no es una tarea s<strong>en</strong>cilla y discutir el tema escapa <strong>de</strong> los alcances <strong>de</strong>este docum<strong>en</strong>to. Sin embargo, te po<strong>de</strong>mos recom<strong>en</strong>dar crear el índice conforme avances <strong>en</strong> el<strong>de</strong>sarrollo <strong>de</strong> tu docum<strong>en</strong>to. Debes tomar <strong>en</strong> cu<strong>en</strong>ta a quién va dirigido el docum<strong>en</strong>to, qué esimportante y organizar el índice <strong>de</strong> manera tal que el lector pueda <strong>en</strong>contrar fácilm<strong>en</strong>te lo quebusca.El comando \in<strong>de</strong>x soporta hasta tres niveles <strong>de</strong> <strong>en</strong>tradas <strong>en</strong> el índice. Para acce<strong>de</strong>r a los suby subsub niveles, el argum<strong>en</strong>to <strong>de</strong> \in<strong>de</strong>x <strong>de</strong>be cont<strong>en</strong>er la <strong>en</strong>trada principal y las sub-<strong>en</strong>tradasseparadas por el carácter !. Por ejemplo:Página 3: \in<strong>de</strong>x{funciones ! par&\’a&metros ! paso <strong>de</strong>}Página 4: \in<strong>de</strong>x{funciones ! recursivas}Página 5: \in<strong>de</strong>x{cerradura ! funcional}Página 6: \in<strong>de</strong>x{cerradura ! con ambi<strong>en</strong>tes}Página 10: \in<strong>de</strong>x{paradigma}Página 11: \in<strong>de</strong>x{paradigma ! tipos <strong>de</strong>}6.12. EmacsComo ya sabes, editar un archivo LATEX es simplem<strong>en</strong>te editar un archivo <strong>de</strong> texto concomandos especiales que interpreta el comando latex o pdflatex. En este s<strong>en</strong>tido, con lo revisado<strong>de</strong> Emacs <strong>en</strong> la sección 4.3, pue<strong>de</strong>s editar cómodam<strong>en</strong>te tus docum<strong>en</strong>tos LATEX.Sin embargo y como una muestra más <strong>de</strong> la versatilidad y po<strong>de</strong>río <strong>de</strong> Emacs, te mostraremosalgunos paquetes que exti<strong>en</strong><strong>de</strong>n Emacs y lo conviert<strong>en</strong> <strong>en</strong> un po<strong>de</strong>roso editor especializado paraLATEX.


238 L A TEX6.12.1. AUCT E XAUCTEX es un ambi<strong>en</strong>te integrado para editar archivos LATEX y TEX e incluye una grancantidad <strong>de</strong> herrami<strong>en</strong>tas que iremos revisando a lo largo <strong>de</strong> esta sección.Una pregunta que es sano hacernos es ¿qué pue<strong>de</strong> hacer AUCTEX que no podamos hacersólo con la ayuda <strong>de</strong> Emacs? Varias cosas: te permite ejecutar TEX/LATEX y <strong>de</strong>más comandosy herrami<strong>en</strong>tas relacionados con el proceso <strong>de</strong> docum<strong>en</strong>tos, como visores <strong>de</strong> DVI, Postscripto PDF. En particular, la habilidad <strong>de</strong> ejecutar LATEX <strong>de</strong>s<strong>de</strong> AUCTEX es interesante porque tepermite navegar los errores y te ofrece docum<strong>en</strong>tación sobre cada tipo <strong>de</strong> error.AUCTEX también nos ayuda a in<strong>de</strong>ntar nuestro código fu<strong>en</strong>te y ti<strong>en</strong>e un par <strong>de</strong> herrami<strong>en</strong>taspara ver una vista preliminar, un esquema <strong>de</strong> tu docum<strong>en</strong>to. A<strong>de</strong>más, al estar íntimam<strong>en</strong>terelacionado con Emacs, AUCTEX ofrece una gran cantidad <strong>de</strong> macros y funciones auxiliaresque te permit<strong>en</strong> insertar comandos y editar tus docum<strong>en</strong>tos rápida y fácilm<strong>en</strong>te.Instalando AUCT E X$ smart AUCTEX es un programa escrito <strong>en</strong> Emacs-Lisp y es parte estándar <strong>de</strong> varias distribucionesinstall mayores <strong>de</strong> Emacs, incluy<strong>en</strong>do XEmacs. Desgraciadam<strong>en</strong>te AUCTEX no vi<strong>en</strong>e con Emacs poremacs-auctex omisión; sin embargo exist<strong>en</strong> paquetes pre-compilados para la mayoría <strong>de</strong> las distribuciones <strong>de</strong><strong>Linux</strong>.En caso <strong>de</strong> que no <strong>en</strong>cu<strong>en</strong>tres paquetes para tu distribución <strong>de</strong> <strong>Linux</strong>, no hay nada <strong>de</strong> quépreocuparse, pues ya sabes lo fácil que es instalar paquetes <strong>en</strong> Emacs (ver la sección 4.3.18).En la sigui<strong>en</strong>te dirección pue<strong>de</strong>s obt<strong>en</strong>er la versión más reci<strong>en</strong>te <strong>de</strong> AUCTEX:http://www.gnu.org/software/auctex/.Para indicarle a Emacs que vas a utilizar AUCTEX, <strong>de</strong>bes poner lo sigui<strong>en</strong>te <strong>en</strong> tu ∼/.emacs:( r e q u i r e ’ tex−s i t e )( r e q u i r e ’ tex )( r e q u i r e ’ l a t e x )Sangrías y formatoAUCTEX pue<strong>de</strong> in<strong>de</strong>ntar tu código automáticam<strong>en</strong>te conforme lo escribes. Si presionas C-j<strong>en</strong> lugar <strong>de</strong> Enter funcionará exactam<strong>en</strong>te igual. Si presionas tab la línea actual es in<strong>de</strong>ntaday el cursor permanece don<strong>de</strong> está. Incluso el comando format-paragraph <strong>de</strong> Emacs, M–q , esre-implem<strong>en</strong>tado por AUCTEX para que haga lo correcto con tu docum<strong>en</strong>to LATEX. Finalm<strong>en</strong>te,la función LaTeX-fill-buffer (que pue<strong>de</strong>s ejecutar con M–x ) in<strong>de</strong>nta todo tu docum<strong>en</strong>to, locuál es particularm<strong>en</strong>te útil cuando algui<strong>en</strong> te mandó un docum<strong>en</strong>to sin formato.En LATEX es común t<strong>en</strong>er docum<strong>en</strong>tos que ocup<strong>en</strong> más <strong>de</strong> un archivo; por ejemplo, paralibros y tesis es común utilizar un archivo por cada capítulo o sección. AUCTEX es capaz <strong>de</strong><strong>en</strong>t<strong>en</strong><strong>de</strong>r docum<strong>en</strong>tos que ocupan varios archivos y ayudarte <strong>en</strong> su edición y manejo, para locual <strong>de</strong>bes poner <strong>en</strong> tu ∼/.emacs lo sigui<strong>en</strong>te:


6.12 Emacs 239( setq TeX−auto−save t )( setq TeX−parse−s e l f t )( setq−d e f a u l t TeX−master n i l )Edición <strong>de</strong> docum<strong>en</strong>tosTabla 6.34AUCTEX estudia el comando \docum<strong>en</strong>tclass <strong>de</strong> tu docum<strong>en</strong>to y <strong>en</strong> función <strong>de</strong> eso te ayudaa completar comandos <strong>de</strong> LATEX, lo cual ti<strong>en</strong>e dos aplicaciones importantes y que a la postreagra<strong>de</strong>cerás infinitam<strong>en</strong>te.1. Te permite completar comandos parcialm<strong>en</strong>te escritos. Por ejemplo, pue<strong>de</strong>s escribir \r<strong>en</strong>ewcy presionar M–tab (TeX-complete-symbol) y AUCTEX hace el resto, es <strong>de</strong>cir, completarel comando \r<strong>en</strong>ewcommand por ti. Si más <strong>de</strong> un comando casa con el prefijo, <strong>en</strong>toncesAUCTEX te ofrece una lista <strong>de</strong> los posibles comandos para que escojas.2. Te ayuda a insertar ambi<strong>en</strong>tes, esto es pares <strong>de</strong> la forma \begin — \<strong>en</strong>d.Un número importante <strong>de</strong> macros acompañan a AUCTEX y están aquí para ayudarte a editarrápidam<strong>en</strong>te. Las más importantes son las sigui<strong>en</strong>tes:Emacs: comandos <strong>de</strong> AUCT E XComandoLaTeX-<strong>en</strong>vironm<strong>en</strong>tC-c C-eLaTeX-sectionC-c C-sTeX-fontC-c C-f seguido <strong>de</strong>C-r , C-i , C-b , . . .LaTeX-insert-itemM–EnterTeX-insert-macro( C-c <strong>en</strong>ter )DescripciónInserta un par <strong>de</strong> la forma \begin — \<strong>en</strong>d.Inserta uno <strong>de</strong> \chapter, \section, . . .Insertan uno <strong>de</strong> \textrm{}, \ textit {}, \ textbf {},. . .Inserta un nuevo item <strong>en</strong> un ambi<strong>en</strong>te. Esto esútil <strong>en</strong> todo tipo <strong>de</strong> listas, AUCTEX propone elformato a<strong>de</strong>cuado.Con este comando pue<strong>de</strong>s insertar un macro <strong>en</strong>tu docum<strong>en</strong>to y AUCTEX te preguntará por losargum<strong>en</strong>tos <strong>de</strong>l mismo.AUCTEX provee varios comandos más, pero <strong>en</strong> la mayoría <strong>de</strong> los docum<strong>en</strong>tos LATEX estándar,con los que listamos arriba pue<strong>de</strong>s avanzar rápidam<strong>en</strong>te <strong>en</strong> la edición. Más a<strong>de</strong>lante veremosalgunos comandos y utilerías para hacer matemáticas <strong>en</strong> un modo especial que AUCTEX proveepara tal efecto.Para lograr que AUCTEX te pregunte por los títulos <strong>de</strong> las secciones, capítulos y otras subpartes<strong>de</strong>l docum<strong>en</strong>to que insertas y te proponga nombres intelig<strong>en</strong>tes para etiquetas, es conve-


240 L A TEXni<strong>en</strong>te agregar a tu ∼/.emacs lo sigui<strong>en</strong>te:( setq LaTeX−section −hook’ ( LaTeX−section −headingLaTeX−section − t i t l eLaTeX−section −tocLaTeX−section −s e c t i o nLaTeX−section −l a b e l ))Cómo ejecutar L A T E XAUCTEX provee un comando que, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l contexto <strong>en</strong> que se use, ofrece variasalternativas para ejecutar comandos sobre tu docum<strong>en</strong>to fu<strong>en</strong>te.El comando TeX-command-master ( C-c C-c ) o su hermano TeX-command-region( C-c C-r ) ejecuta LATEX <strong>en</strong> todo el docum<strong>en</strong>to o <strong>en</strong> la región especificada, respectivam<strong>en</strong>te.Cuando ejecutamos LATEX <strong>de</strong> esta forma, la vista <strong>de</strong> Emacs se divi<strong>de</strong> <strong>en</strong> dos y la salida<strong>de</strong> la ejecución se <strong>de</strong>spliega <strong>en</strong> la segunda mitad para que puedas editar y ver el resultado <strong>de</strong>la ejecución simultáneam<strong>en</strong>te. Si LATEX <strong>en</strong>cu<strong>en</strong>tra errores, <strong>en</strong>tonces pue<strong>de</strong>s llamar a la funciónTeX-next-error ( C-c ‘ ) que moverá el cursor al primer error y <strong>de</strong>splegará un texto explicativojunto con el m<strong>en</strong>saje que arrojó LATEX. Pue<strong>de</strong>s repetir la ejecución <strong>de</strong> este comando hasta qu<strong>en</strong>o <strong>en</strong>cu<strong>en</strong>tres más errores.Una vez que hayas concluido con el formato <strong>de</strong> tu docum<strong>en</strong>to exitosam<strong>en</strong>te, pue<strong>de</strong>s volvera invocar el comando TeX-command-master y te ofrecerá una alternativa para visualizar elresultado.Modo para matemáticasAUCTEX incluye un modo para facilitar la edición <strong>de</strong> matemáticas y, aunque sigue si<strong>en</strong>doel mismo AUCTEX, se comporta tan distinto que lo tratamos por separado.¿Ya te dijimos que TEX fue escrito por un matemático? En caso <strong>de</strong> que no lo hayamos hecho,sí, TEX fue escrito por un matemático e históricam<strong>en</strong>te siempre ha ofrecido un soporte inigualablepara escribir matemáticas. Fiel a esta tradición, AUCTEX te ofrece un modo m<strong>en</strong>or especialpara escribir símbolos matemáticos rápidam<strong>en</strong>te. Para <strong>en</strong>trar a este modo, <strong>de</strong>bes teclear C-c∼ , que es el comando LaTeX-math-mo<strong>de</strong> – también se usa para salir <strong>de</strong>l modo matemático<strong>de</strong> AUCTEX–.Este modo m<strong>en</strong>or agrega un comando, LaTeX-math-abbrev-preffix o simplem<strong>en</strong>te ‘ yuna vez que llamas este comando (i.e. presionas ‘ ) AUCTEX leerá un carácter <strong>de</strong>l tecladoy luego insertará un símbolo matemático asociado. La lista <strong>de</strong> asociación <strong>en</strong>tre carácteres ysímbolos se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la variable LaTeX-math-list y, por supuesto, pue<strong>de</strong> configurarse. Así,por ejemplo, estando <strong>en</strong> modo matemático la secu<strong>en</strong>cia <strong>de</strong> teclas ‘ a inserta α.Nota: para nosotros, hispano parlantes, escribir ac<strong>en</strong>tos es muy importante y, <strong>en</strong> g<strong>en</strong>eral, ‘sirve para poner ac<strong>en</strong>tos invertidos, lo cual dificulta el acceso al modo matemático <strong>de</strong> AUCTEX.


6.12 Emacs 241Por lo tanto ti<strong>en</strong>es dos opciones, presionar dos veces ‘ y luego la letra <strong>de</strong>seada o bi<strong>en</strong> cambiarel prefijo utilizado por AUCTEX.6.12.2. RefT E XRefTEX es un paquete para manejar etiquetas, refer<strong>en</strong>cias, citas e índices <strong>de</strong>s<strong>de</strong> Emacs <strong>en</strong>docum<strong>en</strong>tos TEX o LATEX. No es necesario usar AUCTEX y RefTEX juntos, pero hay pocas cosasque combinan mejor, con la notable excepción <strong>de</strong> tacos y cerveza.RefTEX es otro programa escrito, al igual que AUCTEX, <strong>en</strong> Emacs-Lisp y es un producto<strong>de</strong> software complejo y gran<strong>de</strong>, pero te daremos una breve introducción a su uso y te po<strong>de</strong>mosgarantizar que una vez que te acostumbres a RefTEX te preguntarás cómo pudiste vivir sin él(nosotros nos preguntamos eso con casi todos los productos <strong>de</strong> software, aplicaciones y paquetesque incluimos <strong>en</strong> este libro, por ello es que ahora las promovemos incansablem<strong>en</strong>te.)Para cargar RefTEX <strong>en</strong> Emacs, agrega lo sigui<strong>en</strong>te a tu ∼/.emacs:( r e q u i r e ’ r e f t e x )Tabla <strong>de</strong> cont<strong>en</strong>idosLa tabla <strong>de</strong> cont<strong>en</strong>idos <strong>de</strong> un docum<strong>en</strong>to LATEX es algo muy importante y te pue<strong>de</strong> dar unavisión global <strong>de</strong> la estructura <strong>de</strong> tu trabajo. Sin embargo, la tabla <strong>de</strong> cont<strong>en</strong>idos existe hasta quecompilas tu docum<strong>en</strong>to fu<strong>en</strong>te y exclusivam<strong>en</strong>te <strong>en</strong> el docum<strong>en</strong>to g<strong>en</strong>erado como salida (DVI,PostScript, PDF, etc.). ¿Qué harías y cómo aprovecharías el po<strong>de</strong>r t<strong>en</strong>er una tabla <strong>de</strong> cont<strong>en</strong>idosg<strong>en</strong>erada <strong>de</strong>ntro <strong>de</strong> tu editor? ¿Qué harías con ella si a<strong>de</strong>más esta tabla fuera navegable?El comando reftex-toc ( C-c =) hace justo eso, te muestra secciones, etiquetas y <strong>en</strong>tradas<strong>de</strong> índice <strong>de</strong>finidos <strong>en</strong> tu docum<strong>en</strong>to y más aún, te permite saltar a cualquiera <strong>de</strong> estos puntosrápidam<strong>en</strong>te.Etiquetas y refer<strong>en</strong>ciasCrear etiquetas para los distintos elem<strong>en</strong>tos <strong>de</strong> tus docum<strong>en</strong>tos como figuras, tablas y fórmulases usualm<strong>en</strong>te una tarea tediosa y poco gratificante. La g<strong>en</strong>te se ha inv<strong>en</strong>tado fórmulasy técnicas para asignar etiquetas or<strong>de</strong>nadam<strong>en</strong>te para <strong>de</strong>spués recordarlas fácilm<strong>en</strong>te y hacerrefer<strong>en</strong>cia a éstas sin t<strong>en</strong>er que buscar <strong>en</strong> todo el docum<strong>en</strong>to. Los resultados varían mucho, pero<strong>en</strong> g<strong>en</strong>eral pue<strong>de</strong>s asegurar que es una mala i<strong>de</strong>a y no funciona bi<strong>en</strong>.RefTEX te ayuda a crear etiquetas únicas y a <strong>en</strong>contrar la etiqueta a<strong>de</strong>cuada cuando quiereshacer una refer<strong>en</strong>cia rápidam<strong>en</strong>te. RefTEX distingue <strong>en</strong>tre etiquetas para distintos ambi<strong>en</strong>tes,conoce todos los ambi<strong>en</strong>tes estándar (figure, equation, table) y pue<strong>de</strong>s configurarlo para que<strong>en</strong>ti<strong>en</strong>da aún más tipos <strong>de</strong> etiquetas cambiando el valor <strong>de</strong> la variable reftex-label-alist.Crear etiquetas: El comando reftex-label – ( C-c ( ) inserta una etiqueta <strong>en</strong> el punto. Cuandousas este comando RefTEX realizará una <strong>de</strong> las sigui<strong>en</strong>tes acciones:


242 L A TEXDerivar una etiqueta <strong>de</strong>l contexto (por omisión usa una para sección).Pedir que le <strong>de</strong>s una ca<strong>de</strong>na <strong>de</strong>scriptiva para la etiqueta (esto lo hace para figuras ytablas).Insertar una etiqueta simple hecha con un prefijo y un número (para todos los <strong>de</strong>másambi<strong>en</strong>tes).La variable reftex-insert-label-flags controla qué etiquetas son creadas y cómo.Referir etiquetas: Para hacer una refer<strong>en</strong>cia usa el comando reftex-refer<strong>en</strong>ce ( C-c ) ). Estote muestra una vista (outline) <strong>de</strong> tu docum<strong>en</strong>to con todas las etiquetas <strong>de</strong> un cierto tipo(figure, equation, etc.) y algo <strong>de</strong> contexto para cada etiqueta para que puedas reconocerlasfácilm<strong>en</strong>te. Al seleccionar una etiqueta <strong>de</strong> esta vista, RefTEX inserta \ ref {LABEL} <strong>en</strong> elbuffer original.CitasEl comando reftex-citation ( C-c [ ) te permite especificar una expresión regular o patrónpara buscar <strong>en</strong> el archivo <strong>de</strong> base <strong>de</strong> datos <strong>de</strong> BIBT E X para el docum<strong>en</strong>to (tal y como se especifica<strong>en</strong> el comando \ bibliography). Todas las <strong>en</strong>tradas que concuer<strong>de</strong>n con el patrón <strong>de</strong> búsqueda teserán mostradas para que elijas la apropiada. La lista aparece con formato y or<strong>de</strong>nada.Una vez que seleccionas una <strong>en</strong>trada, aparecerá <strong>en</strong> tu docum<strong>en</strong>to fu<strong>en</strong>te una refer<strong>en</strong>cia <strong>de</strong>la forma \ cite {KEY}.Soporte para la g<strong>en</strong>eración <strong>de</strong> índicesRefTEX también te ayuda a g<strong>en</strong>erar <strong>en</strong>tradas para el índice <strong>de</strong> tu docum<strong>en</strong>to. Más aún, tepermite incluso compilar las <strong>en</strong>tradas exist<strong>en</strong>tes alfabéticam<strong>en</strong>te y te las pres<strong>en</strong>ta <strong>en</strong> un bufferpara que puedas editarlas.Para crear una <strong>en</strong>trada <strong>de</strong> índice utiliza reftex-in<strong>de</strong>x-selection-of-word ( C-c / ) y para<strong>de</strong>splegar y editar el índice, reftex-display-in<strong>de</strong>x ( C-c > ).RefTEX pue<strong>de</strong> hacer muchas cosas más, pero para efectos prácticos lo que hemos cubiertoes lo más importante y útil <strong>de</strong>l programa y su uso. Estamos seguros te traerá gratas sorpresas yun increm<strong>en</strong>to consi<strong>de</strong>rable <strong>de</strong> productividad ci<strong>en</strong>tífica.6.12.3. PreviewEl paquete preview-L A T E X se distribuye como parte estándar <strong>de</strong> AUCTEX y exti<strong>en</strong><strong>de</strong> tanto aEmacs como a LATEX. Esto es porque incluye un estilo para LATEX y código <strong>en</strong> Emacs-Lisp paraaprovechar este estilo y ayudarte <strong>en</strong> la edición <strong>de</strong> docum<strong>en</strong>tos.Para los usuarios <strong>de</strong> TEX/LATEX siempre ha sido un problema serio la discusión sobre t<strong>en</strong>ereditores que te muestr<strong>en</strong> lo que estás escribi<strong>en</strong>do (por sus siglas <strong>en</strong> inglés, WYSIWYG), quecomo ya sabes es algo que no suce<strong>de</strong> con LATEX. Sin embargo, la int<strong>en</strong>ción <strong>de</strong>l paquete previewpara Emacs no es exactam<strong>en</strong>te ésta.


6.12 Emacs 243Con preview se busca un balance <strong>en</strong>tre elem<strong>en</strong>tos gráficos y texto. Utiliza la salida gráficapara ciertas construcciones (configurable); hace esto cuando se le solicita y lo hace ahí mismo,<strong>de</strong>ntro <strong>de</strong>l código fu<strong>en</strong>te. Cambiar <strong>en</strong>tre la versión gráfica y el código fu<strong>en</strong>te es fácil y natural ypue<strong>de</strong> hacerse para cada imag<strong>en</strong> <strong>de</strong> manera in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te.Para activar preview <strong>de</strong>bes poner lo sigui<strong>en</strong>te <strong>en</strong> tu ∼/.emacs:( load " preview−l a t e x . e l " n i l t t )Uso básico <strong>de</strong> previewUna vez activado y cuando estás editando un archivo <strong>de</strong> LATEX, pue<strong>de</strong>s utilizar el comandopreview-docum<strong>en</strong>t ( C-c C-p C-d ). En este mom<strong>en</strong>to se com<strong>en</strong>zarán a g<strong>en</strong>erar vistaspreliminares para distintos objetos <strong>en</strong> tu docum<strong>en</strong>to. Nota importante: mi<strong>en</strong>tras se g<strong>en</strong>eran lasvistas preliminares, pue<strong>de</strong>s navegar tu docum<strong>en</strong>to <strong>en</strong> el buffer; sin embargo no es recom<strong>en</strong>dableque edites algo porque el resultado <strong>de</strong> las vistas podría terminar <strong>en</strong> lugares erróneos.En caso <strong>de</strong> querer editar el buffer mi<strong>en</strong>tras se están g<strong>en</strong>erando las vistas preliminares, teconvi<strong>en</strong>e <strong>de</strong>t<strong>en</strong>er todos los procesos ejecutándose <strong>en</strong> el fondo con el comando TeX-kill-job( C-c C-k ).Figura 6.17Ejemplo <strong>de</strong> preview <strong>en</strong> la edición <strong>de</strong> este capítuloPara ver/editar el código LATEX para un objeto específico, que es probablem<strong>en</strong>te más útil,pue<strong>de</strong>s ejecutar el comando preview-at-point ( C-c C-p C-p ) o bi<strong>en</strong> presionar el botón <strong>de</strong>lmedio <strong>de</strong>l ratón sobre la vista previa. Ahora pue<strong>de</strong>s editar el código y g<strong>en</strong>erar una nueva vistapreliminar con C-c C-p C-p nuevam<strong>en</strong>te.


L<strong>en</strong>guajes <strong>de</strong>marcado 7Los l<strong>en</strong>guajes <strong>de</strong> marcado (markup languages) utilizan texto común y corri<strong>en</strong>te combinadocon información adicional que sirve para <strong>de</strong>finir su semántica o su pres<strong>en</strong>tación (a veces ambas).En palabras s<strong>en</strong>cillas: esta información adicional nos dice qué significa el texto o cómo se pres<strong>en</strong>taal usuario. La información adicional suele estar intercalada <strong>en</strong> el mismo texto utilizandomarcas especiales; <strong>de</strong> ahí el nombre <strong>de</strong> l<strong>en</strong>guajes <strong>de</strong> marcado.Los l<strong>en</strong>guajes <strong>de</strong> marcado ti<strong>en</strong><strong>en</strong> sus oríg<strong>en</strong>es <strong>en</strong> la industria editorial, mucho antes <strong>de</strong> lacreación <strong>de</strong> computadoras digitales: cuando un manuscrito se preparaba para impresión, un especialista(coloquialm<strong>en</strong>te conocido como “marcador”) escribía <strong>en</strong> los márg<strong>en</strong>es anotacionesespeciales (marcas) que servían <strong>de</strong> guía a los que transcribían el texto <strong>en</strong> su forma final yalista para imprimirse. Estas marcas eran un l<strong>en</strong>guaje <strong>de</strong> marcado primitivo (no había necesariam<strong>en</strong>teun estándar, ni t<strong>en</strong>ían una sintaxis formalm<strong>en</strong>te <strong>de</strong>finida), que servía para explicar lapres<strong>en</strong>tación <strong>de</strong>l texto: el tamaño <strong>de</strong> la fu<strong>en</strong>te, el tipo, el estilo, etc.Con la llegada <strong>de</strong> las computadoras, los l<strong>en</strong>guajes <strong>de</strong> marcado ganaron a<strong>de</strong>más la capacidad<strong>de</strong> obt<strong>en</strong>er automáticam<strong>en</strong>te información semántica: por ejemplo, si <strong>en</strong> nuestro l<strong>en</strong>guaje <strong>de</strong>marcado <strong>de</strong>finimos la marca AUTOR: para que con ella i<strong>de</strong>ntifiquemos al autor <strong>de</strong>l docum<strong>en</strong>to,es trivial hacer un programa que automáticam<strong>en</strong>te obt<strong>en</strong>ga el autor o autores <strong>de</strong> todos losdocum<strong>en</strong>tos disponibles y haga una relación <strong>en</strong>tre ellos.Aunque hay muchísimos l<strong>en</strong>guajes <strong>de</strong> marcado actualm<strong>en</strong>te (TEX y PostScript son l<strong>en</strong>guajes<strong>de</strong> marcado procedurales), <strong>de</strong> especial importancia es SGML, el L<strong>en</strong>guaje <strong>de</strong> Marcado EstándarG<strong>en</strong>eralizado (Standard G<strong>en</strong>eralized Markup Language). SGML es un meta l<strong>en</strong>guaje para <strong>de</strong>finirl<strong>en</strong>guajes <strong>de</strong> marcado, y <strong>de</strong> ahí se <strong>de</strong>rivan los dos l<strong>en</strong>guajes <strong>de</strong> marcado probablem<strong>en</strong>te másfamosos y usados <strong>en</strong> la actualidad: XML y HTML. Nos c<strong>en</strong>traremos <strong>en</strong> estos últimos duranteel resto <strong>de</strong>l capítulo.


246 L<strong>en</strong>guajes <strong>de</strong> marcado7.1. XMLSGML es un metal<strong>en</strong>guaje gran<strong>de</strong> y complejo. Implem<strong>en</strong>tar un programa (o sistema <strong>de</strong> programas)que pueda lidiar con cualquier l<strong>en</strong>guaje <strong>de</strong>finido con SGML t<strong>en</strong>drá que ser igualm<strong>en</strong>tegran<strong>de</strong> y complejo. La mayor parte <strong>de</strong> los programas que se utilizan para manejar l<strong>en</strong>guajes<strong>de</strong>finidos con SGML, <strong>en</strong> la práctica sólo soportan un subconjunto <strong>de</strong> todas las opciones queofrece.En gran medida por este motivo, y las necesida<strong>de</strong>s especiales que pres<strong>en</strong>tan las aplicacionesque necesitan comunicarse por Internet (SGML prece<strong>de</strong> por varios años a Internet), fue que secreó XML, el L<strong>en</strong>guaje <strong>de</strong> Marcado Expandible (Expansible Markup Language). XML es unsubconjunto simplificado <strong>de</strong> SGML, lo que hace el escribir programas que lo manej<strong>en</strong> muchomás fácil, y a<strong>de</strong>más está p<strong>en</strong>sado para compartir información, especialm<strong>en</strong>te a través <strong>de</strong> la red.XML es inm<strong>en</strong>sam<strong>en</strong>te popular y exist<strong>en</strong> muchísimos l<strong>en</strong>guajes <strong>de</strong>finidos con XML quese usan hoy <strong>en</strong> día; por nombrar sólo algunos: RSS (para noticias), MathML (para repres<strong>en</strong>tarfórmulas matemáticas complejas), XHTML (el sucesor <strong>de</strong> facto <strong>de</strong> HTML), Scalable VectorGraphics (para gráficos escalares), MusicXML (para notación musical) y miles más. XML tambiénes utilizado por muchos programas para guardar sus archivos, especialm<strong>en</strong>te <strong>en</strong> el mundo<strong>de</strong>l software libre: Op<strong>en</strong>Office, AbiWord, Gnumeric y KOffic<strong>en</strong> usan XML para guardar susdocum<strong>en</strong>tos, por nombrar unos cuantos.Un docum<strong>en</strong>to XML pres<strong>en</strong>ta su información <strong>en</strong> una estructura jerárquica, que po<strong>de</strong>mosver como un árbol. Todo docum<strong>en</strong>to XML ti<strong>en</strong>e un elem<strong>en</strong>to raíz, que a su vez pue<strong>de</strong> t<strong>en</strong>er máselem<strong>en</strong>tos y/o texto común y corri<strong>en</strong>te. Cada elem<strong>en</strong>to a su vez pue<strong>de</strong> t<strong>en</strong>er más elem<strong>en</strong>tos y/otexto y así sucesivam<strong>en</strong>te. A<strong>de</strong>más, cada elem<strong>en</strong>to pue<strong>de</strong> t<strong>en</strong>er atributos. Veamos un ejemplo<strong>en</strong> el listado 7.1Código 7.1 Docum<strong>en</strong>to <strong>en</strong> XML (1/2)< l i b r o >< t i t u l o >El i n g e n i o s o h i d a l g o donQ u i j o t e <strong>de</strong> l a Mancha< a u t o r >Miguel <strong>de</strong> C e r v a n t e s Saavedra < p a r t e numero ="1" >< c a p i t u l o numero ="1" >Que t r a t a <strong>de</strong> 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 od e l famoso h i d a l g o don Q u i j o t e <strong>de</strong> l a Mancha


7.1 XML 247Código 7.1 Docum<strong>en</strong>to <strong>en</strong> XML (2/2)< p a r r a f o >En un l u g a r <strong>de</strong> l a Mancha , <strong>de</strong> cuyo nombre noq u i e r o acordarme , no ha mucho tiempo quev i v&i a c u t e ; a un h i d a l g o <strong>de</strong> l o s <strong>de</strong> l a n z a <strong>en</strong>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 oy g a l g o c o r r e d o r .< p a r r a f o >. . .. . .. . .La primera línea es la <strong>de</strong>claración XML, que sirver para <strong>de</strong>finir qué versión <strong>de</strong>l estándarestamos usando (g<strong>en</strong>eralm<strong>en</strong>te la “1.0”) y el conjunto <strong>de</strong> carácteres <strong>en</strong> que está el docum<strong>en</strong>to(g<strong>en</strong>eralm<strong>en</strong>te “UTF-8”).El ejemplo obviam<strong>en</strong>te es <strong>de</strong> un libro: libro es el elem<strong>en</strong>to raíz, titulo, autor, parte, capitulo,extracto y parrafo son elem<strong>en</strong>tos, mi<strong>en</strong>tras que numero es un atributo que pose<strong>en</strong> partey capitulo. Como estamos <strong>de</strong>fini<strong>en</strong>do un docum<strong>en</strong>to XML que utiliza el conjunto <strong>de</strong> carácteresUTF-8, sería perfectam<strong>en</strong>te legal <strong>de</strong>finir a los elem<strong>en</strong>tos como título, capítuo, párrafo, pero noes lo que suele acostumbrarse. De igual forma, podrían utilizarse ac<strong>en</strong>tos (o eñes o diéresis),pero utilizamos “&oacute;” <strong>en</strong> lugar <strong>de</strong> “ó” para explicar lo que son las <strong>en</strong>tida<strong>de</strong>s.Las <strong>en</strong>tida<strong>de</strong>s son usadas para po<strong>de</strong>r escribir carácteres <strong>en</strong> XML que <strong>de</strong> otra forma seríacomplicado hacerlo. Por ejemplo, el símbolo <strong>de</strong> “m<strong>en</strong>or que” (&lt;


248 L<strong>en</strong>guajes <strong>de</strong> marcado(todo elem<strong>en</strong>to, excepto el raíz, está completam<strong>en</strong>te cont<strong>en</strong>ido <strong>de</strong>ntro <strong>de</strong> otro) y los valores <strong>de</strong>los atributos están <strong>en</strong>tre comillas (también podrían estar <strong>en</strong>tre comillas simples, como <strong>en</strong> ‘3’).Para que un docum<strong>en</strong>to XML sea correcto, <strong>de</strong>be estar bi<strong>en</strong> formado; pero eso no es sufici<strong>en</strong>te;a<strong>de</strong>más, el docum<strong>en</strong>to <strong>de</strong>be ser válido. Un docum<strong>en</strong>to XML válido es aquel que cumplecon un esquema particular. Un esquema nos dice la estructura que <strong>de</strong>be seguir un docum<strong>en</strong>toXML; hay varias formas <strong>de</strong> <strong>de</strong>finir esquemas.La forma más vieja <strong>de</strong> <strong>de</strong>finir esquemas vi<strong>en</strong>e <strong>de</strong> tiempos <strong>de</strong> SGML y se llama DTD, Definición<strong>de</strong> Tipo <strong>de</strong> Docum<strong>en</strong>to (Docum<strong>en</strong>t Type Definition). El DTD para los XML <strong>de</strong> librosseríá como se ve <strong>en</strong> el ejemplo <strong>de</strong>l listado 7.2.Código 7.2DTD para archivo <strong>en</strong> XML. . .)El DTD s<strong>en</strong>cillam<strong>en</strong>te nos dice qué pue<strong>de</strong> cont<strong>en</strong>er cada elem<strong>en</strong>to y qué atributos pue<strong>de</strong>t<strong>en</strong>er; también pue<strong>de</strong> <strong>de</strong>finir las <strong>en</strong>tida<strong>de</strong>s válidas <strong>en</strong> el docum<strong>en</strong>to. El elem<strong>en</strong>to libro ti<strong>en</strong>e untitulo, uno o más autores (autor+) y una o más partes (part+). El DTD también nos dice si unatributo es obligatorio (#REQUIRED) u opcional.El problema con los DTDs es que son poco flexibles y que no soportan varias característicasespecíficas <strong>de</strong> XML que SGML no ti<strong>en</strong>e (como espacios <strong>de</strong> nombres). Sin embargo, paradocum<strong>en</strong>tos con estructuras s<strong>en</strong>cillas, los DTDs cumpl<strong>en</strong> razonablem<strong>en</strong>te el trabajo.Otra forma <strong>de</strong> <strong>de</strong>finir esquemas es con XML Schema. Sin embargo, los esquemas <strong>de</strong> esteestilo son algo más complejos que los DTDs; por razones <strong>de</strong> espacio no los veremos aquí.Una gran v<strong>en</strong>taja que ofrece XML para manipular información, es que ya exist<strong>en</strong> las herrami<strong>en</strong>tasnecesarias para manejar los docum<strong>en</strong>tos, <strong>en</strong> casi cualquier l<strong>en</strong>guaje <strong>de</strong> programaciónexist<strong>en</strong>te. Comprobar que un docum<strong>en</strong>to XML esté bi<strong>en</strong> formado y sea válido es muy s<strong>en</strong>cillo,por lo que el programador ya sólo necesita <strong>en</strong>cargarse <strong>de</strong> extraer y manipular la informacióncont<strong>en</strong>ida <strong>en</strong> el docum<strong>en</strong>to. Para esto último también ya exist<strong>en</strong> las herrami<strong>en</strong>tas necesarias.


7.2 HTML 2497.2. HTMLHTML nació casi al mismo tiempo que la World Wi<strong>de</strong> Web, <strong>de</strong> la necesidad <strong>de</strong> po<strong>de</strong>rpres<strong>en</strong>tar información <strong>en</strong> la red <strong>de</strong> forma rápida y s<strong>en</strong>cilla. SGML era muy complejo como paralo que se requería y XML todavía no se inv<strong>en</strong>taba; así que HTML fue el resultado <strong>de</strong> quererresolver un problema muy concreto <strong>de</strong> la forma más s<strong>en</strong>cilla posible. Se utilizó una estructurasimilar a la <strong>de</strong> un l<strong>en</strong>guaje SGML, pero mucho m<strong>en</strong>os estricto y con mucha tolerancia a fallos.Eso, aunado a que al inicio no había un estándar propiam<strong>en</strong>te sino sólo una serie <strong>de</strong> reglas nomuy claram<strong>en</strong>te especificadas, hizo que HTML terminara si<strong>en</strong>do un l<strong>en</strong>guaje poco consist<strong>en</strong>tey <strong>de</strong>masiado permisivo <strong>en</strong> su manejo <strong>de</strong> errores (<strong>en</strong> g<strong>en</strong>eral los navegadores <strong>de</strong>splegaban unapágina no importaba cuántos errores tuviera el docum<strong>en</strong>to HTML).Con la fundación <strong>de</strong>l Consorcio <strong>de</strong> la World Wi<strong>de</strong> Web (World Wi<strong>de</strong> Web Consortium), oW3C, se empezaron a corregir muchos <strong>de</strong> los problemas que inicialm<strong>en</strong>te t<strong>en</strong>ía HTML; aunqueahora el estándar <strong>de</strong> XHTML es bastante estricto y formalm<strong>en</strong>te <strong>de</strong>finido, todavía exist<strong>en</strong> miles<strong>de</strong> páginas <strong>en</strong> la red que sigu<strong>en</strong> usando (o abusando) <strong>de</strong> las versiones iniciales <strong>de</strong> HTML.El estándar actual es el <strong>de</strong> XHTML 1.0 y 1.1 y es <strong>en</strong> ése <strong>en</strong> el que nos c<strong>en</strong>traremos aquí.7.2.1. XHTMLXHTML es básicam<strong>en</strong>te una limpieza <strong>de</strong> HTML para que se comporte como un docum<strong>en</strong>toXML bi<strong>en</strong> formado y que sea válido, utilizando uno <strong>de</strong> los tres DTDs que la W3C especificapara XHTML.La W3C ofrece 3 DTD distintos para po<strong>de</strong>r t<strong>en</strong>er uno que ofrezca compatibilidad con versionesanteriores <strong>de</strong> HTML; un DTD es el llamado estricto y es el que <strong>de</strong>bería usarse parapáginas nuevas si se pue<strong>de</strong> garantizar que qui<strong>en</strong>es las vean t<strong>en</strong>drán navegadores razonablem<strong>en</strong>temo<strong>de</strong>rnos que puedan <strong>de</strong>splegarlas sin problemas. El segundo es el transicional y es un pocomás flexible que el estricto; es el que hay que usar si se quiere convertir paulatinam<strong>en</strong>te páginasescritas antes <strong>de</strong> que se <strong>de</strong>finiera XHTML o para conservar compatibilidad para navegadoresya algo viejos. El tercero es para utilizar marcos. Por razones <strong>de</strong> espacio aquí sólo veremosXHTML estricto.Un docum<strong>en</strong>to XHTML mínimo podría ser el que se ve <strong>en</strong> el listado 7.3.Una vez más, podríamos utilizar directam<strong>en</strong>te “é” <strong>en</strong> lugar <strong>de</strong> &eacute;, porque el docum<strong>en</strong>toutiliza el conjunto <strong>de</strong> carácteres UTF-8, pero usamos la <strong>en</strong>tidad para recalcar que <strong>en</strong>XHTML casi todas las letras ac<strong>en</strong>tuadas ti<strong>en</strong><strong>en</strong> <strong>de</strong>finida una <strong>en</strong>tidad, así como muchos símbolos<strong>de</strong> otros idiomas (por ejemplo, &alpha; <strong>de</strong>spliega α).Dado que un docum<strong>en</strong>to <strong>en</strong> XHTML es un docum<strong>en</strong>to XML también, empieza con la <strong>de</strong>claraciónXML. Después vi<strong>en</strong>e el tipo <strong>de</strong> docum<strong>en</strong>to, don<strong>de</strong> le <strong>de</strong>cimos que utilice la versiónestricta <strong>de</strong>l estándar XHTML 1.0. El elem<strong>en</strong>to raíz <strong>de</strong> un docum<strong>en</strong>to XHTML es html y éste asu vez ti<strong>en</strong>e los elem<strong>en</strong>tos <strong>de</strong> cabeza (head) y cuerpo (body). En este ejemplo sólo ponemos eltítulo <strong>de</strong> la página <strong>en</strong> la cabeza y un <strong>en</strong>cabezado <strong>de</strong> nivel 1 (h1) y un párrafo (p) <strong>en</strong> el cuerpo.


250 L<strong>en</strong>guajes <strong>de</strong> marcadoCódigo 7.3Docum<strong>en</strong>to <strong>en</strong> XHTML< t i t l e >P&a a c u t e ; g i n a P e r s o n a l <strong>de</strong> Fulano <strong>de</strong> Tal P&a a c u t e ; g i n a P e r s o n a l <strong>de</strong> Fulano <strong>de</strong> Tal Hola , yo soy Fulano <strong>de</strong> Tal y &e a c u t e ; s t aes mi p&a a c u t e ; g i n a p e r s o n a l .7.3. CSSTodos los elem<strong>en</strong>tos <strong>de</strong>finidos <strong>en</strong> XHTML cumpl<strong>en</strong> una función semántica, no <strong>de</strong> pres<strong>en</strong>tación.Aunque por omisión ciertos elem<strong>en</strong>tos se <strong>de</strong>spliegan con características especiales (porejemplo, los <strong>en</strong>cabezados <strong>de</strong> nivel 1 ti<strong>en</strong><strong>en</strong> una fu<strong>en</strong>te <strong>de</strong> mayor tamaño que los <strong>de</strong> nivel 2), estoes sólo por conv<strong>en</strong>ción y tratando <strong>de</strong> emular cómo funcionaba HTML originalm<strong>en</strong>te. XHTMLrealm<strong>en</strong>te no dice casi nada acerca <strong>de</strong> cómo <strong>de</strong>be verse un docum<strong>en</strong>to; la pres<strong>en</strong>tación <strong>de</strong>l mismoes in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> su cont<strong>en</strong>ido.Para modificar la pres<strong>en</strong>tación <strong>de</strong> un docum<strong>en</strong>to XHTML se utilizan hojas <strong>de</strong> estilo, que eslo que veremos a continuación.Las Hojas <strong>de</strong> Estilo <strong>en</strong> Cascada (Cascading Style Sheets) es el medio a partir <strong>de</strong>l cual semodifica cómo se ve un docum<strong>en</strong>to XHTML; pero también se pue<strong>de</strong>n utilizar para docum<strong>en</strong>tosXML arbitrarios o para docum<strong>en</strong>tos HTML aunque no sean necesariam<strong>en</strong>te XHTML.Veamos cómo funcionan sigui<strong>en</strong>do el ejemplo <strong>en</strong> el listado 7.4.Código 7.4 Hoja <strong>de</strong> estilo <strong>en</strong> cascada (1/2)< t i t l e > P r u e b a s <strong>de</strong> CSS


7.3 CSS 251Código 7.4 Hoja <strong>de</strong> estilo <strong>en</strong> cascada (2/2) P r u e b a s <strong>de</strong> CSS Texto normal . Texto e n f a t i z a d o . < / em>< s t r o n g > Texto r e f o r z a d o . < / s t r o n g >Liga a Google . L i s t a no or<strong>de</strong>nada < l i >Elem<strong>en</strong>to 1 < l i >Elem<strong>en</strong>to 2 < l i >Elem<strong>en</strong>to 3 < l i >Elem<strong>en</strong>to 4 L i s t a or<strong>de</strong>nada < l i >Elem<strong>en</strong>to 1 < l i >Elem<strong>en</strong>to 2 < l i >Elem<strong>en</strong>to 3 < l i >Elem<strong>en</strong>to 4 Sin utilizar ninguna hoja <strong>de</strong> estilo, la página se vería como <strong>en</strong> la figura 7.1.Figura 7.1Página sin hoja <strong>de</strong> estilo


252 L<strong>en</strong>guajes <strong>de</strong> marcadoSin modificar <strong>en</strong> nada el cont<strong>en</strong>ido <strong>de</strong>l docum<strong>en</strong>to, po<strong>de</strong>mos cambiar por completo cómose ve, usando la hoja <strong>de</strong> estilo <strong>de</strong>l listado 7.5.Código 7.5Docum<strong>en</strong>to <strong>en</strong> XMLbody {f o n t −f a m i l y : mono ;f o n t −s i z e : 14 px ;}em {c o l o r : #0 f0 ;}s t r o n g {c o l o r : # f00 ;}u l {c o l o r : # f 0 f ;f o n t −s t y l e : i t a l i c ;}o l {c o l o r : #0 f f ;f o n t −s i z e : l a r g e ;}El resultado pue<strong>de</strong> apreciarse <strong>en</strong> la figura 7.2.Figura 7.2Página con hoja <strong>de</strong> estilo


7.3 CSS 253Para que el docum<strong>en</strong>to XHTML use la hoja <strong>de</strong> estilo, se utiliza el elem<strong>en</strong>to link <strong>en</strong> la cabeza<strong>de</strong>l mismo:Código 7.6Docum<strong>en</strong>to <strong>en</strong> XHTML con link< t i t l e > P r u e b a s <strong>de</strong> CSS < l i n k r e l =" s t y l e s h e e t " h r e f =" example . c s s " t y p e =" t e x t / c s s " / >Sin importar que tan bi<strong>en</strong> o mal se vea la página, lo relevante es que su apari<strong>en</strong>cia es completam<strong>en</strong>tein<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> su cont<strong>en</strong>ido. El que lo primero sea ortogonal a lo segundo, permitea los creadores <strong>de</strong>l cont<strong>en</strong>ido conc<strong>en</strong>trarse sólo <strong>en</strong> la información y <strong>de</strong>jarle la pres<strong>en</strong>tación adiseñadores gráficos o a algui<strong>en</strong> que se <strong>en</strong>cargue exclusivam<strong>en</strong>te <strong>de</strong> eso (y así evitar que laspáginas se vean como <strong>en</strong> el ejemplo).Las hojas <strong>de</strong> estilo también sirv<strong>en</strong> para po<strong>de</strong>r <strong>de</strong>terminar cómo se repres<strong>en</strong>tará una página<strong>en</strong> distintos medios. Se pue<strong>de</strong> utilizar una hoja <strong>de</strong> estilo para pres<strong>en</strong>tarla <strong>en</strong> un navegador normal;otra especialm<strong>en</strong>te hecha p<strong>en</strong>sando <strong>en</strong> impresoras; una más para lectores <strong>de</strong> pantalla (parausuarios ciegos o con visión limitada).7.3.1. JavascriptJavaScript (que no ti<strong>en</strong>e casi nada que ver con el l<strong>en</strong>guaje <strong>de</strong> programación Java) es un l<strong>en</strong>guaje<strong>de</strong> programación que se usa principalm<strong>en</strong>te <strong>de</strong>ntro <strong>de</strong> un navegador. Dado que es posibleacce<strong>de</strong>r al cont<strong>en</strong>ido <strong>de</strong> una página a través <strong>de</strong> JavaScript, es una opción muy s<strong>en</strong>cilla para crearcont<strong>en</strong>ido dinámico y darle la posibilidad al usuario <strong>de</strong> interactuar con la página sin necesidad<strong>de</strong> comunicarse todo el tiempo con el servidor (porque el código JavaScript se ejecuta <strong>en</strong> elcli<strong>en</strong>te, <strong>en</strong> el navegador).Todo el cont<strong>en</strong>ido <strong>de</strong> una página está disponible a través <strong>de</strong>l Mo<strong>de</strong>lo <strong>de</strong> Objeto <strong>de</strong>l Docum<strong>en</strong>to(Docum<strong>en</strong>t Object Mo<strong>de</strong>l o DOM), que es básicam<strong>en</strong>te una repres<strong>en</strong>tación <strong>en</strong> memoria<strong>de</strong> la jerarquía tipo árbol que ti<strong>en</strong>e un docum<strong>en</strong>to HTML o XML.Por ejemplo, si t<strong>en</strong>emos la página <strong>en</strong> el listado 7.7,


254 L<strong>en</strong>guajes <strong>de</strong> marcadoCódigo 7.7Docum<strong>en</strong>to <strong>en</strong> XML< t i t l e > J a v a S c r i p t < 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 " / > J a v a S c r i p t < t a b l e i d =" myTable ">< t r >< s t r o n g > Elem<strong>en</strong>tos < s t r o n g >N&u a c u t e ; mero < i n p u t t y p e =" b u t t o n " v a l u e =" Agregar r e n g l&o a c u t e ; n "o n c l i c k ="addRow ( docum<strong>en</strong>t ) ; " / >< 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 =" <strong>de</strong>lRow ( docum<strong>en</strong>t ) ; " / >y el archivo javascript.js ti<strong>en</strong>e <strong>de</strong>finidas las funciones <strong>de</strong>l listado 7.8.Código 7.8Docum<strong>en</strong>to <strong>en</strong> XMLf u n c t i o n addRow ( docum<strong>en</strong>t ){v a r t a b l e = docum<strong>en</strong>t . getElem<strong>en</strong>tById ( ’ 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 ) ;v a r c e l l 1 = newRow . i n s e r t C e l l ( 0 ) ;v a r c e l l 2 = newRow . i n s e r t C e l l ( 1 ) ;c e l l 1 . innerHTML = ’ Nuevo Elem<strong>en</strong>to ’ ;c e l l 2 . innerHTML = numRows ;}f u n c t i o n <strong>de</strong>lRow ( docum<strong>en</strong>t ){v a r t a b l e = docum<strong>en</strong>t . getElem<strong>en</strong>tById ( ’ 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 . <strong>de</strong>leteRow ( numRows −1);}


7.4 Emacs 2557.4. EmacsEntonces cada vez que se haga click <strong>en</strong> el botón “Agregar r<strong>en</strong>glón”, un nuevo r<strong>en</strong>glón aparecerá<strong>en</strong> la tabla; y cada vez que se haga click <strong>en</strong> “Borrar r<strong>en</strong>glón”, se le quitará un r<strong>en</strong>glón a la tabla.El primer botón <strong>de</strong> la página ti<strong>en</strong>e <strong>de</strong>finido (usando el atributo onclick) que cada vez que sele haga click, se man<strong>de</strong> llamar a la función addRow con el parámetro docum<strong>en</strong>t. En JavaScript,docum<strong>en</strong>t es una variable que repres<strong>en</strong>ta a todo el docum<strong>en</strong>to HTML o XML. El segundo botónti<strong>en</strong>e <strong>de</strong>finido <strong>de</strong> forma análoga que se man<strong>de</strong> llamar la función <strong>de</strong>lRow.La función addRow hace lo sigui<strong>en</strong>te: primero obti<strong>en</strong>e el objeto <strong>de</strong> la tabla usando la funcióngetElem<strong>en</strong>tById. Ésta es una función <strong>de</strong>l DOM y nos permite obt<strong>en</strong>er cualquier elem<strong>en</strong>to,siempre y cuando t<strong>en</strong>gamos su i<strong>de</strong>ntificador (<strong>en</strong> la página, al <strong>de</strong>finir la tabla usamos el atributoid).Después, obti<strong>en</strong>e cuántos r<strong>en</strong>glones ti<strong>en</strong>e la página e inserta un nuevo r<strong>en</strong>glón al final; losr<strong>en</strong>glones se numeran a partir <strong>de</strong>l 0, por lo que si hay n r<strong>en</strong>glones están numerados <strong>de</strong> 0 a n − 1.Después aña<strong>de</strong> dos celdas al r<strong>en</strong>glón y <strong>de</strong>fine el código HTML <strong>de</strong> cada una <strong>de</strong> ellas.La función <strong>de</strong>lRow también obti<strong>en</strong>e el objeto <strong>de</strong> la tabla; si hay al m<strong>en</strong>os dos r<strong>en</strong>glones borrael último (esto es para no quedarnos con una tabla sin r<strong>en</strong>glones).Este ejemplo tan s<strong>en</strong>cillo permite ver el po<strong>de</strong>r que ti<strong>en</strong>e JavaScript: nos permite modificardinámicam<strong>en</strong>te el docum<strong>en</strong>to HTML y XML, y <strong>de</strong> esta forma interactuar con el usuario sin necesidad<strong>de</strong> comunicarnos con el servidor, porque todo ocurre <strong>de</strong>l lado <strong>de</strong>l cli<strong>en</strong>te (el navegador).Emacs ti<strong>en</strong>e soporte para manipular HTML, XML y XHTML, incluy<strong>en</strong>do validación utilizandoel DTD. Si planeas utilizar XHTML, sólo ti<strong>en</strong>es que añadir lo sigui<strong>en</strong>te al archivo∼/.emacs:( add−to− l i s t ’ auto −mo<strong>de</strong>− a l i s t ’ ( " \ \ . html \ \ ’ " . xml−mo<strong>de</strong> ) )Al abrir un docum<strong>en</strong>to con ext<strong>en</strong>sión .html, el modo XML se cargará automáticam<strong>en</strong>te. Paracargar el DTD <strong>de</strong>finido <strong>en</strong> el tipo <strong>de</strong> docum<strong>en</strong>to, sólo hay que oprimir C–c C–p ; lo validasusando el comando C–c C–v . Para <strong>de</strong>finir el programa externo para validar pue<strong>de</strong>s añadir losigui<strong>en</strong>te al archivo ∼/.emacs:( custom−s e t −v a r i a b l e s’ ( sgml−xml−v a l i d a t e −command " x m l l i n t −−v a l i d −−noout %s %s " ))Aquí se utiliza el programa xmllint, pero se pue<strong>de</strong> utilizar cualquier programa que vali<strong>de</strong> undocum<strong>en</strong>to XML contra su DTD.Si estás editando un docum<strong>en</strong>to XML, con C–c C–e aña<strong>de</strong>s un elem<strong>en</strong>to y Emacs se<strong>en</strong>cargará <strong>de</strong> sólo mostrar los elem<strong>en</strong>tos válidos (<strong>de</strong> acuerdo al DTD). Con el comando C–c/ cerrará cualquier etiqueta <strong>de</strong> inicio que siga abierta.


Herrami<strong>en</strong>tas para<strong>de</strong>sarrollo 88.1. Control <strong>de</strong> versionesEl control <strong>de</strong> versiones es el manejo <strong>de</strong> cambios a la información. Des<strong>de</strong> siempre este manejoha sido crítico para los programadores, ya que bu<strong>en</strong>a parte <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> sistemas involucrarealizar pequeños cambios y, al sigui<strong>en</strong>te día, <strong>de</strong>shacer dichos cambios. El control <strong>de</strong> versiones,sin embargo, va más allá <strong>de</strong>l mundo <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> software y ti<strong>en</strong>e aplicación <strong>en</strong> cualquiersituación don<strong>de</strong> se utilic<strong>en</strong> computadoras para manejar información <strong>de</strong> amnera colectiva y quecambia constantem<strong>en</strong>te.Exist<strong>en</strong> muchos sistemas <strong>de</strong> control <strong>de</strong> versiones, algunos propietarios y otros libres. Uno<strong>de</strong> los primeros sistemas <strong>de</strong> control <strong>de</strong> versiones y, sin lugar a dudas, el más utilizado es CVS.Este libro, por ejemplo, fué escrito utilizando el sistema <strong>de</strong> control <strong>de</strong> versiones subversion,que revisaremos <strong>en</strong> esta sección.8.1.1. subversionsubversion es un sistema <strong>de</strong> control <strong>de</strong> versiones abierto y libre. Esto significa que subversionmaneja archivos y directorios a través <strong>de</strong>l tiempo. Su forma <strong>de</strong> operar involucra un árbol<strong>de</strong> archivos <strong>en</strong> un repositorio c<strong>en</strong>tral. Este repositorio funciona como un servidor <strong>de</strong> archivosordinario, excepto que recuerda cada cambio que se realiza a los archivos y directorios. Esto tepermite recuperar versiones anteriores <strong>de</strong> los datos o examinar la historia <strong>de</strong> cómo éstos fueron


8.1 Control <strong>de</strong> versiones 257cambiando.subversion pue<strong>de</strong> acce<strong>de</strong>r a sus repositorios a través <strong>de</strong> re<strong>de</strong>s, lo que le permite ser utilizado<strong>en</strong> distintas computadoras. En este s<strong>en</strong>tido, la habilidad <strong>de</strong> t<strong>en</strong>er varias personas modificandoy trabajando sobre el mismo conjunto <strong>de</strong> datos, <strong>de</strong>s<strong>de</strong> sus respectivos lugares, mejora las posibilida<strong>de</strong>s<strong>de</strong> colaboración. Cada miembro <strong>de</strong>l equipo aporta al proyecto <strong>de</strong> manera directa, sinintermediarios y, dado que todo está etiquetado por versiones, no se corre el riesgo <strong>de</strong> sacrificarcalidad al no t<strong>en</strong>er un filtro <strong>de</strong> calidad, ya que si algún cambio reci<strong>en</strong>te es incorrecto, subversionpermite echar atrás los cambios realizados.subversion es una arquitectura cli<strong>en</strong>te-servidor. Dado que la instalación y configuración <strong>de</strong>servicios <strong>de</strong> red escapa el alcance <strong>de</strong> este libro, aquí hablaremos brevem<strong>en</strong>te <strong>de</strong> los aspectosrelativos al cli<strong>en</strong>te.8.1 Cli<strong>en</strong>tes gráficos para subversionExist<strong>en</strong> varios cli<strong>en</strong>tes gráficos para manejar tu copia local <strong>de</strong> subversion para KDE.Entre los más conocidos <strong>en</strong>contramos:k<strong>de</strong>svn Es una interfaz para subversion y, a difer<strong>en</strong>cia <strong>de</strong> otras herrami<strong>en</strong>tas, utilizadirectam<strong>en</strong>te un API <strong>en</strong> C <strong>de</strong>sarrollado por Rapid SVN, por lo que no revisa lasalida <strong>de</strong>l cli<strong>en</strong>te <strong>de</strong> subversion svn, sino que implem<strong>en</strong>ta un cli<strong>en</strong>te <strong>de</strong> subversion.ksvn Es una ext<strong>en</strong>sión para Konqueror que le permite manejar copias <strong>de</strong> trabajo <strong>de</strong>subversion.8.1.2. Introducción a subversionsubversion, CVS y otros sistemas <strong>de</strong> control <strong>de</strong> versiones utilizan un mo<strong>de</strong>lo conocido comocopiar-modificar-intercalar. En este mo<strong>de</strong>lo, cada cli<strong>en</strong>te <strong>de</strong> usuario contacta al repositorio c<strong>en</strong>traly crea una copia <strong>de</strong> trabajo, que es un reflejo <strong>de</strong> los archivos y directorios <strong>en</strong> el repositorioc<strong>en</strong>tral. Los usuarios trabajan <strong>en</strong> paralelo, modificando sus copias privadas y, finalm<strong>en</strong>te, intercalansus copias <strong>en</strong> una versión final nueva. El sistema <strong>de</strong> control usualm<strong>en</strong>te asiste el proceso<strong>de</strong> intercalado, pero al final <strong>de</strong>l día es un humano el <strong>en</strong>cargado <strong>de</strong> que esto ocurra correctam<strong>en</strong>te.Exist<strong>en</strong> otros mo<strong>de</strong>los más s<strong>en</strong>cillos <strong>en</strong> el papel, pero con gran<strong>de</strong>s <strong>de</strong>sv<strong>en</strong>tajas a largo plazo.El mo<strong>de</strong>lo <strong>de</strong> copiar-modificar-intercalar pue<strong>de</strong> sonar un tanto caótico, pero <strong>en</strong> la práctica funcionamuy bi<strong>en</strong>. Increm<strong>en</strong>ta la productividad, ya que los usuarios pue<strong>de</strong>n trabajar <strong>en</strong> paralelo,sin esperar a los otros. Cuando trabajan <strong>en</strong> los mismos archivos, <strong>en</strong> g<strong>en</strong>eral, los cambios no se<strong>en</strong>ciman y los conflictos son poco frecu<strong>en</strong>tes y toma poco tiempo arreglarlos.A continuación te daremos una guía <strong>de</strong>l ciclo usual <strong>de</strong> <strong>de</strong>sarrollo cuando utilizas un sistema<strong>de</strong> control <strong>de</strong> versiones.


258 Herrami<strong>en</strong>tas para <strong>de</strong>sarrolloTu copia <strong>de</strong> trabajoUsualm<strong>en</strong>te comi<strong>en</strong>zas a utilizar subversion haci<strong>en</strong>do una copia local <strong>de</strong>l proyecto (checkout).Esta copia conti<strong>en</strong>e la última revisión <strong>de</strong> subversion, llamada HEAD.Obti<strong>en</strong>esd ls copiacon una línea como ésta:% svn checkout http://svn.collab.net/repos/svn/trunkObviam<strong>en</strong>te la liga cambia para reflejar el repositorio <strong>de</strong> tu proyecto y exist<strong>en</strong> diversos protocolospara especificarlo. Pue<strong>de</strong> ser vía http, como <strong>en</strong> el ejemplo, o vía el sistema <strong>de</strong> archivoslocal o a través <strong>de</strong> ssh. En este ejemplo, extraemos el directorio trunk <strong>de</strong>l proyecto, que g<strong>en</strong>eralm<strong>en</strong>teincluye todos los archivos y directorios, pero pue<strong>de</strong>s seleccionar rutas más <strong>de</strong>talladaspara obt<strong>en</strong>er ciertas partes <strong>de</strong>l proyecto.Una vez que ti<strong>en</strong>es una copia <strong>de</strong> trabajo, no ti<strong>en</strong>es nada más que esperar. Pue<strong>de</strong>s com<strong>en</strong>zara modificar esos archivos y directorios e iniciar el ciclo típico <strong>de</strong> trabajo.Ciclo <strong>de</strong> trabajo con subversionsubversion ti<strong>en</strong>e muchas características y opciones, pero <strong>en</strong> g<strong>en</strong>eral te <strong>en</strong>contrarás sigui<strong>en</strong>doel sigui<strong>en</strong>te ciclo <strong>de</strong> trabajo:1. Actualiza tu copia <strong>de</strong> trabajo:svn update2. Realiza algunos cambios:svn addsvn <strong>de</strong>letesvn copysvn move3. Revisa tus cambios:svn statussvn diffsvn revert4. Intercala los cambios <strong>de</strong> otros con tu copia:svn updatesvn resolved5. Finalm<strong>en</strong>te, compromete tus cambios al repositorio c<strong>en</strong>tral. No olvi<strong>de</strong>s acompañarlos conun com<strong>en</strong>tario intelig<strong>en</strong>te.svn commitEn la tabla 8.1 explicamos qué hac<strong>en</strong> los comandos más comunes <strong>de</strong> subversion:


8.2 Emacs 259Tabla 8.1subversion: comandos más importantesComandosvn addsvn updatesvn <strong>de</strong>letesvn copysvn movesvn statussvn diffsvn revertsvn updateDescripciónUsualm<strong>en</strong>te agregas directorios y archivos a tu copia local, realizas tu trabajo<strong>de</strong> edición y ev<strong>en</strong>tualm<strong>en</strong>te se los pres<strong>en</strong>tas a subversion con este comando.Con este comando pones tu copia local al día y subversion te avisa <strong>de</strong> cambios,uno por línea. Cada línea inicia con una letra que te indica algo:A Un nuevo archivo <strong>en</strong> tu copia.U Un archivo no sincronizado <strong>en</strong> tu copia, pero subversion lo actualizó <strong>en</strong>ella, no te preocupes.D Un archivo fue eliminado <strong>de</strong> tu copia.G Una archivo no sincronizado <strong>en</strong> tu copia, porque tú lo editaste <strong>en</strong> tu copialocal.C Un archivo no sincronizado <strong>en</strong> tu copia, pero subversion no pue<strong>de</strong> actualizarloporque hay conflictos que requier<strong>en</strong> tu interv<strong>en</strong>ción.Si un archivo o directorio ya no sirve, así lo borras y avisas a subversion.Si el nombre <strong>de</strong> un archivo es <strong>de</strong>safortunado, con este comando pue<strong>de</strong>s cambiarel nombre <strong>de</strong>l archivo sin per<strong>de</strong>r su historia.Con este comando pue<strong>de</strong>s mover un archivo o directorio a otro lugar <strong>en</strong> tucopia local y subversion se <strong>en</strong>carga <strong>de</strong> acompañarlo con su historia.Te muestra todos los cambios realizados <strong>en</strong> tu copia local con respecto a larevisión <strong>de</strong> la misma.Te muestra las difer<strong>en</strong>cias textuales <strong>en</strong> uno o varios archivos con respecto ala revisión <strong>de</strong> tu copia local.Te permite retroce<strong>de</strong>r a otra versión <strong>de</strong> un mismo archivo o directorio. Usualm<strong>en</strong>teutilizas este comando cuando quieres <strong>de</strong>scartar los cambios que realizaste<strong>en</strong> tu copia local.Sincroniza tu copia local con la versión especificada (por omisión, la másreci<strong>en</strong>te o HEAD) <strong>de</strong>l repositorio c<strong>en</strong>tral. Este comando requiere que puedasconectarte al servidor <strong>de</strong> subversion.svn resolved Una vez que has arreglado un conflicto, con este comando se lo indicas asubversion.svn commitUna vez que terminas tu trabajo <strong>de</strong> edición, has intercalado tus cambios yresuelto los conflictos, con este comando le indicas a subversion que integretodos tus cambios.Cuando <strong>en</strong>vías tus cambios ti<strong>en</strong>es que acompañarlos <strong>de</strong> un m<strong>en</strong>saje que <strong>de</strong>scribatus cambios. Si lo haces <strong>en</strong> la línea <strong>de</strong> comandos, ti<strong>en</strong>es que agregar laban<strong>de</strong>ra -m seguida <strong>de</strong>l m<strong>en</strong>saje <strong>en</strong>tre comillas.Como ya m<strong>en</strong>cionamos, subversion ofrece una plétora <strong>de</strong> comandos y opciones más, peroel ciclo que hemos pres<strong>en</strong>tado es el más común.


260 Herrami<strong>en</strong>tas para <strong>de</strong>sarrollo8.2. Emacs¿Ya m<strong>en</strong>cionamos que Emacs es un editor para programadores hecho por programadores?En esta sección te <strong>de</strong>mostramos por qué esto es cierto, ya que revisaremos uno <strong>de</strong> los mássofisticados modos para programar <strong>en</strong> Java que exist<strong>en</strong>, JDEE, que son siglas <strong>en</strong> inglés <strong>de</strong> JavaDevelopm<strong>en</strong>t Environm<strong>en</strong>t for Emacs .8.2.1. JDEEAunque hacemos una cobertura parcial <strong>de</strong> JDEE, esta sección supone que estás familiarizadotanto con Emacs como con el l<strong>en</strong>guaje <strong>de</strong> programación Java.JDEE permite conectar a Emacs con aplicaciones para <strong>de</strong>sarrollo <strong>de</strong> terceros, tales comolas que provee Sun Microsystems como parte <strong>de</strong> JDK. El resultado es un ambi<strong>en</strong>te integrado <strong>de</strong><strong>de</strong>sarrollo, también conocido como IDE, por sus siglas <strong>en</strong> inglés. Exist<strong>en</strong> <strong>en</strong> el mercado muchosIDE comerciales para <strong>de</strong>sarrollar <strong>en</strong> Java, como Netbeans o Eclipse; JDEE está a la altura <strong>de</strong>éstos. Entre sus características más importantes se <strong>en</strong>cu<strong>en</strong>tran:Instalando JDEE$ smartinstallsun-java5-jdkEditar código con resaltado <strong>de</strong> sintaxis y sangrías automáticas.Completar <strong>de</strong> manera automática campos y métodos <strong>de</strong> clases.Compilar con brincos automáticos <strong>de</strong> m<strong>en</strong>sajes <strong>de</strong> error a la línea <strong>de</strong> código responsable.G<strong>en</strong>erar esqueletos <strong>de</strong> clases y métodos <strong>de</strong> manera automática.Ejecutar aplicaciones java <strong>en</strong> un buffer <strong>de</strong> Emacs <strong>de</strong> manera interactiva.Integrar un <strong>de</strong>purador con un buffer para comandos interactivos y <strong>de</strong>splegar <strong>de</strong> maneraautomática el archivo/línea mi<strong>en</strong>tras recorres el código.Posibilidad <strong>de</strong> navegar la docum<strong>en</strong>tación <strong>de</strong> JDK utilizando el navegador <strong>de</strong> tu elección.Navegar a través <strong>de</strong>l código utilizando las herrami<strong>en</strong>tas etags <strong>de</strong> Emacs o bi<strong>en</strong> las estructuras<strong>de</strong> árbol provistas por otra ext<strong>en</strong>sión <strong>de</strong> Emacs, speedbar.Antes <strong>de</strong> po<strong>de</strong>r utilizar JDEE con Emacs <strong>de</strong>bes instalar una serie <strong>de</strong> ext<strong>en</strong>siones y aplicaciones.A<strong>de</strong>más, por supuesto, <strong>de</strong>bes contar <strong>en</strong> tu sistema con una implem<strong>en</strong>tación <strong>de</strong> Java; aquísuponemos que ya está instalado JDK.JDEE no es parte estándar <strong>de</strong> Emacs y utiliza otras herrami<strong>en</strong>tas que no lo son tampoco.Estas herrami<strong>en</strong>tas son:CEDET: <strong>en</strong> inglés, Collection of Emacs Developm<strong>en</strong>t Enviromn<strong>en</strong>t Tools, que es un proyectoque incluye varios paquetes individuales:EIEIO - capa CLOS para Emacs Lisp.


8.2 Emacs 261Semantic - Infraestructura para parsear <strong>en</strong> Emacs.Speedbar - Navegador <strong>de</strong>. . . cualquier cosa.EDE - Manejador <strong>de</strong> archivos y g<strong>en</strong>erador <strong>de</strong> Makefile.COGRE - Connected Graph Editor.Una vez que obti<strong>en</strong>es e instalas la última versión, <strong>de</strong>bes agregar lo sigui<strong>en</strong>te a tu ∼/.emacs:( load −f i l e " ~ / e l i s p / c e d e t / common / c e d e t . e l " )( semantic −load −<strong>en</strong>able −co<strong>de</strong>−h e l p e r s )ELIB: Es una biblioteca estándar para programar <strong>en</strong> Emacs Lisp. Ti<strong>en</strong>e código para:Estructuras <strong>de</strong> datos (colas, pilas, árboles AVL y otras).Funciones para manejo <strong>de</strong> ca<strong>de</strong>nas no incluidas <strong>en</strong> Emacs estándar.Funciones para manejo <strong>de</strong>l mini-buffer no incluidas <strong>en</strong> Emacs estándar.Rutinas para manejar listas <strong>de</strong> galletas (cookies) <strong>en</strong> un buffer.Una vez que obti<strong>en</strong>es e instalas la última versión, <strong>de</strong>bes agregar lo sigui<strong>en</strong>te a tu ∼/.emacspara que JDEE lo <strong>en</strong>cu<strong>en</strong>tre:( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / e l i b " ) )JDEE: Finalm<strong>en</strong>te estamos listos para JDEE, que sigue una ruta similar a las ext<strong>en</strong>siones anterioresy <strong>de</strong>bes poner lo sigui<strong>en</strong>te <strong>en</strong> tu ∼/.emacs( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / j d e / l i s p " ) )( r e q u i r e ’ j d e )A partir <strong>de</strong> este mom<strong>en</strong>to cada vez que visites un archivo relacionado con un proyecto oprograma Java, JDEE proveerá sus controles para apoyarte <strong>en</strong> tu sesión <strong>de</strong> <strong>de</strong>sarrollo.Registro y selección <strong>de</strong> JDKJDEE <strong>de</strong>scansa <strong>en</strong> herrami<strong>en</strong>tas <strong>de</strong> <strong>de</strong>sarrollo Java que funcion<strong>en</strong> <strong>en</strong> la línea <strong>de</strong> comandos,como las que ofrece Sun Microsystems como parte <strong>de</strong>l Java 2 Software Developm<strong>en</strong>t Kit (SDK),también conocido como Java Developm<strong>en</strong>t Kit (JDK). Así que antes que puedas utilizar JDEEpara compilar, <strong>de</strong>purar o ejecutar aplicaciones, <strong>de</strong>bes indicarle dón<strong>de</strong> viv<strong>en</strong> las herrami<strong>en</strong>tasa<strong>de</strong>cuadas.Por omisión JDEE supone que el compilador, <strong>de</strong>purador y máquina virtual <strong>de</strong> java se llamanjavac, jdb y java respectivam<strong>en</strong>te y que están <strong>en</strong> un directorio <strong>de</strong> la variable <strong>de</strong> ambi<strong>en</strong>te PATH.En la mayoría <strong>de</strong> los sistemas <strong>Linux</strong> mo<strong>de</strong>rnos, las instalaciones <strong>de</strong> Java se localizan <strong>en</strong> sitiosestándar, por lo que JDEE <strong>de</strong>be funcionar perfectam<strong>en</strong>te.En caso <strong>de</strong> que t<strong>en</strong>gas varias versiones <strong>de</strong> JDK instaladas y quieras registrarlas, ti<strong>en</strong>es querealizar los sigui<strong>en</strong>tes pasos:1. M-x customize-variable;2. teclea j<strong>de</strong>-jdk-registry;


262 Herrami<strong>en</strong>tas para <strong>de</strong>sarrollo3. haz click <strong>en</strong> el botón INS;4. teclea el número <strong>de</strong> versión <strong>de</strong> JDK y la ruta al directorio don<strong>de</strong> está instalado;5. repite este procedimi<strong>en</strong>to para todas las versiones <strong>de</strong> JDK <strong>en</strong> tu sistema;6. haz click <strong>en</strong> el botón State; y7. a continuación selecciona Save for Future Sessions.A continuación <strong>de</strong>bes seleccionar un JDK:1. M-x customize-variable;2. teclea j<strong>de</strong>-jdk y verás un buffer con todos los JDK que registraste arriba;3. haz click <strong>en</strong> el botón junto a la versión que <strong>de</strong>seas utilizar;4. haz click <strong>en</strong> el botón State;5. y a continuación selecciona Save for Future Sessions;6. selecciona el botón Finish para <strong>de</strong>shacerte <strong>de</strong>l buffer.Editando archivos fu<strong>en</strong>te <strong>de</strong> JavaPara editar un archivo exist<strong>en</strong>te con código Java, carga <strong>en</strong> un buffer <strong>de</strong> Emacs el archivocon C-x C-f . Al hacer esto, Emacs asignará el modo j<strong>de</strong>-mo<strong>de</strong> al buffer <strong>de</strong> edición. Estemodo exti<strong>en</strong><strong>de</strong> los modos estándar <strong>de</strong> Emacs: java-mo<strong>de</strong> y cc-mo<strong>de</strong>, agregando una serie <strong>de</strong>comandos para compilar, construir, ejecutar y <strong>de</strong>purar archivos fu<strong>en</strong>te <strong>de</strong> Java.A<strong>de</strong>más <strong>de</strong> esto, JDEE provee un soporte completo para g<strong>en</strong>erar docum<strong>en</strong>tación <strong>en</strong> formatoHTML para las clases java, a partir <strong>de</strong> com<strong>en</strong>tarios <strong>en</strong> el código fu<strong>en</strong>te.Para insertar el esqueleto <strong>de</strong> un com<strong>en</strong>tario javadoc para una clase o método <strong>en</strong> tu programafu<strong>en</strong>te, posiciona el punto <strong>en</strong> la primera línea <strong>de</strong>l método o clase y ejecuta el comando:C-c C-v j (j<strong>de</strong>-javadoc-autodoc-at-line). Por ejemplo, supongamos que t<strong>en</strong>emos una claseque luce así:p u b l i c c l a s s MiClasee x t e n d s MiSuperClase implem<strong>en</strong>ts 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 <strong>de</strong> la palabra reservada public. Cuando ejecutas C-c C-v j , JDEEinsertará lo sigui<strong>en</strong>te:/ ∗ ∗∗ D e s c r i b e c l a s s MiClase h e r e .∗∗ @author Juan Doe ∗ @version 1 . 0∗ /p u b l i c c l a s s MiClasee x t e n d s MiSuperClase implem<strong>en</strong>ts Runnable , j a v a . i o . S e r i a l i z a b l e{. . .


8.2 Emacs 263Para g<strong>en</strong>erar la docum<strong>en</strong>tación <strong>de</strong>l proyecto actual pue<strong>de</strong>s abrir cualquier archivo fu<strong>en</strong>te <strong>de</strong>lproyecto y ejecutar M-x j<strong>de</strong>-javadoc-make, lo que ejecuta el comando javadoc <strong>de</strong> JDK parag<strong>en</strong>erar la docum<strong>en</strong>tación.AbreviaturasTabla 8.2JDEE te permite utilizar abreviaturas para algunas palabras clave y estructuras <strong>de</strong> control<strong>de</strong> java. A continuación te mostramos como utilizarlas.Cuando escribes una <strong>de</strong> las abreviaturas <strong>de</strong>finidas, seguidas <strong>de</strong> un espacio <strong>en</strong> blanco, JDEElas expan<strong>de</strong> <strong>en</strong> el buffer, siempre y cuando el modo <strong>de</strong> abreviaturas esté activado. Para activar/-<strong>de</strong>sactivar este modo <strong>de</strong>bes cambiar el valor <strong>de</strong> la variable j<strong>de</strong>−<strong>en</strong>able−abbrev−mo<strong>de</strong>.Esta ext<strong>en</strong>sión <strong>de</strong> JDEE está basada <strong>en</strong> abbrev-mo<strong>de</strong> <strong>de</strong> Emacs, que es un sistema parag<strong>en</strong>erar abreviaturas g<strong>en</strong>erales.D<strong>en</strong>tro <strong>de</strong> las abreviaturas más comunes <strong>en</strong>contrarás las que ti<strong>en</strong><strong>en</strong> que ver con estructuras<strong>de</strong> control, por ejemplo, if-th<strong>en</strong>-else. Cuando escribes una <strong>de</strong> estas abreviaturas seguida <strong>de</strong>espacio, JDEE la expan<strong>de</strong> al esqueleto <strong>de</strong> la estructura <strong>de</strong> control correspondi<strong>en</strong>te.Por ejemplo, ife se expan<strong>de</strong> a if () { } else { }. Aquí están algunas más <strong>de</strong> las abreviaturaspre<strong>de</strong>finidas:JDEE: abreviaturas <strong>de</strong> estructuras <strong>de</strong> controlAbreviaturaififeforiforitermaintryfEnunciadoif-th<strong>en</strong>if-th<strong>en</strong>-elsefor (int I=0;I


264 Herrami<strong>en</strong>tas para <strong>de</strong>sarrolloTabla 8.3Enter cierre las llaves al final <strong>de</strong> la línea. Para habilitar este modo <strong>de</strong>bes cambiar el valor <strong>de</strong>la variable j<strong>de</strong>-electric-return-p.JDEE: formas para completar campos y métodosComandoDescripciónj<strong>de</strong>-complete ( C–c C–v c ) Éste es el comando estándar <strong>de</strong> JDEE y le<strong>de</strong>ja la tarea <strong>de</strong> completar a otro <strong>de</strong> los comandos para completar.j<strong>de</strong>-complete-in-line ( C–c C–v . ). Este comando utiliza la primera opción que<strong>en</strong>cu<strong>en</strong>tra para completar. Si hay más <strong>de</strong> una opción, te permiterecorrerlas, cada una <strong>de</strong> éstas sustituye a la anterior <strong>en</strong> elbuffer.j<strong>de</strong>-complete-m<strong>en</strong>uj<strong>de</strong>-complete-minibufEste comando <strong>de</strong>spliega todas las posibilida<strong>de</strong>s <strong>en</strong> un m<strong>en</strong>ú eintroduce al buffer la que tú selecciones.Este comando utiliza el mini-buffer para <strong>de</strong>splegar las posibilida<strong>de</strong>se introduce al buffer la que tú selecciones.G<strong>en</strong>eración <strong>de</strong> códigoTabla 8.4JDEE provee mecanismos para g<strong>en</strong>eración <strong>de</strong> código. Los hay <strong>de</strong> dos tipos: wizards ybasados <strong>en</strong> patrones. También ofrece comandos para expandir paquetes (j<strong>de</strong>-import-expandimports).JDEE: <strong>en</strong>unciados importEnlaceC-c C-v C-zC-c C-v zDescripción(j<strong>de</strong>-import-find-and-import) g<strong>en</strong>era un <strong>en</strong>unciado import para laclase <strong>en</strong> el punto. Inserta el <strong>en</strong>unciado <strong>en</strong> la cabeza <strong>de</strong>l buffer.(j<strong>de</strong>-import-all) importa todas las clases que son requeridas <strong>en</strong> elbuffer actual.Los comandos para importar te permit<strong>en</strong> convertir un <strong>en</strong>unciado como:i m p o r tj a v a . i o . ∗<strong>en</strong> los sigui<strong>en</strong>tes:i m p o r t j a v a . i o . B u f f e r e d R e a d e r ;i m p o r t j a v a . i o . I n p u t S t r e a m R e a d e r ;i m p o r t j a v a . i o . IOException ;


8.2 Emacs 265y viceversa (j<strong>de</strong>-import-collapse-imports). JDEE a<strong>de</strong>más incluye el comando j<strong>de</strong>-importorganizeque acumula los <strong>en</strong>unciados import <strong>de</strong>l buffer <strong>en</strong> dos bloques, uno que conti<strong>en</strong>e todoslos java y javax y <strong>de</strong>spués <strong>de</strong> una linea <strong>en</strong> blanco, todos los <strong>de</strong>más. D<strong>en</strong>tro <strong>de</strong> cada bloqueor<strong>de</strong>na alfabéticam<strong>en</strong>te, por ejemplo:i m p o r t j a v a . i o . I n p u t S t r e a m R e a d e r ;i m p o r t j a v a . u t i l . H a s h t a b l e ;i m p o r t j a v a x . swing . JFrame ;i m p o r t j a v a x . swing . J P a n e l ;i m p o r t jmath . L i n e a r S y s t e m ;i m p o r t jmath . T e s t ;Finalm<strong>en</strong>te, con j<strong>de</strong>-import-kill-extra-imports borras los import que no son necesarios.Tabla 8.5JDEE incluye a<strong>de</strong>más una serie <strong>de</strong> g<strong>en</strong>eradores <strong>de</strong> código o wizards, que se muestran <strong>en</strong> latabla 8.5.JDEE: g<strong>en</strong>eradores <strong>de</strong> código, wizardsWizardSobrecarga <strong>de</strong> operadoresInterfazDelegadoClase abstractaGet/SetDescripción(j<strong>de</strong>-wiz-overri<strong>de</strong>d-method). Un método que sobrecargaotro heredado por la clase don<strong>de</strong> está el punto.(j<strong>de</strong>-wiz-implem<strong>en</strong>t-interface). Implem<strong>en</strong>tación <strong>de</strong> una interfaz<strong>en</strong> la clase que conti<strong>en</strong>e al punto.Métodos que <strong>de</strong>legan tareas a una clase específica.Implem<strong>en</strong>tación <strong>de</strong> los métodos heredados <strong>de</strong> una clase abstractapor la clase que conti<strong>en</strong>e al punto.(j<strong>de</strong>-wiz-get-set-methods) Métodos get y set para los camposprivados <strong>de</strong> la clase que conti<strong>en</strong>e al punto.Exist<strong>en</strong> otras maneras <strong>de</strong> g<strong>en</strong>erar código, como clases patrón vacías, pero éstas no ti<strong>en</strong><strong>en</strong>un único comando asociado y <strong>de</strong>bes ejecutarlas <strong>de</strong>s<strong>de</strong> el m<strong>en</strong>ú <strong>de</strong> JDE. Por ejemplo, para crearun buffer con una clase pública g<strong>en</strong>érica <strong>de</strong> Java, pue<strong>de</strong>s utilizar Files ⇒ JDE New ⇒ Class.Compilando programas JavaPara compilar <strong>de</strong>bes ejecutar C-c C-v C-c (j<strong>de</strong>-compile), lo que ejecutará el comandojavac <strong>en</strong> el buffer actual y el resultado aparecerá <strong>en</strong> un nuevo buffer <strong>de</strong> compilación.Si ya existía un buffer <strong>de</strong> compilación, el comando reutilizará el buffer; si no, creará unonuevo. Por omisión, si no exist<strong>en</strong> errores <strong>en</strong> la compilación, JDEE borra el buffer <strong>de</strong> compilacióndos (2) segundos <strong>de</strong>spués <strong>de</strong> terminada la compilación.El modo mayor <strong>de</strong> este buffer es compilation-mo<strong>de</strong>, que te permite moverte rápidam<strong>en</strong>tea la fu<strong>en</strong>te <strong>de</strong> cada error, simplem<strong>en</strong>te haci<strong>en</strong>do click o presionando Enter <strong>en</strong> el buffer <strong>de</strong>compilación.


266 Herrami<strong>en</strong>tas para <strong>de</strong>sarrolloJDEE utiliza una serie <strong>de</strong> variables para controlar la manera <strong>de</strong> compilar tu programa; paracambiar la forma estándar <strong>de</strong>bes utilizar la secu<strong>en</strong>cia <strong>de</strong> m<strong>en</strong>ús y subm<strong>en</strong>ús <strong>de</strong> JDEE: JDE ⇒Options ⇒ Compile.Si utilizas JDE ⇒ Build, <strong>en</strong>tonces JDEE llamará un programa para construir tu aplicación.Por omisión utiliza el comando make <strong>de</strong> <strong>Linux</strong>, pero pue<strong>de</strong>s configurarlo para que utilice laherrami<strong>en</strong>ta <strong>de</strong> compilación Ant, <strong>de</strong>l grupo Apache, o una función especial que tú <strong>de</strong>finas. Lasfunciones pre<strong>de</strong>finidas son: j<strong>de</strong>-make y j<strong>de</strong>-ant-build y, para utilizar Ant, utiliza lo sigui<strong>en</strong>te<strong>en</strong> tu ∼/.emacs:( s e t q j<strong>de</strong> −b u i l d −f u n c t i o n ’ ( j<strong>de</strong> −ant −b u i l d ) )Exist<strong>en</strong> muchas variables para controlar el comportami<strong>en</strong>to tanto <strong>de</strong> make, como <strong>de</strong> Ant,aunque <strong>en</strong> la mayoría <strong>de</strong> las distribuciones <strong>de</strong> <strong>Linux</strong> no <strong>de</strong>be ser necesario que cambies losvalores por omisión <strong>de</strong> estas variables.Ejecución <strong>de</strong> aplicación JavaJDEE te permite ejecutar tus aplicaciones Java <strong>de</strong>s<strong>de</strong> un subproceso <strong>de</strong> Emacs. Pue<strong>de</strong>sejecutar varias aplicaciones <strong>de</strong> manera concurr<strong>en</strong>te, pero sólo un ejemplar <strong>de</strong> cada aplicación<strong>en</strong> un mom<strong>en</strong>to dado. JDEE te mostrará tanto la salida como el error estándar <strong>de</strong> tu aplicación<strong>en</strong> un buffer <strong>de</strong> Emacs y, a través <strong>de</strong> estos buffers, pue<strong>de</strong>s interactuar con la aplicación si éstaes interactiva.Para ejecutar la aplicación utiliza C-c C-v C-r (j<strong>de</strong>-run).Por omisión <strong>en</strong> JDEE, el comando para ejecutar aplicaciones supone que la clase <strong>en</strong> el bufferactual conti<strong>en</strong>e el método main <strong>de</strong> tu programa. Si éste no es el caso, ti<strong>en</strong>es que indicarle cuáles la clase principal, asignando el nombre a<strong>de</strong>cuado a la variable j<strong>de</strong>−run−application−class.Con la variable j<strong>de</strong>−run−working−directory pue<strong>de</strong>s indicarle un directorio distinto al actualpara ejecutar tu aplicación.Navegando excepcionesSi ocurr<strong>en</strong> excepciones durante la ejecución <strong>de</strong> tu programa, la máquina virtual <strong>en</strong>tregacomo salida un registro <strong>de</strong> excepción. Este registro aparece <strong>en</strong> el buffer <strong>de</strong> ejecución. Para verla línea <strong>de</strong> código correspondi<strong>en</strong>te a un punto <strong>en</strong> el registro <strong>de</strong> excepción, pue<strong>de</strong>s hacerlo con elbotón <strong>de</strong>recho <strong>de</strong>l ratón.Para navegar el registro <strong>de</strong> excepción hay dos combinaciones <strong>de</strong> teclas: C-c C-v C-[ yC-c C-v C-] .JDEE ofrece un excel<strong>en</strong>te soporte para trabajar con applets, pero por razones <strong>de</strong> espacio nolo cubriremos <strong>en</strong> este libro.Depurando aplicacionesJDEE ofrece dos opciones para <strong>de</strong>purar aplicaciones Java:


8.2 Emacs 267Una interfaz <strong>en</strong> Emacs para jdb, el <strong>de</strong>purador <strong>en</strong> línea <strong>de</strong> comandos que se distribuye conJDK.JDEbug, un <strong>de</strong>purador <strong>de</strong>sarrollado específicam<strong>en</strong>te para ser utilizado con JDE.JDEbug ofrece mejores características para <strong>de</strong>purar, pero requiere JDK 1.2 o más reci<strong>en</strong>te,por lo que si tu aplicación utiliza una versión anterior, sólo podrás utilizar jdb. En este trabajorevisamos exclusivam<strong>en</strong>te JDEbug.JDEbug te permite ejecutar un programa Java paso por paso y <strong>de</strong>spliega y modifica elestado interno <strong>de</strong>l programa. Entre sus características principales contamos:Depuración a nivel <strong>de</strong> fu<strong>en</strong>te. JDEbug manti<strong>en</strong>e un apuntador a la linea <strong>de</strong> código que seestá ejecutando conforme avanzas. Te permite a<strong>de</strong>más asignar puntos <strong>de</strong> evaluación <strong>en</strong> losbuffers fu<strong>en</strong>te.Despliega <strong>de</strong> manera automáticas el valor <strong>de</strong> las variables.Navegador <strong>de</strong> objetos. Pue<strong>de</strong>s expandir el <strong>de</strong>spliegue <strong>de</strong> la variable local para mostrar loscampos <strong>de</strong>l objeto a cualquier nivel <strong>de</strong> profundidad.Te permite navegar la pila <strong>de</strong> ejecución.Pue<strong>de</strong>s <strong>de</strong>purar varios procesos simultáneam<strong>en</strong>te <strong>en</strong> la misma sesión.Evaluación <strong>de</strong> expresiones. Pue<strong>de</strong>s evaluar cualquier expresión que sea válida <strong>en</strong> el puntoactual <strong>de</strong> susp<strong>en</strong>sión.Por omisión JDEE está configurado para ofrecerte una interfaz <strong>de</strong> jdb, por lo que <strong>de</strong>besindicarle que <strong>de</strong>seas utilizar JDEbug. Esto lo logramos asignando el valor JDEbug a la variablej<strong>de</strong>−<strong>de</strong>bugger:( s e t q j<strong>de</strong> −<strong>de</strong>bugger ’ ( " \ command{JDEbug } " ) )JDEbug se apoya <strong>en</strong> la biblioteca JPDA, que <strong>en</strong> <strong>Linux</strong> se distribuye como parte <strong>de</strong> JDK,por lo que no es necesario hacer nada más.Iniciando el <strong>de</strong>puradorPara iniciar el <strong>de</strong>purador selecciona Processes ⇒ Debugger <strong>de</strong>l m<strong>en</strong>ú <strong>de</strong> JDEbug, conlo que se inicia la ejecución <strong>de</strong>l <strong>de</strong>purador. Para <strong>de</strong>purar una aplicación <strong>de</strong>bes:Iniciar la aplicación <strong>de</strong>ntro <strong>de</strong>l <strong>de</strong>purador. A<strong>de</strong>lante te <strong>de</strong>cimos cómo.Añadir el <strong>de</strong>purador a tu aplicación si es que ésta fue ejecutada fuera <strong>de</strong>l <strong>de</strong>purador.Poner el <strong>de</strong>purador <strong>en</strong> modo <strong>de</strong> escucha e iniciar la aplicación fuera <strong>de</strong> éste.Es muy importante que cuando hayas terminado <strong>de</strong> utilizar el <strong>de</strong>purador, termines su ejecuciónseleccionando Exit Debugger <strong>de</strong>l m<strong>en</strong>ú JDEbug. De otra manera, aun cuando termines laejecución <strong>de</strong> Emacs, pue<strong>de</strong>n quedarse procesos (máquinas virtuales) huérfanos ejecutados porel <strong>de</strong>purador.


268 Herrami<strong>en</strong>tas para <strong>de</strong>sarrolloIniciando procesos8.2.2. psvnJDEbug provee dos comandos para iniciar procesos:1. JDEbug ⇒ Processes ⇒ Launch Process, que ejecuta un ejemplar <strong>de</strong> la aplicaciónseñalada por j<strong>de</strong>-run-application-class y, <strong>en</strong> caso <strong>de</strong> que su valor sea nil , la aplicacióncorrespondi<strong>en</strong>te a la <strong>de</strong>l buffer actual <strong>de</strong> java.2. JDE ⇒ Debug App; este comando realiza las sigui<strong>en</strong>tes acciones:a) Inicia el <strong>de</strong>purador <strong>de</strong> ser necesario.b) Lanza la aplicación.c) Asigna todos los puntos <strong>de</strong> revisión que hayas especificado con anterioridad.d) Ejecuta la aplicación.Nota: si no asignaste ningún punto <strong>de</strong> revisión, la aplicación será ejecutada sin interrupciónhasta terminar.Cualquiera <strong>de</strong> estos comandos que ejecutes, dividirá la pantalla <strong>de</strong> Emacs <strong>en</strong> dos y <strong>de</strong>splegaráuna nueva v<strong>en</strong>tana para las variables locales.La pantalla superior <strong>de</strong> Emacs muestra el código fu<strong>en</strong>te, la sigui<strong>en</strong>te muestra el buffer fu<strong>en</strong>teo el archivo don<strong>de</strong> pusiste puntos <strong>de</strong> revisión y, finalm<strong>en</strong>te, la v<strong>en</strong>tana <strong>de</strong>l fondo muestra losm<strong>en</strong>sajes <strong>de</strong>l <strong>de</strong>purador para el proceso recién lanzado.En este mom<strong>en</strong>to, si el proceso fué iniciado exitosam<strong>en</strong>te y no se se ha ejecutado hastaterminar, pue<strong>de</strong>s <strong>de</strong>purar la aplicación.8.1 PCL-CVS fr<strong>en</strong>te para CVSOtro modo muy importante para controlar versiones es PCL-CVS, que es parte estándar<strong>de</strong> Emacs. Este modo sirve como fr<strong>en</strong>te para manejar proyectos a través <strong>de</strong> CVS.CVS es el sistema controlador <strong>de</strong> versiones por omisión. Fue uno <strong>de</strong> los primeros sistemasutilizados y, probablem<strong>en</strong>te, aun hoy día sea el más utilizado <strong>en</strong> el mundo <strong>de</strong>lsoftware libre. Sin embargo, <strong>en</strong> nuestra opinión, subversion es un sistema más versátily ti<strong>en</strong>e varias v<strong>en</strong>tajas sobre CVS.Este sistema es una interfaz para el control <strong>de</strong> versiones subversion (ver la sección 8.1.1);sin embargo, psvn.el no es parte estándar <strong>de</strong> Emacs por lo que ti<strong>en</strong>es que <strong>de</strong>scargarlo e instalarlo,sigui<strong>en</strong>do las instrucciones <strong>en</strong> la sección 4.3.18 y agregar lo sigui<strong>en</strong>te a tu ∼/.emacs:( r e q u i r e ’ psvn )Una vez cargado el programa, pue<strong>de</strong>s ejecutarlo con M-x svn-status; te preguntará <strong>en</strong>el mini-buffer por el directorio con tu copia <strong>de</strong> trabajo. Por omisión te mostrará el directorio


8.2 Emacs 269Tabla 8.6<strong>de</strong>l archivo actual. Este comando ejecuta svn status <strong>en</strong> el directorio que tecleaste y te muestraun buffer con el resultado que, como notarás, se parece mucho a la salida <strong>de</strong>l comando <strong>en</strong> unaterminal, pero a difer<strong>en</strong>cia <strong>de</strong> ésta, <strong>en</strong> este buffer cu<strong>en</strong>tas con una serie <strong>de</strong> <strong>en</strong>laces <strong>de</strong> teclas paraejecutar rápida y cómodam<strong>en</strong>te comandos <strong>de</strong> subversion.Emacs: comandos <strong>de</strong> psvnEnlace↑ , p , C-p↓ , n , C-nEnterxUaRDCr=cmuDescripción(svn-status-previous-line) Te lleva a la línea anterior.(svn-status-next-line) Te lleva a la sigui<strong>en</strong>te línea.(svn-status-find-file-or-examin-directory) Abre el archivo (directorio) <strong>en</strong>la línea actual.(svn-status-update-buffer) Actualiza la vista <strong>en</strong> el buffer con respecto a turevisión local.(svn-status-update-cmd Ejecuta svn update <strong>en</strong> el directorio actual.(svn-status-add-file) Aña<strong>de</strong> el archivo al repositorio.(svn-status-mv) Ejecuta el comando svn move <strong>en</strong> el archivo (directorio)actual.(svn-status-rm) Ejecuta el comando svn <strong>de</strong>lete <strong>en</strong> el archivo (directorio)actual.(svn-status-cp) Ejecuta el comando svn copy <strong>en</strong> el archivo (directorio)actual.(svn-status-revert) Ejecuta el comando svn revert <strong>en</strong> el archivo actual.(svn-status-show-svn-diff) Ejecuta el comando svn diff <strong>de</strong>l archivo (directorio)actual con la versión <strong>de</strong> la revisión <strong>en</strong> tu copia <strong>de</strong> trabajo.(svn-status-commit) Compromete el cambio <strong>en</strong> el archivo (directorio) conel repositorio actual.(svn-status-set-user-mark) Pone una marca <strong>en</strong> el archivo o directorio. Estote permite poner marcas a varios archivos y el sigui<strong>en</strong>te comando se ejecutarásobre todos los archivos marcados. Por ejemplo, añadirlos, borrarlos,comprometer los cambios y otros.(svn-status-unset-user-mark) Elimina la marca <strong>de</strong>l archivo (directorio) <strong>en</strong>la línea actual.


Ext<strong>en</strong>di<strong>en</strong>do tuambi<strong>en</strong>te 9La capacidad <strong>de</strong> ext<strong>en</strong><strong>de</strong>r y acoplar el sistema a tus necesida<strong>de</strong>s es una <strong>de</strong> las principalescaracterísticas <strong>de</strong> UNIX <strong>en</strong> g<strong>en</strong>eral. <strong>Linux</strong>, por supuesto, hereda esta característica y <strong>en</strong> estecapítulo te mostraremos una <strong>de</strong> las formas más po<strong>de</strong>rosas <strong>de</strong> ext<strong>en</strong><strong>de</strong>r tu ambi<strong>en</strong>te con laprogramación <strong>en</strong> shell.También te mostramos cómo ext<strong>en</strong><strong>de</strong>r Emacs a través <strong>de</strong> su l<strong>en</strong>guaje <strong>de</strong> programación <strong>de</strong>ext<strong>en</strong>sión, Emacs-Lisp. De hecho, la gran mayoría <strong>de</strong> subsistemas y paquetes para ext<strong>en</strong><strong>de</strong>rEmacs que revisamos <strong>en</strong> este libro, por ejemplo JDEE (sección 8.2.1) o ERC ( 5.15.4), son programasescritos <strong>en</strong> Emacs-Lisp. Entonces, lo que suce<strong>de</strong> cuando cargas uno <strong>de</strong> estos programas<strong>en</strong> Emacs, es que éste actúa como máquina virtual e interpreta (ejecuta) el programa.9.1. Programación <strong>en</strong> shellEl shell <strong>de</strong> UNIX cu<strong>en</strong>ta con una característica muy importante que es la capacidad <strong>de</strong> serprogramado. La programación <strong>de</strong>l shell se hace por medio <strong>de</strong> los llamados guiones <strong>de</strong> shell,los cuales básicam<strong>en</strong>te toman una serie <strong>de</strong> instrucciones y las ejecutan <strong>en</strong> un nuevo proceso <strong>de</strong>shell. Los guiones <strong>de</strong> shell son archivos que conti<strong>en</strong><strong>en</strong> instrucciones para el shell que llevan acabo una tarea específica, por ejemplo automatizar la <strong>en</strong>trega <strong>de</strong> ciertos correos a un grupo <strong>de</strong>personas, y <strong>en</strong> g<strong>en</strong>eral se utilizan para automatizar todo tipo <strong>de</strong> tareas.En un guión <strong>de</strong> shell las instrucciones se ejecutan una <strong>de</strong>spués <strong>de</strong> otra <strong>en</strong> el or<strong>de</strong>n dado porel guión. A<strong>de</strong>más <strong>de</strong> éstas, los guiones <strong>de</strong> shell también pue<strong>de</strong>n recibir parámetros <strong>de</strong> la mismamanera <strong>en</strong> que los programas lo hac<strong>en</strong>, pue<strong>de</strong>n <strong>de</strong>finir variables para guardar ciertos valores


272 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teque sean <strong>de</strong> interés para la ejecución <strong>de</strong>l programa y cu<strong>en</strong>tan con estructuras <strong>de</strong> control <strong>de</strong> flujo,algunas <strong>de</strong> las cuales veremos más a<strong>de</strong>lante.En un guión <strong>de</strong> shell también po<strong>de</strong>mos t<strong>en</strong>er com<strong>en</strong>tarios, que son m<strong>en</strong>sajes para los quelean el guión (<strong>en</strong> particular, nosotros mismos <strong>de</strong>spués <strong>de</strong> algún tiempo). Los com<strong>en</strong>tarios sonignorados por el shell al mom<strong>en</strong>to <strong>de</strong> ejecutar, así que no hac<strong>en</strong> daño y sirv<strong>en</strong> para dar mayorclaridad a nuestro guión <strong>de</strong> shell. Los com<strong>en</strong>tarios son todo lo que siga al carácter # hasta el fin<strong>de</strong> la línea.Los guiones <strong>de</strong> shell pue<strong>de</strong>n ser ejecutados <strong>de</strong> manera autónoma simplem<strong>en</strong>te cambiandolos permisos <strong>de</strong> ejecución y poni<strong>en</strong>do un com<strong>en</strong>tario especial <strong>en</strong> la primera línea <strong>de</strong>l archivo.Esta línea luce algo así #!/ bin/bash y le indica al shell que <strong>de</strong>be <strong>de</strong> usar el programa /bin/bashpara procesar el resto <strong>de</strong>l archivo.A continuación te mostramos un guión <strong>de</strong> shell muy s<strong>en</strong>cillo:#! / u s r / b i n / bashecho h o l a ;Actividad 9.1 Crea un guión <strong>de</strong> shell que ejecute un ls −la, lo redirija a un archivo llamadolistado . dir y <strong>de</strong>spliegue un m<strong>en</strong>saje al usuario, informándole <strong>de</strong> la creación <strong>de</strong> este archivo;da permisos <strong>de</strong> ejecución y ejecútalo un par <strong>de</strong> veces <strong>en</strong> directorios distintos.9.1.1. VariablesLos guiones <strong>de</strong> shell utilizan variables como almac<strong>en</strong>es para ciertos valores, por ejemploel m<strong>en</strong>saje a <strong>de</strong>splegar o los nombres <strong>de</strong> los archivos a borrar. Para las variables se utilizanpalabras formadas únicam<strong>en</strong>te <strong>de</strong> mayúsculas 1 y se les asigna valor por medio <strong>de</strong>l operador =;por ejemplo MENSAJE="saluditos por la mañana"; <strong>de</strong>spués, para usarlas recuperando suvalor, prece<strong>de</strong>mos el nombre <strong>de</strong> la variable con el carácter ‘$’, como <strong>en</strong> la sigui<strong>en</strong>te línea:% echo $MENSAJEEntonces el programa anterior, usando variables para el m<strong>en</strong>saje, quedaría así:#! / u s r / b i n / bashMENSAJE= h o l a ; echo $MENSAJE;Actividad 9.2 Modifica el guión <strong>de</strong> shell anterior <strong>de</strong> manera que uses variables para el m<strong>en</strong>sajeal usuario así como para el nombre <strong>de</strong>l archivo a don<strong>de</strong> se dirige la <strong>en</strong>trada.9.1.2. PreparaciónHasta ahora has apr<strong>en</strong>dido cómo hacer algunos programas s<strong>en</strong>cillos, hechos con base <strong>en</strong> loscomandos aceptados por el shell estándar <strong>de</strong> <strong>Linux</strong>, bash, y conectando la salida <strong>de</strong> algunos1 Esto es parte <strong>de</strong> la tradición; se pue<strong>de</strong>n usar minúsculas también.


9.1 Programación <strong>en</strong> shell 273con la <strong>en</strong>trada <strong>de</strong> otros. Ahora estás capacitado para empr<strong>en</strong><strong>de</strong>r labores un poco más complejas.Apr<strong>en</strong><strong>de</strong>rás cómo hacer programas ejecutables por bash, más gran<strong>de</strong>s y que ofrec<strong>en</strong> serviciosmás útiles.Antes que nada y con vistas a organizar <strong>de</strong>corosam<strong>en</strong>te tu actividad, <strong>de</strong>berás crear <strong>en</strong> tudirectorio personal un subdirectorio don<strong>de</strong> puedas guardar todos tus programas ejecutables <strong>de</strong>uso frecu<strong>en</strong>te. Esto, a<strong>de</strong>más <strong>de</strong> la evi<strong>de</strong>nte v<strong>en</strong>taja <strong>de</strong> organizar tu labor, te proporciona la posibilidad<strong>de</strong> incluir este subdirectorio como parte <strong>de</strong> tu variable <strong>de</strong> ambi<strong>en</strong>te $PATH. Procedamos<strong>en</strong> or<strong>de</strong>n. Lo que t<strong>en</strong>emos que hacer es:1. Crear un directorio llamado ∼/bin: cd; mkdir bin.2. Agregar a nuestra variable $PATH el directorio que acabamos <strong>de</strong> crear. Esto es, editael archivo ∼/.bashrc y agrega al fin <strong>de</strong> la línea que comi<strong>en</strong>za: PATH=, lo sigui<strong>en</strong>te::/$HOME/bin.Ahora todos los programas que hagas y coloques <strong>en</strong> ese subdirectorio podrán ser llamados<strong>de</strong>s<strong>de</strong> cualquier otro directorio <strong>en</strong> el que estés. El sistema se <strong>en</strong>cargará <strong>de</strong> ejecutarlos <strong>de</strong>s<strong>de</strong> tudirectorio bin. Por supuesto todos los programas <strong>de</strong>berán t<strong>en</strong>er permiso <strong>de</strong> ejecución (recuerdael uso <strong>de</strong> chmod).Actividad 9.3 Despliega la variable <strong>de</strong> ambi<strong>en</strong>te $PATH luego <strong>de</strong> editar el archivo ∼/.bashrc.Compara el resultado con la que acabas <strong>de</strong> poner <strong>en</strong> el archivo. ¿Que ocurrió?En g<strong>en</strong>eral, todos los programas que elabores <strong>en</strong> esta sección <strong>de</strong>berán almac<strong>en</strong>arse <strong>en</strong> tudirectorio bin.9.1.3. Vigilando el espacio <strong>en</strong> discoNuestro primer programa, como todos los que seguirán, estará <strong>en</strong>focado a resolver un problema,a facilitarte la vida <strong>de</strong> alguna manera. Algo con lo que todo usuario <strong>de</strong> un sistema compartido<strong>de</strong>be apr<strong>en</strong><strong>de</strong>r a convivir es con los <strong>de</strong>más usuarios. Todos compart<strong>en</strong> un mismo discoduro, un mismo procesador, una misma memoria; es necesario regular el uso <strong>de</strong> estos recursospara garantizar su disponibilidad a todos los usuarios. Es por ello que <strong>en</strong> muchos sistemas <strong>de</strong>cómputo compartidos se establec<strong>en</strong> políticas g<strong>en</strong>erales <strong>de</strong> uso <strong>de</strong> recursos. Por ejemplo, se establec<strong>en</strong>cuotas máximas <strong>de</strong> uso <strong>de</strong> disco. Mediante este procedimi<strong>en</strong>to cada usuario <strong>de</strong>l sistemati<strong>en</strong>e un límite máximo <strong>de</strong> espacio disponible, es <strong>de</strong>cir, la cantidad <strong>de</strong> información guardada <strong>en</strong>su directorio personal no <strong>de</strong>berá exce<strong>de</strong>r nunca este límite; <strong>en</strong> caso <strong>de</strong> que se pret<strong>en</strong>da rebasarel límite, el sistema lo impi<strong>de</strong>: es como si el disco duro se hubiese acabado. El usuario se <strong>en</strong>tera<strong>de</strong> esto porque se le pres<strong>en</strong>ta un m<strong>en</strong>saje como Disk quota excee<strong>de</strong>d.Para que nunca te suceda esta <strong>de</strong>sagradable situación y se te impida guardar informaciónimportante, es necesario que mant<strong>en</strong>gas constantem<strong>en</strong>te vigilado el monto <strong>de</strong> disco que utilizas.Sería conv<strong>en</strong>i<strong>en</strong>te <strong>en</strong>tonces poseer un listado <strong>de</strong> cuánto espacio <strong>de</strong> disco ocupa cada uno <strong>de</strong> tussubdirectorios para que, <strong>en</strong> caso necesario y tomando <strong>en</strong> consi<strong>de</strong>ración lo que sea más relevante,eliminar información que ya no sea necesaria.Para po<strong>de</strong>r hacer esto necesitas un programa que te permita conocer cuánto espacio <strong>de</strong> discoocupa un directorio y te lo reporte <strong>en</strong> unida<strong>de</strong>s <strong>de</strong> uso cotidiano. El comando que hace esto <strong>en</strong>


274 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teUNIX es du (disk usage). Pue<strong>de</strong>s saber cuanto espacio ocupa tu directorio actual y cada uno <strong>de</strong>sus subdirectorios con el sigui<strong>en</strong>te comando: du -k . 2 .Actividad 9.4 Logra que la salida <strong>de</strong> du se muestre paginada.Actividad 9.5 Logra que du reporte sólo el tamaño <strong>de</strong>l directorio actual, pero sin <strong>de</strong>sglosarpor subdirectorios.Lo malo <strong>de</strong> hacer du -k . es que el listado <strong>de</strong> la cantidad <strong>de</strong> disco ocupada sale <strong>de</strong>sor<strong>de</strong>nado.Si ti<strong>en</strong>es muchos subdirectorios no es evi<strong>de</strong>nte cuáles son los que más espacio ocupan y, portanto, a cuáles <strong>de</strong>berías prestar más at<strong>en</strong>ción. Pero afortunadam<strong>en</strong>te existe el comando sort, quepermite or<strong>de</strong>nar aquello que recibe como <strong>en</strong>trada. Como has hecho <strong>en</strong> el pasado, pue<strong>de</strong>s pasarla salida <strong>de</strong>l comando du como <strong>en</strong>trada <strong>de</strong>l comando sort y rematar esto pasando la salida <strong>de</strong>sort como <strong>en</strong>trada <strong>de</strong> more (o less si lo prefieres). sort or<strong>de</strong>na creci<strong>en</strong>te y quisieras (aunque<strong>en</strong> gustos se romp<strong>en</strong> géneros) que la salida fuera or<strong>de</strong>nada <strong>de</strong>creci<strong>en</strong>te para que pudieras fijartequizás <strong>en</strong> los 3, 5 o 10 subdirectorios más gran<strong>de</strong>s fácilm<strong>en</strong>te; a<strong>de</strong>más, quieres que para or<strong>de</strong>naruse los valores numéricos <strong>en</strong>tregados por du. Esto último pue<strong>de</strong> parecer evi<strong>de</strong>nte pero no lo es.Hay dos maneras <strong>de</strong> ver un 423: como el número 423 o como la secu<strong>en</strong>cia <strong>de</strong> tres símbolos“423”, una ca<strong>de</strong>na <strong>de</strong> carácteres. Visto <strong>de</strong> la primera forma, 423 es mayor que 52; pero <strong>de</strong>s<strong>de</strong>el segundo punto <strong>de</strong> vista, la ca<strong>de</strong>na “423” es m<strong>en</strong>or que “52” porque, <strong>en</strong> or<strong>de</strong>n lexicográfico el“5” está <strong>de</strong>spués <strong>de</strong>l “4”.En síntesis, y agregando algunas líneas explicativas al programa, ti<strong>en</strong>es lo sigui<strong>en</strong>te:1 # ! / b i n / bash2 #3 # R e p o r t a e l e s p a c i o <strong>en</strong> Kbytes ocupado por cada4 # 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 or<strong>de</strong>nando <strong>de</strong> mayor a5 # m<strong>en</strong>or ( or<strong>de</strong>n i n v e r s o p a r a s o r t ) .6 #7 echo " E s p a c i o ocupado <strong>en</strong> d i s c o ( <strong>en</strong> Kbytes ) "8 echo " por 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 "9 du −k . | s o r t −nr | moreNota que está <strong>en</strong>tre <strong>en</strong>tre comilla invertida (ac<strong>en</strong>to grave, que está <strong>en</strong> la esquina superiorizquierda <strong>de</strong>l teclado, junto al “1”) el comando pwd <strong>en</strong> la segunda línea <strong>de</strong> m<strong>en</strong>saje – línea (8)– . Cuando se pone un comando <strong>en</strong>tre ese tipo <strong>de</strong> comilla, al mom<strong>en</strong>to <strong>de</strong> ejecutar la línea quelo conti<strong>en</strong>e se reemplaza el comando por su salida, es <strong>de</strong>cir la ejecución <strong>de</strong> la línea (8),echo "por el directorio actual:‘pwd‘ y subdirectorios,produce:por el directorio actual: /home/users/jose y subdirectoriosActividad 9.6 Haz que el monto <strong>de</strong> espacio ocupado se <strong>de</strong>spliegue <strong>en</strong> mega bytes <strong>en</strong> vez <strong>de</strong> <strong>en</strong>kilo bytes.Actividad 9.7 Haz que la salida <strong>de</strong> sort sea <strong>en</strong> or<strong>de</strong>n creci<strong>en</strong>te y sea posible hacer paginación.2 El . se refiere al directorio actual.


9.1 Programación <strong>en</strong> shell 2759.1.4. Listado <strong>de</strong> directoriosTabla 9.1Por supuesto habrás notado que el listado <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong> un directorio incluye tantosubdirectorios como archivos y que <strong>en</strong> dicho listado las <strong>en</strong>tradas aparec<strong>en</strong> or<strong>de</strong>nadas alfabéticam<strong>en</strong>te.Esto hace que subdirectorios y archivos aparezcan mezclados <strong>en</strong> la lista, lo que dificultadistinguirlos, sobre todo si t<strong>en</strong>emos una larga lista. Sería bu<strong>en</strong>o t<strong>en</strong>er un programa que liste sólolos subdirectorios <strong>de</strong> un directorio dado.Entonces queremos hacer un programa al que podamos <strong>de</strong>cirle el nombre, o <strong>en</strong> g<strong>en</strong>eral, laruta <strong>de</strong> algún directorio y nos muestre <strong>en</strong> la pantalla un listado <strong>de</strong>l nombre <strong>de</strong> todos los subdirectoriosque se <strong>en</strong>cu<strong>en</strong>tran cont<strong>en</strong>idos <strong>en</strong> él. Sería bu<strong>en</strong>o que ese nombre o ruta <strong>de</strong>l directoriopudiera darse al programa <strong>de</strong>l mismo modo <strong>en</strong> que se dan los parámetros <strong>de</strong> <strong>en</strong>trada <strong>de</strong> losprogramas que conocemos, es <strong>de</strong>cir, poniéndolos inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong>l nombre <strong>de</strong>l programaque se quiere ejecutar. Cuando llamamos a ls por ejemplo, po<strong>de</strong>mos <strong>de</strong>cirle la ruta <strong>de</strong>algún directorio <strong>de</strong>l que <strong>de</strong>seamos ver el listado. Por ejemplo:% ls /usr/inclu<strong>de</strong>te muestra el listado <strong>de</strong>l directorio /usr/inclu<strong>de</strong> que pusiste junto al nombre <strong>de</strong>l programa.bash ti<strong>en</strong>e prevista la situación <strong>en</strong> la que se dan parámetros <strong>de</strong> <strong>en</strong>trada a los programas.En es<strong>en</strong>cia sólo se requiere guardarlos <strong>en</strong> algún lugar accesible al programa y ponerle nombrea dicho lugar para po<strong>de</strong>r referirse a lo que está guardado allí <strong>de</strong>s<strong>de</strong> el programa. A<strong>de</strong>más, elnombre <strong>de</strong> estos lugares <strong>de</strong>berá <strong>de</strong> ser un estándar para que cualquier programador sepa cómoreferirse a él. En casa todos los miembros <strong>de</strong> la familia pue<strong>de</strong>n acce<strong>de</strong>r a las llaves <strong>de</strong> la puertaporque están <strong>en</strong> un lugar estándar que todos conoc<strong>en</strong> y al que todos hac<strong>en</strong> refer<strong>en</strong>cia cuando lepi<strong>de</strong>n las llaves a algui<strong>en</strong> más. A estos lugares con nombre para almac<strong>en</strong>ar valores se les llamavariables. Ya has t<strong>en</strong>ido experi<strong>en</strong>cia con variables <strong>de</strong> ambi<strong>en</strong>te (como PATH) y ahora estamoshablando <strong>de</strong> las variables <strong>de</strong> tus programas (<strong>en</strong> particular las variables <strong>de</strong> ambi<strong>en</strong>te son variables<strong>de</strong> tus programas).Pues bi<strong>en</strong>, exist<strong>en</strong> ciertas variables que exist<strong>en</strong> siempre automáticam<strong>en</strong>te <strong>en</strong> todos los programas<strong>en</strong> shell y que se refier<strong>en</strong> a los parámetros <strong>de</strong> <strong>en</strong>trada <strong>de</strong> un programa:Programación <strong>en</strong> shell: variables automáticasVariable$0, $1, $2, ..., $n$#Descripción$0 es el nombre <strong>de</strong>l programa mismo que invocaste, es<strong>de</strong>cir, lo primero que pones <strong>en</strong> la línea <strong>de</strong> llamada. $1es el primer parámetro que se pone luego <strong>de</strong>l nombre <strong>de</strong>lprograma (v.gr.. <strong>en</strong> ls -l, -l sería $1). Análogam<strong>en</strong>te $2,. . . , $n son los sigui<strong>en</strong>tes parámetros.es el número <strong>de</strong> parámetros que pones fr<strong>en</strong>te al nombre<strong>de</strong>l programa, es <strong>de</strong>cir no se cu<strong>en</strong>ta $0.Continúa <strong>en</strong> la sigui<strong>en</strong>te página


276 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teTabla 9.1 Programación <strong>en</strong> shell: variables automáticas Continúa <strong>de</strong> la página anteriorVariable$?Descripciónes el resultado <strong>de</strong>l último comando ejecutado. Todos losprogramas que se ejecutan pue<strong>de</strong>n regresar un resultado;más a<strong>de</strong>lante abordaremos el tema.Nota a<strong>de</strong>más que existe un medio para contar cuántos parámetros <strong>de</strong> <strong>en</strong>trada se le dieron aun programa. Basta con observar el valor que posea la variable $# para saber cuántas palabras(separadas por espacios) se dieron fr<strong>en</strong>te al nombre <strong>de</strong>l programa cuando éste fue llamado aejecutarse.En nuestro programa requeriremos saber cuántos parámetros <strong>de</strong> <strong>en</strong>trada se dieron; si existealgún parámetro, ése <strong>de</strong>be ser la ruta <strong>de</strong> acceso al directorio <strong>de</strong>l que se <strong>de</strong>sea conocer el listado<strong>de</strong> subdirectorios. Llamemos a este directorio el directorio objetivo. Si no existe parámetroalguno <strong>en</strong>tonces supondremos que el directorio objetivo es el actual. En caso <strong>de</strong> que sí existael parámetro, <strong>en</strong>tonces <strong>de</strong>beremos cambiarnos al directorio objetivo especificado por dichoparámetro y listar sólo el nombre <strong>de</strong> sus subdirectorios.Es <strong>de</strong>cir, el esquema g<strong>en</strong>eral <strong>de</strong> lo que <strong>de</strong>bemos hacer es el sigui<strong>en</strong>te:1 Si se d i o l a r u t a d e l d i r e c t o r i o o b j e t i v o2 nos cambiamos a e s e d i r e c t o r i o .3 Si no ,4 no nos movemos .5 Ya p a r a d o s <strong>en</strong> e l d i r e c t o r i o o b j e t i v o , p a r a cada e n t r a d a d e l l i s t a d o6 <strong>de</strong> d i r e c t o r i o7 Si l a e n t r a d a es e l nombre <strong>de</strong> un s u b d i r e c t o r i o ,8 l a mostramos .9 Si no ,10 nos v a l e .Nóta que <strong>en</strong> las líneas 1 y 7 <strong>de</strong>bes tomar <strong>de</strong>cisiones, <strong>de</strong>bes ser capaz <strong>de</strong> preguntar si algoocurre o no. Esto lo pue<strong>de</strong>s hacer <strong>en</strong> bash usando la construcción:i f [ c o n d i c i ón ]t h e n# i n s t r u c c i o n e s que se e j e c u t a n s i l a c o n d i c i ón es v e r d a d e r ae l s e# i n s t r u c c i o n e s que se e j e c u t a n s i l a c o n d i c i ón es f a l s af iExist<strong>en</strong> dos maneras <strong>de</strong> escribir la condición, una es poniéndola <strong>en</strong>tre corchetes (“[“ y “]”)y la otra usando explícitam<strong>en</strong>te el comando test 3 . test −d pregunta si es un


9.1 Programación <strong>en</strong> shell 277subdirectorio; si <strong>en</strong> vez <strong>de</strong> −d se pone −f <strong>en</strong>tonces pregunta si es un archivo ( file ).A<strong>de</strong>más <strong>de</strong>bemos hacer algo para cada <strong>en</strong>trada <strong>de</strong>l listado <strong>de</strong> directorio, como dice nuestroesquema g<strong>en</strong>eral. Esto es posible usando la construcción for <strong>de</strong>l shell (ver man bash):f o r < v a r i a b l e <strong>de</strong> índice > i n < c o n j u n t o <strong>de</strong> 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 rdoneEsto hace que las instrucciones <strong>en</strong>tre el do y el done se repitan tantas veces como elem<strong>en</strong>tost<strong>en</strong>ga el conjunto especificado a continuación <strong>de</strong> la palabra in. En es<strong>en</strong>cia, lo que hace el fores ponerle a la variable <strong>de</strong> índice el primer valor <strong>de</strong> la lista, luego ejecutar las instrucciones arepetir, cambiar el valor <strong>de</strong> la variable <strong>de</strong> índice poniéndole el segundo <strong>de</strong>l conjunto y repetir lasinstrucciones; y así sucesivam<strong>en</strong>te hasta que la variable adquiera el último valor <strong>de</strong>l conjunto;ésa será la última vez que se ejecuta el ciclo.A continuación se muestra el código <strong>de</strong>l programa que queremos:1 # ! / b i n / bash2 #3 # E n t r e g a un l i s t a d o <strong>de</strong> 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 que4 # son s u b d i r e c t o r i o s .5 #6 # Si hubo un p a r ámetro <strong>en</strong> l a l i n e a <strong>de</strong> comandos7 # es e l d i r e c t o r i o d e l que <strong>de</strong>seamos l o s s u b d i r s .8 i f [ $# −ne 0 ] ; t h e n9 cd $110 f i11 # s i no , queremos 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 l12 echo " S u b d i r e c t o r i o s <strong>en</strong> ‘pwd ‘ "13 f o r i i n ‘ l s −aA ‘ ; do14 i f t e s t −d $ i ; t h e n15 l s −l d $ i16 f i17 doneActividad 9.8 ¿Por qué se le puso la opción d al comando ls (línea 15)?Actividad 9.9 ¿Por qué se le pusieron las opciones aA al comando ls (línea 13)?Actividad 9.10 ¿Para qué sirv<strong>en</strong> las líneas 13–17?Actividad 9.11 Analiza la línea 8 <strong>de</strong>l programa. ¿Qué ocurre si el usuario, tontam<strong>en</strong>te, da más<strong>de</strong> un parámetro? ¿Como harías para restringir más, si es posible, la <strong>en</strong>trada? (suger<strong>en</strong>cia:man test).3 En realidad [ condición ] es una manera implícita <strong>de</strong> usar el comando test .


278 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te9.1.5. Recorridos recursivosEl problema <strong>de</strong> borrar basura: planteami<strong>en</strong>toYa sabes cómo hacer para conocer el espacio <strong>en</strong> disco que ocupas <strong>en</strong> tu directorio personal.Esto te provee <strong>de</strong> un medio para saber cuáles <strong>de</strong> tus subdirectorios son más gran<strong>de</strong>s, lo quepue<strong>de</strong>s usar como un criterio para <strong>de</strong>cidir qué borrar o comprimir y qué no, con el fin <strong>de</strong> reducirel espacio ocupado.Pero si meditas un poco <strong>en</strong> el proceso que <strong>de</strong>berás llevar a cabo para <strong>de</strong>purar tu directorio,te darás cu<strong>en</strong>ta <strong>de</strong> que pue<strong>de</strong> no ser agradable. Habría que navegar por todos los subdirectoriosbuscando archivos inútiles y borrándolos, t<strong>en</strong>i<strong>en</strong>do cuidado <strong>de</strong> no borrar los que no <strong>de</strong>bes.Es posible establecer criterios g<strong>en</strong>erales, basados <strong>en</strong> los nombres <strong>de</strong> los archivos, para <strong>de</strong>cidirqué borrar y qué no. Ya conoces, por ejemplo, los archivos <strong>de</strong> respaldo <strong>de</strong> Emacs, esosque terminan con ∼ y que suel<strong>en</strong> ser muy útiles cuando aún no se obti<strong>en</strong>e la versión final <strong>de</strong> unarchivo que está <strong>en</strong> proceso <strong>de</strong> edición, pero que una vez que dicha versión final se ha obt<strong>en</strong>ido<strong>de</strong>jan <strong>de</strong> serlo. Con frecu<strong>en</strong>cia, archivos como éstos se quedan por allí ocupando espacio innecesariam<strong>en</strong>te.Hay otros casos similares como los archivos <strong>de</strong> bitácora (.log) o auxiliares (.aux)que son g<strong>en</strong>erados por TEXy LATEX.Podrías p<strong>en</strong>sar <strong>en</strong>tonces <strong>en</strong> hacer un programa que <strong>de</strong>sci<strong>en</strong>da por todo el árbol <strong>de</strong> tu directoriopersonal eliminando todos los archivos que satisfagan los criterios establecidos <strong>en</strong> sunombre. Eso automatizaría <strong>en</strong> bu<strong>en</strong>a medida el proceso <strong>de</strong> <strong>de</strong>puración <strong>de</strong> espacio y reduce significativam<strong>en</strong>tela probabilidad <strong>de</strong> que te equivoques borrando algo que no querías borrar (porsupuesto que pue<strong>de</strong>n seguir ocurri<strong>en</strong>do errores in<strong>de</strong>seables: si <strong>en</strong> algún mom<strong>en</strong>to <strong>de</strong>seas conservarun archivo cuyo nombre cumple con los criterios <strong>de</strong> borrado, <strong>de</strong>berás cambiarle <strong>de</strong> nombrepara no borrarlo acci<strong>de</strong>ntalm<strong>en</strong>te <strong>en</strong> el futuro).El patrón <strong>de</strong> <strong>de</strong>sc<strong>en</strong>soPara resolver el problema que te ocupa ti<strong>en</strong>es que ser capaz, primero, <strong>de</strong> po<strong>de</strong>r <strong>de</strong>sc<strong>en</strong><strong>de</strong>rpor un directorio y todos sus subdirectorios. ¿Cómo haces esto? Conceptualm<strong>en</strong>te hablando, loque quieres es:1. Haces lo que <strong>de</strong>seas hacer <strong>en</strong> el directorio actual (lo que quieres hacer aun cuando éste seael único directorio pres<strong>en</strong>te).2. Te fijas <strong>en</strong> cada <strong>en</strong>trada <strong>de</strong>l listado <strong>de</strong>l directorio.3. Si la <strong>en</strong>trada correspon<strong>de</strong> a un subdirectorio te introduces a él y haces lo mismo queestabas haci<strong>en</strong>do <strong>en</strong> el nivel anterior (haces lo que <strong>de</strong>seas. . . fijarte <strong>en</strong> cada <strong>en</strong>trada. . . ).4. Si le <strong>en</strong>trada no es un directorio quizás haces algo más con ella.5. Cuando terminas con cada una <strong>de</strong> las <strong>en</strong>tradas <strong>de</strong>l directorio sales al directorio inmediatoanterior.El paso número 2 significa que haces exactam<strong>en</strong>te lo mismo que estabas haci<strong>en</strong>do <strong>en</strong> eldirectorio superior; es <strong>de</strong>cir, ejecutas cada una <strong>de</strong> las acciones que estabas llevando a cabo, <strong>en</strong>el mismo or<strong>de</strong>n; esto es, ejecutas el mismo programa. Cuando un programa, como parte <strong>de</strong> sus


9.1 Programación <strong>en</strong> shell 279instrucciones, or<strong>de</strong>na la ejecución <strong>de</strong> sí mismo, el programa recibe el apelativo <strong>de</strong> recursivo.Imagina que tu programa se llama paseo_rec. Entonces el esquema g<strong>en</strong>eral <strong>de</strong> lo que quiereshacer es algo así:1 Hacemos l o que <strong>de</strong>seamos hacer , e l o b j e t i v o <strong>de</strong> n u e s t r o programa2 Para cada e n t r a d a d e l d i r e c t o r i o3 Si l a e n t r a d a es un s u b d i r e c t o r i o4 Entramos a l s u b d i r e c t o r i o5 Ejecutamos p a s e o _ r e c a p a r t i r d e l d i r e c t o r i o a c t u a l6 Salimos d e l d i r e c t o r i o a l i n m e d i a t o s u p e r i o r7 Si no es un s u b d i r e c t o r i o8 Decimos su nombreDeseamos repetir al proceso <strong>de</strong> las líneas 3 a 8 para cada <strong>en</strong>trada <strong>de</strong>l directorio. Esto sedice for i in ‘ ls ‘ es <strong>de</strong>cir para cada elem<strong>en</strong>to <strong>de</strong>l listado producido por el comando ‘ls‘. Dadoque ls <strong>en</strong>trega una por una las <strong>en</strong>tradas <strong>de</strong>l directorio, esa i que usas sirve para referirse, unopor uno, a cada elem<strong>en</strong>to <strong>de</strong>l listado <strong>de</strong> directorio. Entonces, una vez que estás parados <strong>en</strong> la<strong>en</strong>trada i <strong>de</strong>l directorio, pue<strong>de</strong>s preguntar si esa i correspon<strong>de</strong> a un subdirectorio o a un archivo.Esto es posible hacerlo con los comandos if y test, tal como lo hiciste <strong>en</strong> el programa que listadirectorios. Así:1 # ! / b i n / bash2 # Programa r e c u r s i v o p a r a b a j a r por todo un á r b o l <strong>de</strong> d i r e c t o r i o s3 echo " D i r e c t o r i o a c t u a l : " ‘pwd ‘4 f o r i i n ‘ l s ‘ ; do # Para cada e n t r a d a d e l d i r e c t o r i o5 i f t e s t −d $ i ; t h e n # s i l a e n t r a d a es <strong>de</strong> un d i r e c t o r i o6 cd $ i # nos cambiamos a é s t e7 $HOME/ b i n / p a s e o _ r e c # Llamada r e c u r s i v a8 cd . .9 e l i f t e s t −f $ i ; t h e n # s i no , s i es un a r c h i v o10 echo " a r c h i v o : $ i "11 f i12 doneEl problema <strong>de</strong> borrar la basura revisitadoAhora pue<strong>de</strong>s usarlo para tus fines, hacer un programa que borre todos los archivos quetermin<strong>en</strong> con: ∼, aux o log. Como realm<strong>en</strong>te no te interesa hacer algo con las <strong>en</strong>tradas <strong>de</strong>ldirectorio que no son directorios, eliminas el trozo <strong>de</strong> código <strong>de</strong> las líneas9–11 y <strong>en</strong> vez <strong>de</strong> lalínea 4 pondrás también las líneas que necesitas para eliminar los archivos. El resultado es elcódigo que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el listado 9.1 <strong>de</strong> la sigui<strong>en</strong>te página – se está suponi<strong>en</strong>do que elarchivo don<strong>de</strong> este programa se <strong>en</strong>cu<strong>en</strong>tra se llama borramugres.rec.


280 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teNota que <strong>en</strong> la línea 14 se llama al programa borramugres.rec, que se supone se <strong>en</strong>cu<strong>en</strong>tra<strong>en</strong> el subdirectorio bin <strong>de</strong>l directorio personal <strong>de</strong>l usuario; así que si cambias el nombre <strong>de</strong>lprograma o su ubicación <strong>de</strong>berás modificar esa línea para que pueda <strong>en</strong>contrarse a sí mismo.Actividad 9.12 Modifica el programa para que pregunte si realm<strong>en</strong>te <strong>de</strong>sea borrar cada archivo<strong>de</strong> respaldo <strong>de</strong> Emacs, (suger<strong>en</strong>cia: man rm).Código 9.1Borrado recursivo <strong>de</strong> basura1 # ! / b i n / bash2 # 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 a3 #4 echo " D i r e c t o r i o a c t u a l : " ‘pwd ‘5 rm −f ∗ . l o g6 rm −f ∗ . aux7 rm −f ∗~8 rm −f . ∗ ~9 f o r i i n ‘ l s ‘ # Para cada e n t r a d a d e l d i r e c t o r i o10 do11 i f t e s t −d $ i # s i l a e n t r a d a es <strong>de</strong> un d i r e c t o r i o12 t h e n13 cd $ i # e n t r a a l d i r e c t o r i o14 $HOME/ b i n / b o r r a m u g r e s . r e c15 cd . .16 f i17 doneUn grep recursivoYa conoces el programa grep que te permite, <strong>en</strong> particular, buscar pres<strong>en</strong>cias <strong>de</strong> una ca<strong>de</strong>nacualquiera <strong>en</strong> conjuntos <strong>de</strong> archivos. En muchas situaciones es <strong>de</strong>seable conocer no sólo <strong>en</strong>cuáles archivos <strong>de</strong> un directorio aparece la ca<strong>de</strong>na, sino <strong>en</strong> cuáles archivos <strong>de</strong> sus subdirectorios,<strong>en</strong> cuáles <strong>de</strong> los subdirectorios <strong>de</strong> éstos y así sucesivam<strong>en</strong>te. Es simple p<strong>en</strong>sar <strong>en</strong> una situaciónasí; por ejemplo, si quisieras saber cuántos y cuáles <strong>de</strong> los archivos cont<strong>en</strong>idos <strong>en</strong> un directorioo sus subdirectorios son programas para bash podrías buscar la ca<strong>de</strong>na “/bin/bash” <strong>en</strong> todos losarchivos.Lo que quieres es hacer un grep recursivo que busque una ca<strong>de</strong>na <strong>en</strong> todos y cada uno<strong>de</strong> los archivos cont<strong>en</strong>idos <strong>en</strong> un directorio y sus subdirectorios. Ti<strong>en</strong>es que hacer que tu greprecursivo (al que llamaremos rgrep) busque la ca<strong>de</strong>na <strong>de</strong>seada <strong>en</strong> todos los archivos <strong>de</strong>l directorioactual y luego proceda a la manera <strong>de</strong> paseo_rec, metiéndose a cada subdirectorio quese <strong>en</strong>cu<strong>en</strong>tra y llamándose a sí mismo. Cuando la <strong>en</strong>trada <strong>de</strong>l directorio sea un archivo no hacesnada, como pue<strong>de</strong>s ver <strong>en</strong> el listado 9.2 <strong>de</strong> la sigui<strong>en</strong>te página.Actividad 9.13 ¿Qué significan las opciones Hns <strong>de</strong> grep que se usan <strong>en</strong> rgrep <strong>en</strong> la línea11?


9.1 Programación <strong>en</strong> shell 281Código 9.2grep recursivo1 # ! / b i n / bash2 #3 # Hace un grep r e c u r s i v o a mano ( es d e c i r emulando4 # e g r e p −r ) . Como hacían l o s hombres <strong>de</strong> mi época .5 #6 #7 i f [ $# −ne 1 ]8 t h e n9 e x i t −110 f i11 grep −Hns $1 ∗ | more12 f o r i i n ‘ l s ‘13 do14 i f t e s t −d $ i15 t h e n16 cd $ i17 echo " "18 echo " e s t o y <strong>en</strong> " ‘pwd ‘19 $HOME/ b i n / r g r e p $120 cd . .21 f i22 doneActividad 9.14 ¿Qué significa la opción -r <strong>de</strong> grep (o mejor dicho <strong>de</strong> egrep, que ocupó ellugar <strong>de</strong>l antiguo grep)?Cambiando permisos, propietario y gruporecursivam<strong>en</strong>tePodrías utilizar también el esquema g<strong>en</strong>eral <strong>de</strong> programa recursivo para mejorarlo, ahorahaci<strong>en</strong>do otra labor: la <strong>de</strong> cambiar permisos, propietario y grupo <strong>de</strong> todos los archivos <strong>de</strong> undirectorio y sus subdirectorios.Quieres un programa, llamado chmogr, que reciba como parámetros <strong>de</strong> <strong>en</strong>trada <strong>en</strong> la línea<strong>de</strong> llamada:1. los permisos,2. el propietario y3. el grupo,que quieres poner a todos los archivos y subdirectorios a partir <strong>de</strong>l directorio actual.Ya sabes usar los comandos chmod, chown y chgrp que son <strong>en</strong> los que nos apoyaremospara realizar nuestra labor. Pero hay algo adicional que consi<strong>de</strong>rar: no es posible <strong>en</strong>trar a unsubdirectorio si éste no posee permiso <strong>de</strong> ejecución (curioso ¿no?). Así que <strong>en</strong> tu programa<strong>de</strong>bes t<strong>en</strong>er esto <strong>en</strong> cu<strong>en</strong>ta y asegurarte <strong>de</strong> po<strong>de</strong>r <strong>en</strong>trar a todos los subdirectorios poniéndolespermiso <strong>de</strong> ejecución.


282 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teSeguram<strong>en</strong>te ya has usado varias veces el comando ls con la opción -l y habrás visto lasalida que produce. A difer<strong>en</strong>cia <strong>de</strong> ls a secas, ls -l <strong>de</strong>spliega una línea por cada archivo. Siobservas esta salida, <strong>en</strong> el extremo izquierdo <strong>de</strong> cada archivo están los permisos <strong>de</strong> acceso <strong>de</strong>lmismo. En la sección 3.2.1 revisamos con <strong>de</strong>talle el sistema <strong>de</strong> permisos <strong>de</strong> UNIX y aquí vas autilizar esta información para acce<strong>de</strong>r a cada subdirectorio.1 # ! / b i n / bash2 #3 # Programa p a r a cambiar permisos , e l p r o p i e t a r i o y e l4 # grupo <strong>de</strong> 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 e5 #6 i f [ $# −eq 3 ]7 t h e n8 f o r i i n ‘ l s ‘9 do10 i f t e s t −d $ i11 t h e n12 chown $2 $ i13 chgrp $3 $ i14 # l e ponemos permiso <strong>de</strong> e n t r a r t e m p o r a l m e n t e15 chmod +x $ i16 cd $ i17 echo " D i r e c t o r i o a c t u a l : " ‘pwd ‘18 # OJO aquí se pone l a r u t a c o m p l e t a a b s o l u t a19 # p a r a a c c e d e r a e s t e programa20 $HOME/ b i n / chmogr $1 $2 $321 cd . .22 # l e ponemos l o s p e r m i s o s que nos d i j e r o n23 chmod $1 $ i24 e l i f t e s t −f $ i25 t h e n26 echo " Archivo : "$ i27 chown $2 $ i28 chmod $1 $ i29 chgrp $3 $ i30 f i31 done32 e l s e33 echo "USO: $0 [ perm ] [ prop ] [ grupo ] "34 echo " Cambia permisos , p r o p i e t a r i o y grupo r e c u r s i v a m e n t e "35 echo " J o s +\ ’ e+ Galav + \ ’ i + , F a c u l t a d <strong>de</strong> C i e n c i a s , <strong>UNAM</strong>. "36 f i


9.1 Programación <strong>en</strong> shell 283Actividad 9.15 El programa recursivo <strong>de</strong> cambio <strong>de</strong> permisos propietario y grupo fue hechohace mucho cuando aún no existían ciertas ext<strong>en</strong>siones <strong>de</strong> los comandos tradicionales chown,chmod y chgrp. ¿Cómo harías actualm<strong>en</strong>te un programa con la misma funcionalidad pero máss<strong>en</strong>cillo? (suger<strong>en</strong>cia: man chown)Actividad 9.16 Elabora, a partir <strong>de</strong> paseo_rec, un programa que actualice la fecha y hora<strong>de</strong> cada archivo <strong>de</strong>sc<strong>en</strong>di<strong>en</strong>do recursivam<strong>en</strong>te por los subdirectorios a partir <strong>de</strong> la posiciónactual. (Suger<strong>en</strong>cia: man touch).9.1.6. Comparando archivosFrecu<strong>en</strong>tem<strong>en</strong>te posees difer<strong>en</strong>tes versiones <strong>de</strong> tus archivos, por ejemplo difer<strong>en</strong>tes versiones<strong>de</strong>l mismo programa con el mismo nombre. Posiblem<strong>en</strong>te, haya directorios completoscuyos archivos están duplicados o son versiones difer<strong>en</strong>tes <strong>de</strong> los cont<strong>en</strong>idos <strong>en</strong> otro. En estascircunstancias sería bu<strong>en</strong>o po<strong>de</strong>r saber si los archivos <strong>de</strong> un directorio son, <strong>de</strong> hecho, difer<strong>en</strong>tes<strong>de</strong> los que ti<strong>en</strong><strong>en</strong> el mismo nombre, cont<strong>en</strong>idos <strong>en</strong> otro directorio.En UNIX existe un comando para saber si dos archivos son difer<strong>en</strong>tes: diff. Usaremos estecomando para hacer un programa <strong>en</strong> shell que te indique cuántos y cuáles archivos son difer<strong>en</strong>tesy cuáles no. Para po<strong>de</strong>r contar necesitarás poseer contadores que puedas ir increm<strong>en</strong>tandocada vez que te percates <strong>de</strong> que un archivo es difer<strong>en</strong>te <strong>de</strong> su análogo o cada vez que son iguales.Para ello pue<strong>de</strong>s usar el comando let <strong>de</strong> bash que permite evaluar expresiones aritméticas.A<strong>de</strong>más para que te puedas percatar <strong>de</strong> la igualdad o difer<strong>en</strong>cia <strong>de</strong> dos archivos necesitarássaber cuál es el resultado <strong>en</strong>tregado por diff.diff, como casi todos los comandos ejecutables <strong>en</strong> el shell, regresa un valor resultado <strong>de</strong>su ejecución. Es posible atrapar este resultado para po<strong>de</strong>r tomar la <strong>de</strong>cisión <strong>de</strong> increm<strong>en</strong>tar elcontador <strong>de</strong> archivos iguales o el <strong>de</strong> archivos difer<strong>en</strong>tes. Ya antes m<strong>en</strong>cionamos la variable $?que <strong>en</strong>trega el resultado <strong>de</strong>l último comando ejecutado, así que ésa será la manera <strong>de</strong> conocerel valor <strong>en</strong>tregado por diff. diff <strong>en</strong>trega un cero si los archivos que se le <strong>en</strong>com<strong>en</strong>dó compararresultan ser iguales, uno si son difer<strong>en</strong>tes y dos si no se pudo efectuar la comparación por algúnmotivo. En el listado 9.3 <strong>en</strong> la sigui<strong>en</strong>te páginaa se muestra el código <strong>de</strong>l programa que <strong>de</strong>seas.En las líneas 6–8 se establece el valor inicial <strong>de</strong> los contadores IGUAL, DIFER y CON-TADOR que nos permit<strong>en</strong> contar archivos iguales, difer<strong>en</strong>tes y el total respectivam<strong>en</strong>te. En lalínea 23 se pregunta si el valor <strong>en</strong>tregado por diff es cero, <strong>en</strong> cuyo caso increm<strong>en</strong>tamos el valor<strong>de</strong>l contador IGUAL <strong>en</strong> uno (línea 25) usando let. De no ser iguales los archivos (lo que significaque o bi<strong>en</strong> son difer<strong>en</strong>tes o no se pudieron comparar), <strong>en</strong>tonces increm<strong>en</strong>tamos el contadorDIFER y siempre increm<strong>en</strong>tamos CONTADOR, el que cu<strong>en</strong>ta todos los archivos.Actividad 9.17 ¿Qué significan las opciones qs <strong>de</strong> diff <strong>en</strong> la línea 22?


284 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teCódigo 9.3Usando el resultado que <strong>en</strong>trega diff1 # ! / b i n / bash2 #3 # 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 l4 # d i r e c t o r i o a c t u a l con l o s <strong>de</strong> o t r o d i r e c t o r i o5 #6 CONTADOR=07 DIFER=08 IGUAL=09 i f [ $# −ne 1 ]10 t h e n11 echo " uso : $0 < d i r e c t o r i o >"12 echo " 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 "13 echo " 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 "14 e l s e15 echo " Comparando l o s a r c h i v o s <strong>en</strong> ‘pwd ‘ "16 echo " con l o s <strong>de</strong> $1 . . . "17 echo " "18 f o r i i n ‘ l s ‘19 do20 i f [ −f $ i ]21 t h e n22 d i f f −qs $ i $ 1 / $ i23 i f [ $? −eq 0 ]24 t h e n25 l e t IGUAL=IGUAL+126 e l s e27 l e t DIFER=DIFER+128 f i29 l e t CONTADOR=CONTADOR+130 f i31 done32 echo " "33 echo "$CONTADOR a r c h i v o s comparados "34 echo "$IGUAL i g u a l e s "35 echo "$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 "36 f iActividad 9.18 ¿Qué recibe como parámetro <strong>de</strong> <strong>en</strong>trada el programa?Actividad 9.19 ¿Qué ocurre con el programa cuando hay un archivo <strong>en</strong> el directorio actualque no existe <strong>en</strong> el otro directorio?


9.1 Programación <strong>en</strong> shell 285Actividad 9.20 Modifica el programa para que, <strong>en</strong> caso <strong>de</strong> que los archivos sean difer<strong>en</strong>tesdiga cuál es más reci<strong>en</strong>te (suger<strong>en</strong>cia: man test).9.1.7. Otra vez el problema <strong>de</strong> borrar la basuraHas hecho ya un programa recursivo basado <strong>en</strong> paseo_rec que elimina archivos innecesariosa partir <strong>de</strong> un directorio dado. Pero ahora ti<strong>en</strong>es muchos más elem<strong>en</strong>tos para po<strong>de</strong>r haceruna nueva versión, mejorada, <strong>de</strong>l programa. Es <strong>de</strong> notar que el problema es<strong>en</strong>cial <strong>de</strong>l programaes la manera <strong>de</strong> <strong>en</strong>contrar los archivos inútiles; esto lo haces con el <strong>de</strong>sc<strong>en</strong>so recursivo por elárbol <strong>de</strong> directorios, pero hay otra manera <strong>de</strong> hacerlo sin necesidad <strong>de</strong> <strong>de</strong>sc<strong>en</strong><strong>de</strong>r por todo elárbol a pie. Existe un programa que se <strong>en</strong>carga <strong>de</strong> <strong>en</strong>contrar archivos que cumplan con ciertascaracterísticas. find nos permite <strong>en</strong>contrar archivos con características comunes, localizados apartir <strong>de</strong> cierta ruta específica (es <strong>de</strong>cir, a partir <strong>de</strong> cierto directorio); también se le dice a findqué hacer cada vez que se <strong>en</strong>cu<strong>en</strong>tre algún archivo que cumpla con las características especificadas,por ejemplo, <strong>de</strong>splegar el nombre <strong>de</strong>l archivo. Si find te pue<strong>de</strong> regresar un conjunto <strong>de</strong>archivos tales que su nombre cumpla con la característica <strong>de</strong> terminar con ∼, por ejemplo, estarás<strong>en</strong> el camino correcto. Bastaría <strong>en</strong>tonces borrar cada archivo <strong>de</strong> ese conjunto para eliminarlos respaldos <strong>de</strong> Emacs, por ejemplo.El sigui<strong>en</strong>te programa automatiza el proceso <strong>de</strong> borrar la basura y a<strong>de</strong>más g<strong>en</strong>era un informe<strong>de</strong>tallado <strong>de</strong> su actividad, registrándola <strong>en</strong> un archivo <strong>de</strong> tu directorio personal. Es <strong>de</strong> notar que,a difer<strong>en</strong>cia <strong>de</strong> la versión anterior que borraba basura, este programa no borra la basura a partir<strong>de</strong>l directorio actual, sino que lo hace a partir <strong>de</strong> tu directorio $HOME. En este programa sehace uso <strong>de</strong> find <strong>de</strong> la sigui<strong>en</strong>te forma:% /usr/bin/find . -name "core" -printLos parámetros con los cuáles está si<strong>en</strong>do ejecutado significan:. El primer parámetro <strong>de</strong> find es . (punto), busca a partir <strong>de</strong>l directorio actual, previam<strong>en</strong>te elprograma se cambia al directorio <strong>de</strong>l usuario.-name Encu<strong>en</strong>tra archivos cuyo nombre coincida con el patrón que se establece a continuación.Es posible también establecer condiciones que no t<strong>en</strong>gan que ver con el nombre<strong>de</strong>l archivo sino con otras características, por ejemplo su fecha <strong>de</strong> último acceso, lo quepermitiría eliminar archivos viejos.“core” Archivos que se llam<strong>en</strong> core <strong>en</strong> este ejemplo; <strong>en</strong> otros casos <strong>de</strong> este mismo programase buscan aquellos que cumplan con el patrón *∼, por ejemplo, lo que significa los queterminan con til<strong>de</strong> (respaldos <strong>de</strong> Emacs).-print Este último parámetro le indica a find qué hacer con el archivo que <strong>en</strong>cu<strong>en</strong>tre; <strong>en</strong> estecaso -print significa imprime su nombre.


286 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teCódigo 9.4 Borrado <strong>de</strong> archivos usando find (1/2)1 # ! / b i n / bash2 #3 # 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 o4 #5 cd $HOME6 echo " Limpiando ‘pwd ‘ . . . "7 FECHA= ‘ d a t e ’+ %d %m%y ’ ‘8 echo ‘ date ‘9 rm −r f Informe . ∗10 echo " Salvando e s t a d o a c t u a l <strong>de</strong> e s p a c i o ocupado . . . "11 echo " Archivo : Informe . $FECHA"12 / u s r / b i n / du −ks . > " Informe . $FECHA"13 / u s r / b i n / du −ks .14 echo " Borrado cache <strong>de</strong> N e t s c a p e y Trash " >> Informe . $FECHA15 echo " Limpiando cache <strong>de</strong> n e t s c a p e . . . "16 rm −r f $HOME/ . n e t s c a p e / cache17 mkdir $HOME/ . n e t s c a p e / cache18 echo " Limpiando e l b o t e <strong>de</strong> b a s u r a . . . "19 rm −r f $HOME/ Desktop / Trash20 mkdir $HOME/ Desktop / Trash21 echo "ARCHIVOS BORRADOS">> Informe . $FECHA22 # c o r e s23 echo " Borrando c o r e s . . . "24 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 ‘25 do26 rm −f $ i27 echo $ i >> $HOME/ Informe . $FECHA28 done29 # r e s p a l d o s <strong>de</strong> Emacs30 echo " Borrando r e s p a l d o s <strong>de</strong> Emacs . . . "31 f o r i i n ‘ / u s r / b i n / f i n d . −name "∗~" −p r i n t ‘32 do33 rm −f $ i34 echo $ i >> $HOME/ Informe . $FECHA35 done36 f o r i i n ‘ / u s r / b i n / f i n d . −name " . ∗ ~ " −p r i n t ‘37 do38 rm −f $ i39 echo $ i >> $HOME/ Informe . $FECHA40 done


9.1 Programación <strong>en</strong> shell 287Código 9.4 Borrado <strong>de</strong> archivos usando find (2/2)41 # a r c h i v o s a u x i l i a r e s y <strong>de</strong> b i t á c o r a <strong>de</strong> TeX y LaTeX42 echo " Borrando a r c h i v o s a u x i l i a r e s <strong>de</strong> TeX y LaTeX . . . "43 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 ‘44 do45 rm −f $ i46 echo $ i >> $HOME/ Informe . $FECHA47 done48 f o r i i n ‘ / u s r / b i n / f i n d . −name " ∗ . aux " −p r i n t ‘49 do50 rm −f $ i51 echo $ i >> $HOME/ Informe . $FECHA52 done53 echo " Salvando e l nuevo e s t a d o a c t u a l <strong>de</strong> e s p a c i o ocupado . . . "54 echo " E s p a c i o a c t u a l :" > > Informe . $FECHA55 / u s r / b i n / du −ks . >> " Informe . $FECHA"56 / u s r / b i n / du −ks .57 echo " El d i r e c t o r i o ‘pwd ‘ ha s i d o l i m p i a d o . "58 echo " "Este programa <strong>en</strong>trega una lista <strong>de</strong> tu espacio ocupado antes y <strong>de</strong>spués <strong>de</strong> la limpieza, yuna lista <strong>de</strong> los archivos eliminados. El nombre <strong>de</strong> dicho archivo ti<strong>en</strong>e el prefijo Informe ysu nombre se construye <strong>en</strong> las líneas 9 y 14. También elimina los directorios <strong>de</strong> cache <strong>de</strong>Netscape y <strong>de</strong> <strong>de</strong>pósito <strong>de</strong> basura Trash <strong>de</strong>l ambi<strong>en</strong>te <strong>de</strong> trabajo.Actividad 9.21 ¿Cuál es el sufijo <strong>de</strong>l nombre <strong>de</strong>l archivo <strong>de</strong> informe que g<strong>en</strong>era el programa?¿Cómo se obti<strong>en</strong>e dicho sufijo?Actividad 9.22 Modifica el programa para que te pregunte si <strong>de</strong>seas borrar cada archivo <strong>en</strong>contrado(Suger<strong>en</strong>cia: man rm).Adicionalm<strong>en</strong>te, este programa (la versión original, no la obt<strong>en</strong>ida <strong>en</strong> el segundo ejercicio)pue<strong>de</strong> ser ejecutado a una hora <strong>de</strong>terminada <strong>en</strong> días <strong>de</strong>terminados usando el comando crontab.Para usarlo primero <strong>de</strong>bes hacer lo sigui<strong>en</strong>te, tanto <strong>en</strong> tu terminal actual como <strong>en</strong> tu archivo∼/.bashrc: hay que hacer que el editor <strong>de</strong> crontab por omisión sea nuestro conocido Emacs.Así que <strong>en</strong> ∼/.bashrc ti<strong>en</strong>es que añadir las líneas:EDITOR=/ u s r / b i n / emacse x p o r t EDITORy por lo pronto lo pones <strong>en</strong> tu shell actual.Ahora pue<strong>de</strong>s teclear:% crontab -eEso te pondrá <strong>en</strong> Emacs listo para editar tu tabla <strong>de</strong> trabajos a ejecutarse automáticam<strong>en</strong>tepor el sistema <strong>en</strong> tiempos <strong>de</strong>terminados. Teclea lo sigui<strong>en</strong>te con los cambios pertin<strong>en</strong>tes (<strong>en</strong> vez


288 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te<strong>de</strong> /home/jose <strong>de</strong>be aparecer tu directorio personal, <strong>en</strong> vez <strong>de</strong> borramugres <strong>de</strong>be aparecer elnombre que le hayas dado al programa para borra basura y <strong>en</strong> vez <strong>de</strong> la dirección <strong>de</strong> correojose@pateame.fci<strong>en</strong>cias.unam.mx <strong>de</strong>be aparecer la dirección <strong>de</strong> tu correo).#−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−# Borrado <strong>de</strong> 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:30 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 / mail −s’ borramugres ’ jose@pateame . f c i e n c i a s . unam . mx > / <strong>de</strong>v / n u l l 2>&1#Nota: A pesar <strong>de</strong> que se muestran dos líneas sin # <strong>en</strong> realidad es sólo una; si aparec<strong>en</strong> doses sólo para mejorar la pres<strong>en</strong>tación.Esta línea <strong>de</strong> crontab hace lo sigui<strong>en</strong>te:1. Ejecuta el comando <strong>en</strong>tre paréntesis, es <strong>de</strong>cir nuestro programa que borra basura.2. La salida <strong>de</strong>l programa, lo que éste escriba <strong>en</strong> la pantalla, se pasa a mail con tema borramugresy dirección <strong>de</strong> <strong>en</strong>vío jose@pateame.fci<strong>en</strong>cias.unam.mx. El resto <strong>de</strong> la líneaes para redireccionar la salida estándar <strong>de</strong> errores a la salida estándar y a su vez ésta es<strong>en</strong>viada a /<strong>de</strong>v/null (lo que equivale a tirarla a la basura).Convi<strong>en</strong>e ahora leer el manual <strong>de</strong> crontab para <strong>en</strong>t<strong>en</strong><strong>de</strong>r los primeros cinco campos <strong>de</strong> lalínea, que es<strong>en</strong>cialm<strong>en</strong>te indican cuándo <strong>de</strong>berá ejecutarse el resto <strong>de</strong> la línea; <strong>en</strong> este caso todoslos viernes (día 6) a los 30 minutos <strong>de</strong>spués <strong>de</strong> las 02 horas cualquier día (*) <strong>de</strong> cualquier mes(*).Sólo por no <strong>de</strong>jarHay una opción más para hacer el programa <strong>de</strong> eliminación <strong>de</strong> basura. Como ya se dijoantes, el último parámetro <strong>de</strong> <strong>en</strong>trada <strong>de</strong> find es lo que ti<strong>en</strong>e que hacer cada vez que se <strong>en</strong>cu<strong>en</strong>traun archivo que cumple con las condiciones buscadas. Es posible <strong>de</strong>cirle a find que, <strong>de</strong> hecho,ejecute otro comando y pasarle a dicho comando el nombre <strong>de</strong>l archivo <strong>en</strong>contrado por find;eso hace que puedas quitar los ciclos for que aparec<strong>en</strong> <strong>en</strong> el programa y que procesan la salida<strong>de</strong> find. Esto lo harías reemplazando todo el ciclo por una instrucción como la sigui<strong>en</strong>te:% /usr/bin/find . -name "core" -exec rm -f {} ’;’El significado <strong>de</strong> esta línea hasta antes <strong>de</strong> -exec es el que ya se ha explicado. -exec le indicaa find que ejecute un comando, <strong>en</strong> este caso rm. En el mom<strong>en</strong>to <strong>en</strong> que find ha <strong>en</strong>contrado unarchivo que cumple con la condición, guarda el nombre <strong>de</strong>l archivo <strong>en</strong>contrado para que puedaser pasado como parámetro <strong>de</strong>l comando que se ejecutará. Para hacer refer<strong>en</strong>cia a ese archivo<strong>en</strong>contrado se utiliza {}. Por último, para avisarle al programa ejecutado por find (rm <strong>en</strong> estecaso) que se han terminado los parámetros que le son pasados para su ejecución, se pone un ’;’<strong>en</strong>tre comilla simple (para que el shell no crea que se trata <strong>de</strong> un terminador <strong>de</strong> instrucción).En síntesis, el significado <strong>de</strong> la línea mostrada es: find busca a partir <strong>de</strong>l directorio actual (.)


9.2 Emacs 289archivos cuyo nombre (-name) cumpla con la condición <strong>de</strong> ser core; una vez que se <strong>en</strong>cu<strong>en</strong>trauno <strong>de</strong> ésos or<strong>de</strong>na la ejecución (-exec) <strong>de</strong> rm dici<strong>en</strong>do: rm -f {} ’;’ borra (rm), sin preguntar(-f) el archivo que <strong>en</strong>contré ({}) y nada más. Nota que todo lo que está <strong>de</strong>spués <strong>de</strong>l -exec es loque find le dice a rm.9.1.8. Para saber más9.2. Emacsbash es producto <strong>de</strong> la Free Software Foundation y pue<strong>de</strong>s <strong>en</strong>contrar información adicionalacerca <strong>de</strong> la programación <strong>en</strong> este shell <strong>en</strong>: http://www.gnu.org.También hay un tutorial <strong>de</strong> programación <strong>en</strong> bash accesible como docum<strong>en</strong>to HOWTO <strong>en</strong> el<strong>Linux</strong> Docum<strong>en</strong>tation Project: http://www.linuxdoc.org.9.2.1. La madre <strong>de</strong> todos los l<strong>en</strong>guajesA pesar <strong>de</strong> que Emacs es el editor <strong>de</strong> texto con mayor funcionalidad que ha existido <strong>en</strong> lahistoria <strong>de</strong> la computación, es increíble – incluso un poco loco – que sus usuarios inviertan tantotiempo <strong>en</strong> ext<strong>en</strong><strong>de</strong>r Emacs. Sin embargo, lo hacemos. En esta sección te mostramos por qué,para qué y cómo se hace.Para nosotros, programadores o apr<strong>en</strong>dices <strong>de</strong>, el editor <strong>de</strong> texto es una herrami<strong>en</strong>ta, útilpara crear más software. Haci<strong>en</strong>do un símil, po<strong>de</strong>mos p<strong>en</strong>sar <strong>en</strong> el editor <strong>de</strong> texto como unmartillo para un carpintero o una llave española para un mecánico, como algo útil para resolverla tarea <strong>en</strong> puerta. Entonces, ¿por qué Emacs es difer<strong>en</strong>te?La respuesta es que el carpintero y el mecánico modificarían sus herrami<strong>en</strong>tas para hacerlasmejores, si tan sólo supieran cómo. ¿Quién sabe mejor que ellos mismos lo que necesitan? Peroellos no son herreros y no pue<strong>de</strong>n modificarlas. Por otro lado, Emacs es un tipo <strong>de</strong> herrami<strong>en</strong>taespecial: es software, lo que significa que la herrami<strong>en</strong>ta está hecha <strong>de</strong> la misma cosa que losusuarios <strong>de</strong> Emacs hac<strong>en</strong> con Emacs. Por lo tanto, tú, nosotros y todos los usuarios/programadores<strong>de</strong> Emacs <strong>en</strong> el mundo estamos <strong>en</strong> la feliz posición <strong>de</strong> ser los herreros (diseñadores seríaun mejor término) <strong>de</strong> nuestra herrami<strong>en</strong>ta principal.Damos por hecho que conoces algún l<strong>en</strong>guaje <strong>de</strong> programación <strong>de</strong> alto nivel, aunque no esnecesario que manejes un l<strong>en</strong>guaje <strong>de</strong> la familia <strong>de</strong> Lisp. Desarrollaremos varios ejercicios <strong>de</strong>programación con ejemplos reales y que te serán <strong>de</strong> utilidad. Es <strong>de</strong> esperarse también que estésfamiliarizado con la terminología <strong>de</strong> Emacs; <strong>en</strong> caso contrario pue<strong>de</strong>s leer la sección llamadaEmacs <strong>en</strong> todos los capítulos anteriores <strong>de</strong> este libro.Emacs-Lisp es un l<strong>en</strong>guaje <strong>de</strong> programación muy gran<strong>de</strong> y no t<strong>en</strong>emos el tiempo sufici<strong>en</strong>tepara mostrar todas sus construcciones, pero int<strong>en</strong>taremos mostrarte sufici<strong>en</strong>te como para quepuedas manejar cómodam<strong>en</strong>te variables (creación, asignación, búsqueda, etc.), keymaps, comandosinteractivos, buffers y v<strong>en</strong>tanas.


290 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>tePor conv<strong>en</strong>i<strong>en</strong>cia, a lo largo <strong>de</strong> estas prácticas nos referiremos a Emacs Lisp, como elisp.También hablaremos <strong>de</strong>l l<strong>en</strong>guaje <strong>de</strong> programación LISP (LISt Processing) y <strong>en</strong> g<strong>en</strong>eral noharemos distinción <strong>en</strong>tre este último y elisp: para propósitos <strong>de</strong> este material, hablaremos indistintam<strong>en</strong>te<strong>de</strong> LISP o Emacs-Lisp como elisp o simplem<strong>en</strong>te LISP.9.2.2. LISP <strong>en</strong> 15 minutosLISP maneja listas (y listas <strong>de</strong> listas) y éstas se pres<strong>en</strong>tan <strong>en</strong>tre paréntesis. Muchas veces<strong>en</strong>contrarás las listas precedidas por un apóstrofo (’). Las listas son la parte medular <strong>de</strong> LISP.Listas <strong>en</strong> elispEn elisp una lista luce como ’(rosa violeta clavel azuc<strong>en</strong>a). Esta lista está precedidapor un apóstrofo. Los elem<strong>en</strong>tos <strong>de</strong> la lista son nombres <strong>de</strong> distintas flores, separados <strong>en</strong>tre sípor un espacio <strong>en</strong> blanco, aunque cabe aclarar que el número <strong>de</strong> blancos (espacios <strong>en</strong> blanco,tabuladores o nuevas líneas) no es relevante.Las listas también pue<strong>de</strong>n t<strong>en</strong>er números <strong>de</strong>ntro, por ejemplo (+ 2 2), que ti<strong>en</strong>e al símbolo’+’ y al número 2, dos veces.En elisp, tanto los datos como los programas se repres<strong>en</strong>tan <strong>de</strong> la misma forma, esto es, sonlistas <strong>de</strong> símbolos, números o bi<strong>en</strong> otras listas, separadas por blancos y ro<strong>de</strong>adas por paréntesis(dado que los programas luc<strong>en</strong> como datos, pue<strong>de</strong>n pasarse a otros programas; esto significaque los programas <strong>en</strong> elisp también son elem<strong>en</strong>tos <strong>de</strong> primera clase y esto constituye una granherrami<strong>en</strong>ta <strong>de</strong> elisp).Átomos <strong>en</strong> elispEn elisp, a los elem<strong>en</strong>tos o palabras que hemos usado <strong>en</strong> nuestras listas arriba, los llamamosátomos. Los átomos, <strong>de</strong>s<strong>de</strong> el punto <strong>de</strong> vista <strong>de</strong> elisp, son unida<strong>de</strong>s indivisibles, al igual quelos números y carácteres como ‘+’. Por el contrario, las listas, como veremos más a<strong>de</strong>lante, sípue<strong>de</strong>n ser divididas (sección 9.6).Ya dijimos que una lista pue<strong>de</strong> t<strong>en</strong>er átomos, números y otras listas, pero hay un casoparticular y es la lista que no ti<strong>en</strong>e nada, y que gráficam<strong>en</strong>te luce así: ( ); se llama la lista vacía,también repres<strong>en</strong>tada por nil. Esta lista vacía ti<strong>en</strong>e la facultad <strong>de</strong> ser una lista y un símbolo almismo tiempo.La repres<strong>en</strong>tación escrita <strong>de</strong> listas y átomos se conoce como expresión simbólicas (symbolicexpression), o bi<strong>en</strong> s-expression. Aclaramos que la repres<strong>en</strong>tación escrita no ti<strong>en</strong>e nada que vercon la forma interna <strong>de</strong> las expresiones.En elisp siempre trabajamos con átomos y listas, pero usualm<strong>en</strong>te a los programadoresles gusta hablar <strong>en</strong> términos más precisos <strong>de</strong> los átomos que usan. Así, t<strong>en</strong>emos varios tipos<strong>de</strong> átomos: números, por ejemplo 13, 295 o 1763; y símbolos tales como ‘+’, ‘foo’, ‘forwardline’,etc.; todos los nombres que hemos usado <strong>en</strong> las listas <strong>de</strong> ejemplo, aquí arriba, también


9.2 Emacs 291son símbolos. Adicionalm<strong>en</strong>te, cualquier texto <strong>en</strong>trecomillado, incluy<strong>en</strong>do oraciones o párrafoscompletos, es un símbolo. Por ejemplo:’ ( e s t a l i s t a i n c l u y e " t e x t o e n t r e c o m i l l a s d o b l e s . " )es una lista que ti<strong>en</strong>e cuatro símbolos. En elisp todo el texto <strong>en</strong>tre comillas, incluy<strong>en</strong>do el signo<strong>de</strong> puntuación y los blancos, es un átomo. Este tipo particular <strong>de</strong> átomo se conoce como ca<strong>de</strong>nay es el tipo <strong>de</strong> átomos que se utiliza para comunicar m<strong>en</strong>sajes que un humano pue<strong>de</strong> leer. Lasca<strong>de</strong>nas son un tipo distinto <strong>de</strong> átomo a los números y símbolos y no sólo por su forma, sinotambién por su uso.Dado que los blancos <strong>en</strong> una lista no importan, las sigui<strong>en</strong>tes son repres<strong>en</strong>taciones <strong>de</strong> lamisma lista:’ ( e s t a l i s t al u c e a s i )’ ( e s t a l i s t a l u c e a s i )’ ( e s t al i s t al u c ea s i )Por extraño que parezca, ¡hemos cubierto con estos breves ejemplos casi todo lo que po<strong>de</strong>mosver <strong>en</strong> elisp! Todo lo <strong>de</strong>más son combinaciones <strong>de</strong> lo anterior, aunque posiblem<strong>en</strong>teusando listas más largas y anidadas, pero ningún concepto nuevo. Hay muchas construccionesesotéricas <strong>en</strong> elisp que utilizan otro tipo <strong>de</strong> átomos, pero no son comunes y po<strong>de</strong>mos avanzarmucho sin conocerlas.En resum<strong>en</strong>, no <strong>de</strong>bes olvidar que: una lista va <strong>en</strong>tre paréntesis, una ca<strong>de</strong>na <strong>en</strong>tre comillasdobles, un símbolo luce como una palabra (o secu<strong>en</strong>cia <strong>de</strong> ellas, unidas por algún carácter noblanco) y un número luce como un número.Emacs te ayuda a dar formato a código <strong>en</strong> elispSi tecleas una expresión <strong>de</strong> elisp <strong>en</strong> Emacs usando ya sea el modo <strong>de</strong> elisp Interaction, oEmacs LISP Mo<strong>de</strong>, <strong>en</strong>tonces Emacs te proveerá con sufici<strong>en</strong>tes comandos para que la expresiónsea fácilm<strong>en</strong>te legible. Por ejemplo, presionando TAB automáticam<strong>en</strong>te in<strong>de</strong>ntará la expresión<strong>en</strong> el r<strong>en</strong>glón actual usando el número a<strong>de</strong>cuado <strong>de</strong> espacios.A<strong>de</strong>más, cuando tecleas un paréntesis que cierra, Emacs mom<strong>en</strong>táneam<strong>en</strong>te saltará al paréntesiscorrespondi<strong>en</strong>te que abre, <strong>de</strong> forma tal que tú pue<strong>de</strong>s siempre ver cuál es y <strong>de</strong>tectarerrores rápidam<strong>en</strong>te.Nota: El modo mayor elisp Interaction es el modo <strong>en</strong> que por omisión se <strong>en</strong>cu<strong>en</strong>tra el buffer*scratch*, que casualm<strong>en</strong>te es el único buffer que existe cuando inicias Emacs.


292 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teEjecución <strong>de</strong> programasUna lista <strong>en</strong> elisp es un programa listo para ser ejecutado. Si lo ejecutas (evalúas <strong>en</strong> el caló<strong>de</strong> elisp) hará una <strong>de</strong> tres posibles cosas: nada, excepto regresar la lista misma; mandarte unm<strong>en</strong>saje <strong>de</strong> error o tratar el primer símbolo <strong>en</strong> la lista como un comando para hacer algo.El apóstrofo s<strong>en</strong>cillo que aparece <strong>en</strong> algunas <strong>de</strong> las listas <strong>de</strong> ejemplo <strong>en</strong> la sección anteriorse llama quote (es una función). Cuando prece<strong>de</strong> a una lista, le dice a elisp que no haga nadacon ella excepto tomarla tal y como está escrita. En cambio, si no aparece un apóstrofo <strong>de</strong>lante<strong>de</strong> la lista, <strong>en</strong>tonces elisp interpreta el primer elem<strong>en</strong>to <strong>en</strong> la lista como un comando que ti<strong>en</strong>eque obe<strong>de</strong>cer. En elisp estos comandos se llaman funciones. La lista (+ 2 2) arriba no t<strong>en</strong>ía unapóstrofo, por lo que elisp <strong>en</strong>ti<strong>en</strong><strong>de</strong> el + como una función que hace algo con el resto <strong>de</strong> loselem<strong>en</strong>tos <strong>en</strong> la lista, <strong>en</strong> este caso, sumar los elem<strong>en</strong>tos <strong>en</strong> la lista.Actividad 9.23 Teclea (+ 2 2) <strong>en</strong> el buffer *scratch*, pon el cursor justo <strong>de</strong>spués <strong>de</strong>l paréntesisque cierra y luego teclea C-x C-e .Lo que acabas <strong>de</strong> hacer se conoce como evaluar la lista.Actividad 9.24 Ahora haz lo mismo, pero con una lista que esté precedida con un apóstrofo,por ejemplo, ’(que bonito ). ¿Qué pasa?Cuando una lista está precedida por un apóstrofo, <strong>en</strong>tonces el intérprete <strong>de</strong> elisp no interpretala lista, la lee <strong>de</strong> manera textual. Nos referiremos a este tipo <strong>de</strong> listas como listas textuales,citadas, inmutables o constantes.M<strong>en</strong>sajes <strong>de</strong> errorA continuación te pediremos que evalúes una expresión que hará que el intérprete <strong>de</strong> elispmarque un error. Lo hacemos por varias razones: la primera y más importante, para mostrarteque no pasa nada malo, es una actividad inof<strong>en</strong>siva; haremos esto varias veces a lo largo <strong>de</strong> lasección. La segunda razón es para que te acostumbres al l<strong>en</strong>guaje y la forma <strong>de</strong> los m<strong>en</strong>sajes<strong>de</strong> error, ya que una vez que los <strong>en</strong>ti<strong>en</strong>das te darás cu<strong>en</strong>ta que son muy informativos. Pue<strong>de</strong>sp<strong>en</strong>sar <strong>en</strong> estos m<strong>en</strong>sajes <strong>de</strong> error como señalización para el viajero <strong>de</strong> las carreteras <strong>de</strong> elisp:son crípticos al principio (como casi cualquier otro tipo <strong>de</strong> señalización), pero una vez que los<strong>en</strong>ti<strong>en</strong><strong>de</strong>s, te llevan <strong>de</strong> la mano a tu <strong>de</strong>stino final.Lo que haremos, y ese es tu sigui<strong>en</strong>te ejercicio, será evaluar una lista que no está citada yque no ti<strong>en</strong>e un nombre <strong>de</strong> función como su primer elem<strong>en</strong>to. Hazlo:Actividad 9.25 Evalúa la sigui<strong>en</strong>te lista: ( esta lista marca un error ).Después <strong>de</strong> hacer eso, <strong>de</strong>biste recibir el m<strong>en</strong>saje: Symbol’s function <strong>de</strong>finition is void: esta,¿cierto? Dado que este tipo <strong>de</strong> m<strong>en</strong>sajes es muy frecu<strong>en</strong>te, a continuación te pres<strong>en</strong>tamos unaexplicación, aunque ya <strong>de</strong>bes t<strong>en</strong>er una bu<strong>en</strong>a i<strong>de</strong>a <strong>de</strong> lo que el m<strong>en</strong>saje significa.Sabemos que el problema fue ocasionado por el símbolo esta; también se m<strong>en</strong>ciona la palabrafunction, una palabra muy importante. Para efectos prácticos, valga la sigui<strong>en</strong>te <strong>de</strong>finición


9.2 Emacs 293<strong>de</strong> función: un conjunto <strong>de</strong> instrucciones para la computadora que le indican lo que <strong>de</strong>be hacer.En realidad, el símbolo le dice a la computadora dón<strong>de</strong> <strong>en</strong>contrar las instrucciones a ejecutar.Ahora sí, estamos <strong>en</strong> posición <strong>de</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>r <strong>en</strong> su totalidad el m<strong>en</strong>saje <strong>de</strong> error: el símboloesta no conti<strong>en</strong>e la <strong>de</strong>finición <strong>de</strong> conjunto alguno <strong>de</strong> instrucciones para la computadora.La extraña frase Symbol’s function <strong>de</strong>finition is void ti<strong>en</strong>e que ver con la forma <strong>en</strong> queEmacs está implem<strong>en</strong>tado, ya que cuando un símbolo no ti<strong>en</strong>e un conjunto <strong>de</strong> instruccionesasociado, el lugar don<strong>de</strong> tal conjunto (<strong>de</strong> existir) <strong>de</strong>bería estar, es ocupado por la función void,que no hace nada.Por otro lado, dado que sí pudimos sumar 2 y 2 evaluando (+ 2 2), po<strong>de</strong>mos inferir que elsímbolo + <strong>de</strong>be t<strong>en</strong>er un conjunto <strong>de</strong> instrucciones que la computadora obe<strong>de</strong>ce; esta instrucciónsuman los dos números.Finalm<strong>en</strong>te, <strong>de</strong>bes saber que los símbolos también se usan para nombrar variables o funciones.Esto no quiere <strong>de</strong>cir que el símbolo, por ejemplo +, sea la función, sino simplem<strong>en</strong>te unarefer<strong>en</strong>cia al lugar don<strong>de</strong> están las instrucciones que hac<strong>en</strong> a la función. Su papel es similar al<strong>de</strong> los nombres que t<strong>en</strong>emos las personas, nuestro amigo Juan Pérez, pue<strong>de</strong> ser referido comoJuan, pero no es las letras J, u, a, n. De la misma manera, las instrucciones que le dic<strong>en</strong> a lacomputadora que sume una lista <strong>de</strong> números (y cómo hacerlo) no son +.Más aún, elisp nos permite poner varios nombres a un mismo conjunto <strong>de</strong> instrucciones. Parasumar dos números podríamos hacer que un nuevo nombre, digamos suma, haga refer<strong>en</strong>ciaa las mismas instrucciones que +.El intérprete <strong>de</strong> elispYa <strong>de</strong>bes t<strong>en</strong>er una bu<strong>en</strong>a i<strong>de</strong>a <strong>de</strong> qué hace el intérprete <strong>de</strong> elisp cuando <strong>en</strong>cu<strong>en</strong>tra una lista:si es inmutable, regresa la lista; si el primer elem<strong>en</strong>to es un símbolo, busca su conjunto <strong>de</strong> instruccionesasociado y los ejecuta usando el resto <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong> la lista como parámetros;si el conjunto <strong>de</strong> instrucciones asociado es void, marca un error. Muy s<strong>en</strong>cillo, ¿no? Sin embargo,hay varias complicaciones que necesitas <strong>en</strong>t<strong>en</strong><strong>de</strong>r para seguir apr<strong>en</strong>di<strong>en</strong>do elisp y com<strong>en</strong>zara programar:A<strong>de</strong>más <strong>de</strong> listas, elisp pue<strong>de</strong> interpretar también símbolos (sin paréntesis alre<strong>de</strong>dor y sinquote), <strong>en</strong> cuyo caso el intérprete int<strong>en</strong>tará <strong>de</strong>terminar el valor <strong>de</strong>l símbolo como variable.Regresaremos a esto más tar<strong>de</strong>.Algunas funciones no trabajan igual que la evaluación <strong>de</strong> listas. Se llaman formas especialesy se usan para cosas muy particulares, como <strong>de</strong>finir funciones. No hay muchas y lasiremos revisando conforme avancemos.Si lo que el intérprete está tratando <strong>de</strong> evaluar no es una forma especial, y sí es parte <strong>de</strong>una lista, el intérprete revisa si la lista ti<strong>en</strong>e otra lista a<strong>de</strong>ntro. Si hay una lista a<strong>de</strong>ntro,primero ve qué <strong>de</strong>be hacer con ella y si a su vez ti<strong>en</strong>e otra lista a<strong>de</strong>ntro, primero hace ésa yasí sucesivam<strong>en</strong>te. Una vez que concluye su trabajo (<strong>de</strong> evaluación) con las listas internas,hace lo que ti<strong>en</strong>e que hacer con la lista actual.


294 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teVariablesEn cualquier otro caso, el intérprete va evaluando <strong>de</strong> izquierda a <strong>de</strong>recha y <strong>de</strong> expresión <strong>en</strong>expresión.La última <strong>de</strong> las complicaciones listadas arriba es la más interesante <strong>de</strong> todas y la más abstractatambién. ¿Por qué evalúa <strong>de</strong> a<strong>de</strong>ntro hacia afuera? La respuesta ti<strong>en</strong>e dos partes: primero<strong>de</strong>bes saber que toda evaluación <strong>en</strong> elisp regresa un valor (o bi<strong>en</strong> termina <strong>en</strong> error); lo segundoque te interesa saber es que el valor lo regresa al punto <strong>de</strong> llamada. Entonces, las expresionesmás externas esperan, por <strong>de</strong>cirlo <strong>de</strong> alguna forma, a los valores que regresan las expresionesanidadas para usarlos. Por ejemplo, veamos que suce<strong>de</strong> cuando evaluamos (+ 2 (+ 3 4)); hazlo:evalúa esa expresión.Verás 9 aparecer <strong>en</strong> el área <strong>de</strong> eco. Y eso sólo pue<strong>de</strong> suce<strong>de</strong>r si primero se evalúa (+ 3 4)a 7, y ese valor es visto y usado por la otra aplicación <strong>de</strong> +, como si <strong>en</strong> realidad estuvierasevaluando: (+ 2 7).Ahora estás <strong>en</strong> posición <strong>de</strong> saber que C-x C-e evalúa el comando eval-last-sexp 4Actividad 9.26 Evalúa la expresión (+ 2 (+ 3 4)), <strong>en</strong> distintas partes <strong>de</strong> la misma. Por ejemplo,pon el cursor al final y evalúa (<strong>de</strong>bes obt<strong>en</strong>er 9 otra vez); coloca el cursor sobre el últimoparéntesis – o <strong>de</strong>trás <strong>de</strong>l paréntesis que cierra (+ 3 4) – y atrás <strong>de</strong> un número, etc. ¿Qué pasa?¿Pue<strong>de</strong>s explicar por qué pasa eso?En elisp un símbolo pue<strong>de</strong> t<strong>en</strong>er un valor asociado a él, al igual que una función, como yavimos. Nota que son cosas distintas: una función es un conjunto <strong>de</strong> instrucciones, mi<strong>en</strong>tras queun valor es algo, como un número o un nombre que pue<strong>de</strong> cambiar; <strong>de</strong> este hecho se <strong>de</strong>spr<strong>en</strong><strong>de</strong>el nombre variable, que es el nombre con el que conocemos a los símbolos que repres<strong>en</strong>tan unvalor.Algo muy importante es que un símbolo pue<strong>de</strong> t<strong>en</strong>er tanto un valor como una funciónasociados. Pue<strong>de</strong>s p<strong>en</strong>sar <strong>en</strong> un símbolo como una cajonera, <strong>en</strong> una cajón se guarda el valor y<strong>en</strong> otro las instrucciones que conforman la función. Entonces pue<strong>de</strong>s cambiar el cont<strong>en</strong>ido <strong>de</strong>uno <strong>de</strong> los cajones sin perturbar al otro.Por ejemplo, fill-column es una variable que existe <strong>en</strong> todos los buffers <strong>de</strong> Emacs. Parasaber su valor pue<strong>de</strong>s evaluarla y verás que su valor es usualm<strong>en</strong>te 70 o 72.En el caló <strong>de</strong> elisp, <strong>de</strong>cimos que una variable es o está ligada a un valor: un número, como70, una ca<strong>de</strong>na "como esta" o a una lista (como esta otra ). Incluso po<strong>de</strong>mos <strong>en</strong>lazar una variablea la <strong>de</strong>finición <strong>de</strong> una función.Otra forma muy común <strong>de</strong> evaluación es M-: (eval-expression). Esta función vi<strong>en</strong>e <strong>de</strong>sactivadapor omisión, así que la primera vez que la ejecutes, <strong>en</strong> lugar <strong>de</strong> un prompt <strong>de</strong>l estiloEval: <strong>en</strong> el área <strong>de</strong> eco, Emacs te hará preguntas que te permit<strong>en</strong> <strong>de</strong>cidir qué hacer: activarel comando sólo por esta ocasión, pero <strong>de</strong>jarlo <strong>de</strong>sactivado; activarlo (perman<strong>en</strong>tem<strong>en</strong>te); o nohacer nada. Se consi<strong>de</strong>ra un comando peligroso para novatos <strong>en</strong> Emacs, pero tú ya no eres unnovato.4 El sexp abrevia symbolic expression y se lee “sex pee”. En español es poco usual llamarle “evaluación<strong>de</strong> expresiones simbólicas” a la acción <strong>de</strong> eval-last-sexp y nos referimos a dicha acción simplem<strong>en</strong>tecomo evaluación.


9.2 Emacs 295Recapitulando, ahora sabes que una opción para evaluar, que hemos usado mucho, es ponerla expresión <strong>en</strong> un buffer <strong>de</strong> Emacs, poner el cursor al final <strong>de</strong> la expresión y luego ejecutarC-x C-e . Ahora ti<strong>en</strong>es otra opción: M-: y <strong>de</strong>spués <strong>de</strong>l prompt Eval: escribir la expresión ypresionar Enter .Actividad 9.27 Prueba evaluar algunos <strong>de</strong> los ejemplos que hemos revisado hasta el mom<strong>en</strong>tousando M-: . Nota los aspectos bu<strong>en</strong>os y malos <strong>de</strong> ambos <strong>en</strong>foques. T<strong>en</strong>er las dos formas esmuy útil y <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>l contexto pue<strong>de</strong>s escoger la que más te conv<strong>en</strong>ga.¿Notaste que <strong>en</strong> la evaluación <strong>de</strong> fill-column no usaste paréntesis? Prueba evaluar( fill −column), ¿por qué marca un error?Ahora pon el cursor <strong>en</strong> el espacio <strong>en</strong> blanco <strong>de</strong>spués <strong>de</strong>l símbolo +, <strong>en</strong> la expresión (+ 2 2),y evalúa. ¿Qué error marca? ¿Es igual a los errores anteriores? Si no son iguales, ¿cuál es ladifer<strong>en</strong>cia <strong>en</strong>tre ellos? Explica.Argum<strong>en</strong>tos y tipos <strong>de</strong> argum<strong>en</strong>tosPara redon<strong>de</strong>ar la discusión sobre evaluación <strong>en</strong> elisp, también t<strong>en</strong>emos que hablar <strong>de</strong> laforma <strong>en</strong> que el intérprete reconoce y pasa los operandos a las funciones. Verbigracia, <strong>en</strong> nuestroejemplo favorito, (+ 2 2), el intérprete regresa 4 y <strong>de</strong>cimos que los dos números (ambos 2) quesigu<strong>en</strong> al + son los argum<strong>en</strong>tos <strong>de</strong> la función. Ellos constituy<strong>en</strong> la información que el intérpretepasa a la función.En elisp, los argum<strong>en</strong>tos son los símbolos o listas que sigu<strong>en</strong> al nombre <strong>de</strong> la función.Distintas funciones requier<strong>en</strong> distintos números <strong>de</strong> argum<strong>en</strong>tos: algunas no recib<strong>en</strong> ningún argum<strong>en</strong>toy otras recib<strong>en</strong> un número variable <strong>de</strong> argum<strong>en</strong>tos.¿De qué tipo <strong>de</strong>be ser el argum<strong>en</strong>to que pasamos a una función? Dep<strong>en</strong><strong>de</strong> <strong>de</strong>l tipo <strong>de</strong> informaciónque requiera la función para llevar a cabo sus acciones. +, por ejemplo, sólo recib<strong>en</strong>úmeros (¡o carácteres!), mi<strong>en</strong>tras que concat, por m<strong>en</strong>cionar otra función, recibe ca<strong>de</strong>nas. Porejemplo, si evaluamos( c o n c a t " abc " " d e f " )obt<strong>en</strong>dremos "abc<strong>de</strong>f", es <strong>de</strong>cir concat concat<strong>en</strong>a todos sus argum<strong>en</strong>tos (ca<strong>de</strong>nas) <strong>en</strong> una solaca<strong>de</strong>na.Una función como substring recibe tanto una ca<strong>de</strong>na como números. Lo que hace es regresaruna subca<strong>de</strong>na <strong>de</strong>l primer argum<strong>en</strong>to (ca<strong>de</strong>na). Por ejemplo,( s u b s t r i n g " que b o n i t o es Emacs e l i s p " 14 19)regresa "Emacs". El primer argum<strong>en</strong>to, como pue<strong>de</strong>s notar, es una ca<strong>de</strong>na; el segundo es la posición(<strong>de</strong>ntro <strong>de</strong> esa ca<strong>de</strong>na, empezando a contar <strong>de</strong>s<strong>de</strong> 0) <strong>de</strong>s<strong>de</strong> don<strong>de</strong> será tomada la subca<strong>de</strong>naresultado; el segundo número (tercer argum<strong>en</strong>to) es la posición a la <strong>de</strong>recha don<strong>de</strong> <strong>de</strong>be terminarla subca<strong>de</strong>na.Los valores que regresan las funciones <strong>en</strong> elisp también pue<strong>de</strong>n ser usados como argum<strong>en</strong>tos.Actividad 9.28 Evalúa las sigui<strong>en</strong>tes expresiones y explica cada uno <strong>de</strong> los resultados. Si no<strong>en</strong>ti<strong>en</strong><strong>de</strong>s algún resultado, evalúa las subexpresiones hasta que <strong>en</strong>cu<strong>en</strong>tres cuál es el truco.


296 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te(+ 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 " ( number−to−s t r i n g (+ 2 f i l l −column ) )" l i n d o s g a t i t o s . " )( + )( ∗ )(+ 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 función number-to-string? ¿Qué tipo <strong>de</strong> argum<strong>en</strong>tos recibe y cuántos?La función messageAl igual que la función +, message recibe un número variable <strong>de</strong> argum<strong>en</strong>tos. Se usa para<strong>en</strong>viar m<strong>en</strong>sajes al usuario y es tan útil que incluso ti<strong>en</strong>e su propia sección.Con esta función se consigue que un m<strong>en</strong>saje se <strong>de</strong>spliegue <strong>en</strong> el área <strong>de</strong> eco. Por ejemplo,pue<strong>de</strong>s <strong>de</strong>splegar un m<strong>en</strong>saje evaluando lo sigui<strong>en</strong>te:( message " Esto es un b o n i t o m<strong>en</strong>saje <strong>de</strong> p r u e b a " )Nota que el m<strong>en</strong>saje aparece <strong>en</strong> el área <strong>de</strong> eco incluso con las comillas. Eso suce<strong>de</strong> porqueése es el valor regresado por la función message. Usualm<strong>en</strong>te, cuando tú usas message <strong>en</strong>tus programas, esto no suce<strong>de</strong>rá y el texto que verás se imprimirá como un efecto secundario,sin las comillas.Sin embargo, si hay un %s <strong>en</strong> el argum<strong>en</strong>to <strong>en</strong>trecomillado <strong>de</strong> message, no imprimiráun %s <strong>en</strong> el área <strong>de</strong> eco, sino que buscará un argum<strong>en</strong>to <strong>de</strong>spués <strong>de</strong>l argum<strong>en</strong>to <strong>en</strong>trecomillado,lo evaluará y pondrá su valor <strong>en</strong> la posición <strong>de</strong>l %s <strong>en</strong> la ca<strong>de</strong>na. Por ejemplo,( message " El nombre <strong>de</strong> e s t e b u f f e r es : %s " ( b u f f e r −name ) )imprimirá algo como: "El nombre <strong>de</strong> este buffer es: ∗ scratch ∗" al ser evaluada, suponi<strong>en</strong>do quesí estés <strong>en</strong> un buffer llamado *scratch* – cuando ejecutamos esto, sí estábamos <strong>en</strong> uno llamadoasí –.Si lo que quieres es imprimir un número <strong>en</strong> notación <strong>de</strong>cimal, <strong>en</strong>tonces cambia el %s porun %d, como por ejemplo:( message " El v a l o r <strong>de</strong> f i l l −column es : %d " f i l l −column )Si hay más <strong>de</strong> un %s <strong>en</strong> la ca<strong>de</strong>na <strong>en</strong>tre comillas, <strong>en</strong>tonces el primer argum<strong>en</strong>to que siga ala ca<strong>de</strong>na será puesto <strong>en</strong> el lugar <strong>de</strong>l primer %s, el segundo argum<strong>en</strong>to sustituirá al segundo %s,y así sucesivam<strong>en</strong>te. Por ejemplo:( message " Hay %d % s <strong>en</strong> e l l a b o r a t o r i o "(− f i l l −column 15) " e l e f a n t e s r o s a s " )


9.2 Emacs 297imprimirá "Hay 55 elefantes rosas <strong>en</strong> el laboratorio ".Lo valioso <strong>de</strong> message es que si lo usas con formato ( %), le pue<strong>de</strong>s pedir que evalúefunciones al mom<strong>en</strong>to <strong>de</strong> evaluarse ella misma.Asignar valores a una variablesetqHay varias formas por medio <strong>de</strong> las cuales po<strong>de</strong>mos darle un valor a una variable. Aquíveremos setq. Más a<strong>de</strong>lante hablaremos <strong>de</strong> let. En elisp <strong>de</strong>cimos que estamos ligando unavariable a un valor.En esta sección veremos cómo funciona setq 5 y cómo se pasan los argum<strong>en</strong>tos.Para asignarle a la variable flores la lista ’( rosa violetasigui<strong>en</strong>te expresión:clavel azuc<strong>en</strong>a) pue<strong>de</strong>s evaluar laContador( s e t q f l o r e s ’ ( r o s a v i o l e t a c l a v e l azuc<strong>en</strong>a ) )Verás la lista ( rosa violeta clavel azuc<strong>en</strong>a) aparecer <strong>en</strong> el área <strong>de</strong> eco. Esta lista es el valor <strong>de</strong>regreso <strong>de</strong> la función y, como efecto secundario, la variable (el símbolo) flores está ahora ligadoa la lista. Es <strong>de</strong>cir, que <strong>de</strong>spués <strong>de</strong> evaluar la expresión <strong>de</strong> arriba pue<strong>de</strong>s evaluar el símbolo yverás la lista aparecer <strong>en</strong> el área <strong>de</strong> eco.Con setq también po<strong>de</strong>mos asignar valores a varias variables al mismo tiempo. Por ejemplo,para asignar una lista <strong>de</strong> flores a la variable flores y una lista <strong>de</strong> animales a la variable animales,po<strong>de</strong>mos hacer:( s e t q f l o r e s ’ ( r o s a v i o l e t a c l a v e l azuc<strong>en</strong>a )a n i m a l e s ’ ( l e ón sapo oso p e r r o ) )Nota que la expresión bi<strong>en</strong> podría ir toda <strong>en</strong> una línea, pero tal vez no hubiese cabido <strong>en</strong>la página y a<strong>de</strong>más los humanos po<strong>de</strong>mos leer con mayor facilidad listas con un formato másagradable.A pesar <strong>de</strong> que hemos usado hasta el mom<strong>en</strong>to el término ligar, hay otra forma <strong>de</strong> referirnosal trabajo que realiza setq y es <strong>de</strong>cir que setq hace que el símbolo apunte a la lista. Esto tambiénse llama refer<strong>en</strong>cia y es muy común, así que a partir <strong>de</strong> este mom<strong>en</strong>to nos referiremos a estetipo <strong>de</strong> asignaciones así.En esta sección construiremos un contador (muy s<strong>en</strong>cillo) que usa setq. Dicho contadorpue<strong>de</strong> ser usado para contar cuántas veces se repite una cierta parte <strong>de</strong> tu programa. Primeronecesitamos inicializar una variable a cero; luego añadir uno a esa variable cada vez que se repitaesa parte <strong>en</strong> el programa. Para hacer esto, necesitas una variable que sirva <strong>de</strong> contador y dos5 setq <strong>en</strong> realidad es una abreviatura <strong>de</strong> la combinación <strong>de</strong> las funciones set y quote.


298 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teexpresiones: un setq que asigne cero al contador; una segunda expresión setq que increm<strong>en</strong>teel contador cada vez que es evaluado.( s e t q c o n t a d o r 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 ) ) ; I n c r e m e n t oc o n t a d o rEl texto que sigue a un carácter ; y hasta el fin <strong>de</strong> línea, es un com<strong>en</strong>tario que es ignoradopor el intérprete <strong>de</strong> elisp.Si evalúas la primera <strong>de</strong> estas expresiones, la inicialización, y luego evalúas la tercer expresión,el contador, el número 0 aparecerá <strong>en</strong> el área <strong>de</strong> eco. Si evalúas <strong>en</strong>tonces la segundaexpresión, el increm<strong>en</strong>to, el contador aum<strong>en</strong>tará <strong>en</strong> 1 su valor; así, si evalúas nuevam<strong>en</strong>te latercera expresión, <strong>en</strong>tonces verás el número 1 aparecer <strong>en</strong> el área <strong>de</strong> eco. Cada vez que evalúesla segunda expresión, el valor <strong>de</strong> contador aum<strong>en</strong>tará <strong>en</strong> 1.Actividad 9.29 Evalúa varias veces la segunda y tercera expresiones <strong>de</strong> manera alternada;<strong>de</strong>spués explica con <strong>de</strong>talle cómo evalúa la segunda expresión el intérprete <strong>de</strong> elisp.9.2.3. Resum<strong>en</strong>Apr<strong>en</strong><strong>de</strong>r elisp es como escalar una montaña <strong>en</strong> la que la primera parte es la más difícil. Túya subiste esa parte, así que lo que sigue se irá haci<strong>en</strong>do más s<strong>en</strong>cillo conforme avancemos.En resum<strong>en</strong>:Los programas <strong>en</strong> elisp están formados por expresiones, que son listas o átomos.Las listas están formadas por cero o más átomos y listas interiores, separadas por espacios<strong>en</strong> blanco y ro<strong>de</strong>adas por paréntesis. Una lista pue<strong>de</strong> ser vacía.Los átomos son símbolos (palabras) como forward−paragraph, símbolos <strong>de</strong> un sólo caráctercomo +, ca<strong>de</strong>nas <strong>de</strong> carácteres o números.Un número se evalúa a sí mismo.Una ca<strong>de</strong>na también se evalúa a sí misma.Cuando evalúas un símbolo, regresa su valor.Cuando evalúas una lista, el intérprete <strong>de</strong> elisp checa el primer símbolo <strong>en</strong> la lista y luegoa la función ligada a ese símbolo, luego las instrucciones <strong>en</strong> la función son ejecutadas.Un sólo apóstrofo le indica al intérprete que <strong>de</strong>be regresar la sigui<strong>en</strong>te expresión tal ycomo está escrita y no evaluarla.Los argum<strong>en</strong>tos son la información pasada a una función. Los argum<strong>en</strong>tos <strong>de</strong> una funciónse calculan evaluando el resto <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong> la lista, <strong>en</strong> la cual la función aparececomo el primer elem<strong>en</strong>to.Una función siempre regresa un valor cuando se evalúa (a m<strong>en</strong>os que g<strong>en</strong>ere un error);a<strong>de</strong>más, también pue<strong>de</strong> llevar a cabo alguna otra acción, llamada “efecto secundario”. Enmuchos casos, el propósito principal <strong>de</strong> una función es crear un efecto secundario.


9.3 Evaluaciones 299Actividad 9.30 Crea un contador que increm<strong>en</strong>te <strong>de</strong> 2 <strong>en</strong> 2. A<strong>de</strong>más, escribe una expresión <strong>de</strong>tal forma que cuando se evalúe <strong>de</strong>spliegue un m<strong>en</strong>saje que diga “El valor <strong>de</strong>l contador es X”,don<strong>de</strong> X <strong>de</strong>berá ser el valor actual <strong>de</strong>l contador.9.3. Practicando evaluacionesAntes <strong>de</strong> que apr<strong>en</strong>das a escribir <strong>de</strong>finiciones <strong>de</strong> funciones <strong>en</strong> elisp, es importante quepractiques evaluando funciones que ya fueron escritas. Estas expresiones serán listas con losnombres <strong>de</strong> las funciones como su primer (y <strong>en</strong> muchos casos único) elem<strong>en</strong>to. Com<strong>en</strong>zaremoscon algunas funciones relacionadas con buffers, ya que son s<strong>en</strong>cillas e interesantes.Siempre que das un comando <strong>de</strong> edición a elisp, tal como el comando para moverel cursor o recorrer la pantalla, estás evaluando una expresión, cuyo primer elem<strong>en</strong>toes una función. Así funciona Emacs.Cuando tecleas carácteres, provocas que el intérprete <strong>de</strong> elisp evalúe expresiones y así escomo obti<strong>en</strong>es resultados. Incluso teclear simple texto involucra evaluación <strong>de</strong> funciones <strong>de</strong>elisp. En este caso, veremos una que usa self-insert-command, que simplem<strong>en</strong>te inserta elcarácter que tecleaste. Las funciones que evalúas tecleando alguna combinación <strong>de</strong> teclas sellaman funciones interactivas o comandos; cómo crear este tipo <strong>de</strong> funciones lo veremos mása<strong>de</strong>lante, <strong>en</strong> la sección 9.4.1.9.3.1. Nombres <strong>de</strong> buffersLas dos funciones, buffer-name y buffer-file-name, muestran la difer<strong>en</strong>cia <strong>en</strong>tre un archivoy un buffer. Cuando evalúas ( buffer −name), el nombre <strong>de</strong>l buffer se <strong>de</strong>spliega <strong>en</strong> el área <strong>de</strong>eco; cuando evalúas ( buffer −file−name), el nombre <strong>de</strong>l archivo visitado <strong>en</strong> el buffer se <strong>de</strong>spliega.Usualm<strong>en</strong>te el nombre <strong>de</strong>l buffer es el mismo nombre <strong>de</strong>l archivo que visita, mi<strong>en</strong>tras queel nombre <strong>de</strong>l archivo vi<strong>en</strong>e con su ruta completa al archivo.Un buffer y un archivo son <strong>en</strong>tida<strong>de</strong>s completam<strong>en</strong>te distintas. Un archivo es informaciónalmac<strong>en</strong>ada perman<strong>en</strong>tem<strong>en</strong>te <strong>en</strong> la computadora (a m<strong>en</strong>os que tú lo borres), mi<strong>en</strong>tras que unbuffer es información <strong>de</strong>ntro <strong>de</strong> Emacs que <strong>de</strong>saparecerá cuando acabes tu sesión (o cuandomates el buffer). La distinción es importante porque nos permite distinguir <strong>en</strong>tre acciones útilescuando hacemos programas. Sin embargo, muchas veces escucharás a g<strong>en</strong>te <strong>de</strong>cir “estoy editandoun archivo” (<strong>en</strong> Emacs), <strong>en</strong> lugar <strong>de</strong> algo más apropiado como “estoy editando un bufferque <strong>de</strong>spués salvaré a un archivo”. Usualm<strong>en</strong>te este tipo <strong>de</strong> ambigüeda<strong>de</strong>s son compr<strong>en</strong>siblespor contexto para una persona, pero la computadora no es tan intelig<strong>en</strong>te y cuando programas<strong>en</strong> Emacs elisp es importante que le digas exactam<strong>en</strong>te lo que <strong>de</strong>seas.No todos los buffers <strong>de</strong> Emacs están asociados a un archivo. Por ejemplo, cuando empiezastu sesión con Emacs, éste arranca con un buffer llamado *scratch*; este buffer no está visitandoningún archivo, lo mismo que el buffer llamado *Help*.


300 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teActividad 9.31 Ve al buffer ∗scratch∗ y evalúa las dos expresiones:( b u f f e r −name )( b u f f e r −f i l e −name )también evalúa las expresiones usando C-u C-x C-e .Obt<strong>en</strong>i<strong>en</strong>do buffersLa función buffer-name regresa el nombre <strong>de</strong>l buffer, pero si lo que tú quieres es el cont<strong>en</strong>ido<strong>de</strong>l buffer, <strong>en</strong>tonces <strong>de</strong>bes usar curr<strong>en</strong>t-buffer. Es <strong>de</strong>cir, con curr<strong>en</strong>t-buffer tú obti<strong>en</strong>esel buffer mismo, no sólo su nombre. Sin embargo, hay una pequeña complicación: si túevalúas ( curr<strong>en</strong>t −buffer), lo que obti<strong>en</strong>es es el buffer pero su forma impresa se verá como:#.Otra función relacionada es other-buffer que te regresa el buffer más reci<strong>en</strong>tem<strong>en</strong>te seleccionadoque no sea <strong>en</strong> el cual estás actualm<strong>en</strong>te.Actividad 9.32 Prueba las funciones buffer-name y other-buffer haci<strong>en</strong>do lo sigui<strong>en</strong>te. Ve aalgún otro buffer <strong>en</strong> tu sesión actual <strong>de</strong> Emacs y <strong>de</strong> regreso a ∗scratch∗; <strong>de</strong>spués evalúas lasdos funciones (¿recuerdas C-x b ?).Cambiando <strong>de</strong> bufferLa función other-buffer es útil cuando se utiliza con switch-to-buffer. De hecho, esta últimaes una <strong>de</strong> las funciones que <strong>de</strong>bes usar con mayor frecu<strong>en</strong>cia <strong>en</strong> Emacs, cuando ejecutasC-x b ; esa combinación <strong>de</strong> teclas está ligada al comando switch-to-buffer, que recibe unbuffer como parámetro y lo muestra <strong>en</strong> la v<strong>en</strong>tana actual.Por ejemplo, si evalúas lo sigui<strong>en</strong>te:( switch −to−b u f f e r ( o t h e r −b u f f e r ) )verás que hace justo lo mismo que C-x b , ya que estás ejecutando (<strong>de</strong> otra forma) la mismafunción con los mismos argum<strong>en</strong>tos.En g<strong>en</strong>eral, <strong>en</strong> programas preferimos set-buffer sobre switch-to-buffer; esto es porque loshumanos necesitamos ver lo que hacemos, pero los programas no ti<strong>en</strong><strong>en</strong> ojos 6 y no necesitanque el buffer <strong>en</strong> el que operan sea visible <strong>en</strong> una v<strong>en</strong>tana <strong>de</strong> Emacs.Tamaño <strong>de</strong> un buffer y la localización <strong>de</strong>l puntoVeamos algunas funciones muy simples, buffer-size, point, point-min, point-max. Estasfunciones dan información sobre el buffer, su tamaño, la posición <strong>de</strong>l punto y las posicionesinicial y final <strong>de</strong>l buffer.6 Sí ti<strong>en</strong><strong>en</strong> cerebros y bocas, por eso uno pue<strong>de</strong> hablar con sus programas, incluso discutir, aplicarlesun correctivo o simplem<strong>en</strong>te platicar con ellos.


9.4 Definiciones <strong>de</strong> funciones 301buffer-size regresa el tamaño <strong>de</strong>l buffer, que no es otra cosa sino la cu<strong>en</strong>ta <strong>de</strong> todos loscarácteres <strong>en</strong> el buffer. point regresa la cu<strong>en</strong>ta <strong>de</strong> todos los carácteres <strong>de</strong>s<strong>de</strong> el inicio hasta elpunto don<strong>de</strong> actualm<strong>en</strong>te se <strong>en</strong>cu<strong>en</strong>tra el cursor (uno antes, para ser exactos; o mejor dicho, elpunto está <strong>en</strong>tre el carácter sobre el cual está el cursor y el anterior); point-min es la primeraposición permisible <strong>de</strong>l buffer (o la cu<strong>en</strong>ta <strong>de</strong> carácteres <strong>de</strong>s<strong>de</strong> el principio <strong>de</strong>l buffer hasta laprimera posición don<strong>de</strong> po<strong>de</strong>mos trabajar <strong>en</strong> el buffer) y point-max la cu<strong>en</strong>ta <strong>de</strong> caractereshasta la última posición permisible <strong>de</strong>l buffer.Actividad 9.33 Evalúa las cuatro funciones nombradas <strong>en</strong> esta sección. Después mueve elcursor <strong>en</strong> el buffer y repite este proceso.Parece tonto t<strong>en</strong>er una función que siempre regresa 1, como point-min, ¿cierto? Pues no,no es cierto. Cuando programamos <strong>en</strong> elisp, t<strong>en</strong>emos la facultad <strong>de</strong> “reducir” nuestro espacio<strong>de</strong> operación a cualquier subconjunto <strong>de</strong>l buffer actual; esto que se llama narrowing ni siquieralo voy a int<strong>en</strong>tar traducir. Desgraciadam<strong>en</strong>te no nos da tiempo <strong>de</strong> ver <strong>en</strong> este curso cómo y paraqué pue<strong>de</strong>s usarlo, pero <strong>de</strong>be ser claro que si estamos trabajando <strong>en</strong> una sección <strong>de</strong>l buffer ti<strong>en</strong>es<strong>en</strong>tido preguntar cuál es la primera posición <strong>de</strong> esa sección, y eso es lo que hace point-min.point-max hace algo similar.No <strong>de</strong>sprecies estas funciones, ya que a pesar <strong>de</strong> su apar<strong>en</strong>te simplicidad son sumam<strong>en</strong>teútiles para hacer un gran número <strong>de</strong> funciones interesantes. De hecho, un gran número <strong>de</strong>funciones <strong>de</strong> Emacs las utilizan y algunos <strong>de</strong> los ejemplos que veremos más a<strong>de</strong>lante también.9.4. Cómo escribir <strong>de</strong>finiciones <strong>de</strong> funcionesEn elisp, todas las funciones están <strong>de</strong>finidas <strong>en</strong> términos <strong>de</strong> otras funciones, excepto algunasprimitivas que están escritas <strong>en</strong> el l<strong>en</strong>guaje <strong>de</strong> programación C. De cualquier manera,las funciones primitivas y no primitivas que vi<strong>en</strong><strong>en</strong> con Emacs y las nuevas funciones que túescribas, todas se ejecutan igual.Vamos a <strong>en</strong>fatizar más esto: las funciones que tú escribas y las que ya están integradas aEmacs, se ejecutan <strong>de</strong> la misma forma. Entonces te preguntarás, ¿si la difer<strong>en</strong>cia no es importante,para qué me dices? La respuesta es porque es un dato interesante.9.4.1. La forma especial <strong>de</strong>funEn elisp, un símbolo tal como mark-whole-buffer ti<strong>en</strong>e cierto código asociado a él que leindica a la computadora qué hacer cuando la función sea llamada (o ejecutada). Dicho códigose conoce como la <strong>de</strong>finición <strong>de</strong> la función y se crea evaluando una expresión que comi<strong>en</strong>zacon la palabra reservada <strong>de</strong>fun (que abrevia a <strong>de</strong>fine function). Dado que <strong>de</strong>fun no evalúa susargum<strong>en</strong>tos <strong>en</strong> la forma usual, se conoce como una forma especial.En subsecu<strong>en</strong>tes secciones veremos cómo están hechas (i.e. el código) <strong>de</strong> algunas funciones<strong>de</strong> Emacs; <strong>en</strong> ésta veremos una función muy simple, para explicar cómo funciona <strong>de</strong>fun. Una<strong>de</strong>finición <strong>de</strong> función ti<strong>en</strong>e hasta cinco partes <strong>de</strong>spués <strong>de</strong> la palabra <strong>de</strong>fun:


302 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te1. El nombre <strong>de</strong>l símbolo al cual la función será ligada, pegada, asociada 7 .2. Una lista <strong>de</strong> los argum<strong>en</strong>tos que serán pasados a la función. Si no se pasarán argum<strong>en</strong>tosa la función, <strong>en</strong>tonces usamos la lista vacía, ( ).3. Docum<strong>en</strong>tación que <strong>de</strong>scribe a la función (técnicam<strong>en</strong>te este campo es opcional, pero <strong>en</strong>la práctica muy recom<strong>en</strong>dable).4. Opcionalm<strong>en</strong>te, una expresión para hacer que la función sea interactiva, para que puedasusarla tecleando M-x y el nombre <strong>de</strong> la función; o tecleando una combinación <strong>de</strong> teclasapropiada.5. El código que le dice a la computadora qué hacer: el cuerpo <strong>de</strong> la función.Es más fácil p<strong>en</strong>sar <strong>en</strong> una función como un esqueleto <strong>de</strong> la forma:( <strong>de</strong>fun nombre ( argum<strong>en</strong>tos . . . )" Docum<strong>en</strong>tación o p c i o n a l . . . "( i n t e r a c t i v e paso−<strong>de</strong>−i n f o r m a c i ón ) ; o p c i o n a lc uerpo . . . )Por ejemplo, a continuación te pres<strong>en</strong>tamos una función que multiplica su argum<strong>en</strong>to (unnúmero) por 7:( <strong>de</strong>fun m u l t i p l i c a −por −7 ( num )" M u l t i p l i c a NUM por 7 . "(∗ 7 num ) )Este ejemplo no es interactivo, eso lo veremos más a<strong>de</strong>lante; por el mom<strong>en</strong>to nota que las otraspartes están todas ahí. Su nombre, multiplica −por−7; sus argum<strong>en</strong>tos, (num); su docum<strong>en</strong>tación," Multiplica NUM por 7."; y su cuerpo, (∗ 7 num).En este caso, la función sólo recibe un argum<strong>en</strong>to, que aquí <strong>de</strong>cidimos llamar num, pero bi<strong>en</strong>pudo ser cualquier otro nombre, por ejemplo, parangaricutirimicuaro , pero ese hubiera sido unmuy mal nombre, ya que no le dice nada a un humano. En cambio, num, su<strong>en</strong>a como “número”y eso es más o m<strong>en</strong>os lo que esperamos sea pasado a la función, un número. Por ejemplo, evalúala <strong>de</strong>finición <strong>de</strong> la función aquí arriba y luego evalúa las sigui<strong>en</strong>tes:( 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 10)<strong>de</strong>berás ver 42 y 70, respectivam<strong>en</strong>te.Los nombres que uses para tus argum<strong>en</strong>tos <strong>en</strong> la <strong>de</strong>finición <strong>de</strong> una función se conviert<strong>en</strong>automáticam<strong>en</strong>te <strong>en</strong> privados, esto es, sólo son vistos (y por <strong>en</strong><strong>de</strong>, sólo pue<strong>de</strong>n ser usados)<strong>de</strong>ntro <strong>de</strong>l cuerpo <strong>de</strong> la función. En nuestro caso, podrás notar que num se multiplica por 7, perosi tú tratas <strong>de</strong> usar num fuera <strong>de</strong> la función verás que no está ligado a nada; pon num <strong>en</strong> el buffer*scratch* y luego ejecuta C-u C-x C-e para conv<strong>en</strong>certe.Algo que <strong>de</strong>bes notar es que los nombres que uses para tus argum<strong>en</strong>tos pue<strong>de</strong>n ser usados<strong>en</strong> el exterior <strong>de</strong> la función (i.e. fuera <strong>de</strong> ella) o como nombres <strong>de</strong> argum<strong>en</strong>tos <strong>en</strong> otra función o<strong>en</strong> muchas; <strong>en</strong> realidad no importa, porque no afecta el curso <strong>de</strong>l cómputo <strong>de</strong> tu función.7 Del verbo <strong>en</strong> inglés attach y que significa algo así como ligar, pegar o adjuntar.


9.4 Definiciones <strong>de</strong> funciones 303La docum<strong>en</strong>tación <strong>de</strong> tu función es lo que aparece cuando usas C-h f y un nombre <strong>de</strong>función. Por ejemplo, teclea C-h f y luego pon multiplica −por−7 y verás un nuevo buffer <strong>de</strong>ayuda con la docum<strong>en</strong>tación que usamos para <strong>de</strong>scribir nuestra función.Actividad 9.34 Haz una función que saque el promedio <strong>de</strong> dos números. Llama a sus parámetrosnum y num−2. Vuelve a probar multiplica −por−7 y comprueba que sigue funcionando, apesar <strong>de</strong> que ya hay al m<strong>en</strong>os una función más (la que acabas <strong>de</strong> hacer que calcula el promedio)que utiliza el mismo nombre para un argum<strong>en</strong>to, num.Instalar nuevas <strong>de</strong>finicionesAquí arriba, cuando te pedimos que evaluaras la <strong>de</strong>finición <strong>de</strong> la función multiplica −por−7, tehicimos trampa porque no te explicamos lo que iba a suce<strong>de</strong>r. Para efectos didácticos era mejorasí, pero aquí te va la explicación completa.Para que tú puedas ejecutar una función con ciertos argum<strong>en</strong>tos, primero Emacs <strong>de</strong>be conocerdicha función. Para lograr esto, <strong>de</strong>bes instalar la <strong>de</strong>finición <strong>en</strong> Emacs. Cuando pones elcursor al final <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> una función, como multiplica −por−7, y le picas C-x C-e ,verás el nombre <strong>de</strong> la función <strong>en</strong> el área <strong>de</strong> eco (eso es lo que regresa una <strong>de</strong>finición <strong>de</strong> función,el nombre <strong>de</strong> la función). En ese mom<strong>en</strong>to, la función ha sido instalada <strong>en</strong> Emacs y es tan parte<strong>de</strong> Emacs como forward-word o cualquier otra función <strong>de</strong> edición que tú uses (multiplica-por-7permanecerá instalada <strong>en</strong> Emacs hasta que termines tu sesión <strong>de</strong> Emacs; para instalar códigoperman<strong>en</strong>tem<strong>en</strong>te pue<strong>de</strong>s introducirlo <strong>en</strong> tu ∼/.emacs).Cómo cambiar la <strong>de</strong>finición <strong>de</strong> una funciónSi quieres cambiar el código <strong>en</strong> multiplica-por-7, sólo ti<strong>en</strong>es que reescribirlo y volver ainstalar la función <strong>en</strong> Emacs. Así modificas cualquier código <strong>de</strong> función <strong>en</strong> Emacs, es muys<strong>en</strong>cillo.A manera <strong>de</strong> ejemplo, pue<strong>de</strong>s cambiar el código <strong>de</strong> la función multiplica-por-7 por unaversión que no utilice multiplicación (’*’), por ejemplo:( <strong>de</strong>fun m u l t i p l i c a −por −7 ( num )" M u l t i p l i c a NUM por 7 . "(+ num num num num num num num ) )¡Vamos, pruébalo! Evalúa esta nueva versión y vuelve a probar la función. De hecho, éstaes la forma <strong>de</strong> hacer funciones pequeñas <strong>en</strong> Emacs elisp: haces una primera versión, la instalas,la pruebas y luego haces correcciones y vuelves a instalar, probar, <strong>en</strong> un ciclo hasta que que<strong>de</strong>como la <strong>de</strong>seas.Cómo hacer una función interactivaHaces una función interactiva poni<strong>en</strong>do una lista que empieza con la forma especial interactivejusto <strong>de</strong>spués <strong>de</strong> la docum<strong>en</strong>tación. Un usuario pue<strong>de</strong> invocar una función interactiva te-


304 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>tecleando M-x función, o tecleando la combinación <strong>de</strong> teclas a las cuáles está ligada la función,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 <strong>de</strong> Emacs elisp novato, es que cuandollamas a una función interactiva, su resultado no aparece <strong>en</strong> la línea <strong>de</strong> eco. La razón es quemuchas <strong>de</strong> estas funciones son hechas por sus efectos secundarios, como avanzar una línea oborrar una palabra, y no por el valor que regresan. Si el valor regresado apareciera <strong>en</strong> el área <strong>de</strong>eco distraería mucho al usuario.Una versión <strong>de</strong> nuestra multi-citada función multiplica-por-7 pue<strong>de</strong> ser interactiva y aunasí imprimir su resultado <strong>en</strong> el área <strong>de</strong> eco. Por ejemplo:( <strong>de</strong>fun m u l t i p l i c a −por −7 ( num )" M u l t i p l i c a NUM por 7 . "( i n t e r a c t i v e " p " )( message " El r e s u l t a d o es : %d " (∗ 7 num ) ) )Ahora, cuando evalúes esta nueva versión <strong>de</strong> multiplica-por-7 podrás usar la función <strong>de</strong> manerainteractiva: teclea C-u 6 M-x multiplica-por-7 Enter y verás el m<strong>en</strong>saje “El resultado es:42” aparecer <strong>en</strong> el área <strong>de</strong> eco.En g<strong>en</strong>eral, pue<strong>de</strong>s invocar una función como ésta <strong>en</strong> una <strong>de</strong> dos formas:1. Tecleando un argum<strong>en</strong>to prefijo que será num para la función, seguido <strong>de</strong> M-x y el nombre<strong>de</strong> la función. Por ejemplo, C-u 3 M-x forward−s<strong>en</strong>t<strong>en</strong>ce, o2. tecleando cualquier tecla o combinación <strong>de</strong> ellas a las cuales esté ligada la <strong>de</strong>finición,como <strong>en</strong> C-u 3 M-e .Ambos ejemplos m<strong>en</strong>cionados hac<strong>en</strong> lo mismo: muev<strong>en</strong> el punto tres oraciones hacia a<strong>de</strong>lante(dado que multiplica-por-7 no está ligado a ninguna tecla, <strong>en</strong>tonces no po<strong>de</strong>mos usarla segunda forma, aunque <strong>de</strong>biste haber apr<strong>en</strong>dido a ligar funciones a teclas hace un par <strong>de</strong>capítulos <strong>de</strong>ntro <strong>de</strong>l marco <strong>de</strong> este material).Un argum<strong>en</strong>to prefijo N pue<strong>de</strong> ser pasado a una función usando C-u N o bi<strong>en</strong> M –N. Sisólo tecleas C-u sin argum<strong>en</strong>tos, el valor por omisión es 4; compruébalo, ejecutandoC-u M-x multiplica −por−7En nuestro ejemplo, la expresión ( interactive "p") le dice a Emacs que pase el argum<strong>en</strong>toprefijo a la función y que use su valor (el <strong>de</strong>l argum<strong>en</strong>to prefijo) como argum<strong>en</strong>to <strong>de</strong> la función.Difer<strong>en</strong>tes opciones para interactiveEn nuestro ejemplo, “p” le indica a Emacs que pase el argum<strong>en</strong>to prefijo (un número) comoparámetro a la función. Pero ¿qué suce<strong>de</strong> si la función no recibe un número? La forma especialinteractive ti<strong>en</strong>e un gran número <strong>de</strong> opciones, cerca <strong>de</strong> 20 carácteres, y muy probablem<strong>en</strong>teuno <strong>de</strong> ellos te permitirá pasar la información que requieres a tu función. No los revisaremostodos aquí, sólo veremos unos cuantos, pero pue<strong>de</strong>s buscar la docum<strong>en</strong>tación <strong>de</strong> interactive <strong>en</strong>el manual <strong>en</strong> línea <strong>de</strong> Emacs elisp.Por ejemplo, la letra “r” le dice a Emacs que pase a la función los valores inicial y final <strong>de</strong>la región (el valor <strong>de</strong>l punto y el valor <strong>de</strong> la marca <strong>en</strong> el buffer actual) como dos argum<strong>en</strong>tosseparados a la función. Se usa como sigue:


9.4 Definiciones <strong>de</strong> funciones 305( i n t e r a c t i v e " r " )La letra “B” le dirá a Emacs que pida un nombre <strong>de</strong> buffer que será pasado a la función.No sólo eso, sino que pue<strong>de</strong>s usar una etiqueta para preguntar por el buffer y, a<strong>de</strong>más, Emacs teayudará 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 función con varios argum<strong>en</strong>tos también pue<strong>de</strong> usar interactive; la forma <strong>en</strong> que separamoslos argum<strong>en</strong>tos es usando un símbolo <strong>de</strong> nueva línea, \n. Por ejemplo,( i n t e r a c t i v e "BDame un b u f f e r : \ nr " )le dice a Emacs que pida un buffer, que será el primer argum<strong>en</strong>to <strong>de</strong> la función, y que a<strong>de</strong>máspase el valor <strong>de</strong> la marca y el punto (la región) como segundo y tercer valor (no necesariam<strong>en</strong>te<strong>en</strong> ese or<strong>de</strong>n) a la función.Si la función no recibe ningún argum<strong>en</strong>to, eso no es motivo para que no puedas usar interactive;<strong>de</strong> hecho, interactive siempre recibe el mismo número <strong>de</strong> argum<strong>en</strong>tos que la función,así que a una función sin argum<strong>en</strong>tos le correspon<strong>de</strong> una forma interactive sin argum<strong>en</strong>tos,( interactive ).9.4.2. letUna expresión let también es una forma especial que usarás <strong>en</strong> muchas <strong>de</strong>finiciones <strong>de</strong>funciones. Su uso es útil para ligar un símbolo a un valor, <strong>de</strong> forma tal que le permite al intérpretedistinguir esta variable <strong>de</strong> otra con el mismo nombre y que no forme parte <strong>de</strong>l cuerpo <strong>de</strong> lafunción.Para <strong>en</strong>t<strong>en</strong><strong>de</strong>r por qué let es necesaria, pi<strong>en</strong>sa <strong>en</strong> tu hogar, al cual tú te refieres como “micasa”; ahora imagina que estás hablando con Foo, y éste está hablando <strong>de</strong> “mi casa”. Muyprobablem<strong>en</strong>te Foo está hablando <strong>de</strong> su casa y no <strong>de</strong> tu casa, pero si cada vez que tú oyes “micasa” pi<strong>en</strong>sas <strong>en</strong> tu casa, te confundirás sin lugar a dudas. Ahora imagina que dos funcionesusan una variable y que dicha variable se llama igual, pero <strong>de</strong>be t<strong>en</strong>er distintos valores paracada función.let evita este tipo <strong>de</strong> confusiones. Lo que hace es crear un nombre que “opaca”, o mejordicho “oculta”, a cualquier refer<strong>en</strong>cia externa a ese mismo nombre <strong>en</strong> el cuerpo <strong>de</strong>l let.Una expresión let ti<strong>en</strong>e tres partes: (let varlist cuerpo...). La primera parte es el símbololet, el segundo es una lista, i<strong>de</strong>ntificada como varlist; cada elem<strong>en</strong>to <strong>de</strong> la lista es un símbolo ouna lista <strong>de</strong> dos elem<strong>en</strong>tos, el primero <strong>de</strong> los cuales es un símbolo y el segundo una expresión;el tercer elem<strong>en</strong>to <strong>de</strong> la lista es el cuerpo.Los símbolos <strong>en</strong> la lista varlist, son las variables a las que se les asigna un valor inicialpor let. Los símbolos que aparec<strong>en</strong> solos son asignados el valor nil ; el intérprete evalúa lossegundos elem<strong>en</strong>tos <strong>de</strong> cada lista y asigna al primer elem<strong>en</strong>to (un símbolo) el resultado.Por lo tanto, una varlist pue<strong>de</strong> lucir así: (num (sex f )), <strong>en</strong> cuyo caso Emacs asignará a laprimera variable, num, el valor nil y la variable sex valdrá f.Si la lista <strong>de</strong> variables, varlist, está compuesta <strong>de</strong> parejas (el caso más usual), let luce así:


306 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te( l e t ( ( v a r v a l u e )( v a r v a l u e ). . .( v a r v a l u e ) )c uerpo . . . )Ejemplo <strong>de</strong> letLa sigui<strong>en</strong>te expresión let le da valor a dos variables y luego imprime sus valores. El cuerpoconsiste sólo <strong>de</strong> la llamada a message:( l e t ( ( z e b r a ’ r a y a s )( t i g e r ’ f e r o z ) )( message "Un a n i m a l t i e n e % s y e l o t r o es % s " z e b r a t i g e r ) )Pue<strong>de</strong>s evaluar esta expresión. El resultado lucirá como: “Un animal ti<strong>en</strong>e rayas y el otro esferoz”.Actividad 9.35 Haz una función llamada suma-exotica, que recibe tres parámetros numéricos,a, b, c y regresa el resultado <strong>de</strong> la operación: a 2 + b 3 + c 4 . Usa let para almac<strong>en</strong>ar losresultados intermedios. También pue<strong>de</strong>s hacer una función auxiliar que reciba dos númeroscomo parámetros, n y m y regrese n m .9.4.3. La forma especial ifLa tercera forma especial que veremos, a<strong>de</strong>más <strong>de</strong> <strong>de</strong>fun y let, es la condicional if. Estaforma se usa para <strong>en</strong>señar a la computadora a tomar <strong>de</strong>cisiones. No es indisp<strong>en</strong>sable para escribirfunciones, pero su uso es muy común y por eso está aquí. La función beginning-of-bufferla usa, por ejemplo.La i<strong>de</strong>a básica <strong>de</strong>trás <strong>de</strong> if es que “si (if) algo es verda<strong>de</strong>ro, <strong>en</strong>tonces algo se hace”, porejemplo, “si el cielo está <strong>de</strong>spejado y hace calor, <strong>en</strong>tonces ve a la playa”. En elisp no usamosninguna palabra para <strong>de</strong>signar la parte <strong>de</strong>l “<strong>en</strong>tonces”, por lo que las construcciones if luc<strong>en</strong> así:( i f prueba −f a l s a −o−v e r d a d e r ar e a l i z a r −e s t o −s i −es−v 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 th<strong>en</strong>.Por ejemplo, evalúa la sigui<strong>en</strong>te expresión:( i f ( > 5 4)( message "Wow, 5 es mayor que 4 . " ) )


9.4 Definiciones <strong>de</strong> funciones 307La función > prueba si el primer argum<strong>en</strong>to es mayor que el segundo y regresa verda<strong>de</strong>rosi lo es.En la vida real, claro está, la prueba no es fija, usualm<strong>en</strong>te <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong> una variable. Porejemplo,1 ( <strong>de</strong>fun t i p o −<strong>de</strong>−a n i m a l ( c a r á c t e r )2 " Imprime un m<strong>en</strong>saje <strong>en</strong> e l á r e a <strong>de</strong> eco <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> CARÁCTER .3 Si es e l símbolo ’ f e r o z , e n t o n c e s a v i s a que es un t i g r e . "4 ( i f ( e q u a l c a r á c t e r ’ f e r o z )5 ( message " Es un t i g r e " ) ) )imprime el m<strong>en</strong>saje “Es un tigre” <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> si su parámetro es el símbolo ’ feroz o no.Las expresiones if recib<strong>en</strong> opcionalm<strong>en</strong>te un tercer parámetro, conocido como la parte elsey se evalúa cuando la prueba es falsa. Así, po<strong>de</strong>mos completar nuestra función tipo−<strong>de</strong>−animalpara que regrese algo más creativo que nil cuando no <strong>en</strong>cu<strong>en</strong>tra la característica feroz.1 ( <strong>de</strong>fun t i p o −<strong>de</strong>−a n i m a l ( c a r á c t e r )2 " Imprime un m<strong>en</strong>saje <strong>en</strong> e l á r e a <strong>de</strong> eco <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> c a r á c t e r .3 Si 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 es un t i g r e . "4 ( i f ( e q u a l c a r a c t ’ f e r o z )5 ( message " Es un t i g r e " )6 ( message "Ummm no , l o s i e n t o , no es f e r o z . " ) ) )Vamos no seas tímido, evalúa nuevam<strong>en</strong>te la función y pruébala con ’ feroz, ’amistoso, y otrossímbolos que se te ocurran.Valores <strong>de</strong> verdad <strong>en</strong> elispHasta el mom<strong>en</strong>to hemos hablado <strong>de</strong> falso y verda<strong>de</strong>ro como si fueran nuevos tipos <strong>de</strong> datos<strong>en</strong> elisp. La realidad es que falso está repres<strong>en</strong>tado por nuestro viejo amigo, nil ; cualquier otracosa – <strong>en</strong> serio, cualquier valor distinto <strong>de</strong> nil – es verda<strong>de</strong>ro.La expresión que prueba si algo es verda<strong>de</strong>ro se interpreta como verda<strong>de</strong>ra si el resultado<strong>de</strong> la evaluación no es nil . Como ya habíamos m<strong>en</strong>cionado, nil también significa la lista vacía,( ). Es <strong>de</strong>cir, para el intérprete <strong>de</strong> elisp, nil y ( ) son la misma cosa, pero los humanos t<strong>en</strong><strong>de</strong>mosa referirnos a nil como falso y a ( ) como la lista vacía.Cabe notar que si el intérprete <strong>de</strong> elisp no pue<strong>de</strong> regresar algún valor útil para repres<strong>en</strong>tarverda<strong>de</strong>ro, <strong>en</strong>tonces regresará el símbolo t , que significa verda<strong>de</strong>ro (la “t” es <strong>de</strong> true).9.4.4. save-excursionLa función save-excursion es la cuarta y última forma especial que revisaremos <strong>en</strong> estematerial.En elisp es común hacer programas para editar; la función save-excursion es comúnm<strong>en</strong>teusada, ya que guarda las posiciones <strong>de</strong>l punto y la marca, ejecuta el cuerpo <strong>de</strong> la función yluego regresa el punto y la marca a sus valores previos, si es que fueron cambiados por la acción


308 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te<strong>de</strong> la función. Su único propósito es evitar darle sorpresas inesperadas o molestas al usuario,cambiando a sus espaldas la posición <strong>de</strong>l punto o la marca.En Emacs es común que una función cambie la posición <strong>de</strong>l punto y la marca como parteintegral <strong>de</strong> su funcionami<strong>en</strong>to, aun cuando el usuario pueda o no esperar tal comportami<strong>en</strong>to.Por ejemplo, la función count-lines-region mueve el punto. El uso <strong>de</strong> save-excursion es unabu<strong>en</strong>a práctica <strong>de</strong> programación.save-excursion incluso recupera los valores <strong>de</strong> la marca y el punto, aun <strong>en</strong> el ev<strong>en</strong>tual caso<strong>de</strong> que algo salga mal, o <strong>en</strong> el caló usado <strong>en</strong> elisp, incluso cuando la función termine <strong>de</strong> maneraanormal. Asimismo, esta función también regresa al buffer <strong>de</strong> partida <strong>en</strong> caso <strong>de</strong> que la funcióncambie <strong>de</strong> buffer internam<strong>en</strong>te para trabajar.La forma g<strong>en</strong>eral <strong>de</strong> save-excursion es:( save−e x c u r s i o nc uerpo . . . )aunque es usual que save-excursion ocurra <strong>de</strong>ntro <strong>de</strong> una expresión let, como <strong>en</strong>:( l e t v a r l i s t( save−e x c u r s i o nc uerpo . . . ) )9.4.5. Resum<strong>en</strong>En las últimas secciones hemos mostrado algunas funciones y formas especiales. Aquí las<strong>de</strong>scribiremos brevem<strong>en</strong>te, para que te acuer<strong>de</strong>s rápidam<strong>en</strong>te cómo se usan y también m<strong>en</strong>cionaremosalgunas funciones más que son parecidas.eval-last-sexp Evalúa la última expresión simbólica anterior a la posición actual <strong>de</strong>l punto.Su valor aparece <strong>en</strong> el área <strong>de</strong> eco, a m<strong>en</strong>os que la función sea llamada con un argum<strong>en</strong>to,<strong>en</strong> cuyo caso el resultado se inserta <strong>en</strong> el buffer actual. Este comando está usualm<strong>en</strong>teligado a C-x C-e .<strong>de</strong>fun Define function. Esta forma especial ti<strong>en</strong>e hasta cinco partes: el nombre, un esqueletopara los argum<strong>en</strong>tos que serán pasados a la función, docum<strong>en</strong>tación, una <strong>de</strong>claracióninteractive opcional y el cuerpo <strong>de</strong> la <strong>de</strong>finición.Por ejemplo:( <strong>de</strong>fun back−to−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 <strong>en</strong> l a l ínea . "( i n t e r a c t i v e )( b e g i n n i n g −of−l i n e 1)( skip −c h a r s −f o r w a r d " \ t " ) )interactive Le <strong>de</strong>clara al intérprete que la función pue<strong>de</strong> ser usada interactivam<strong>en</strong>te. Estaforma especial pue<strong>de</strong> ir seguida <strong>de</strong> una ca<strong>de</strong>na con una o más partes que pasan informacióna los argum<strong>en</strong>tos <strong>de</strong> una función, <strong>en</strong> secu<strong>en</strong>cia. Estas partes también le pue<strong>de</strong>n indicar al


9.4 Definiciones <strong>de</strong> funciones 309intérprete que solicite información <strong>de</strong>l usuario. Las partes <strong>de</strong> la ca<strong>de</strong>na se separan pormedio <strong>de</strong> nuevas líneas, \n.Algunos carácteres <strong>de</strong> control comunes son:b El nombre <strong>de</strong> un buffer exist<strong>en</strong>te.fEl nombre <strong>de</strong> un archivo exist<strong>en</strong>te.p El argum<strong>en</strong>to (numérico) prefijo. (Nota que esta “p” es minúscula).rEl punto y la marca, pasados como dos argum<strong>en</strong>tos numéricos, el más pequeño (cualquieraque éste sea) primero. Éste es el único carácter <strong>de</strong> control que especifica dosargum<strong>en</strong>tos sucesivos <strong>en</strong> lugar <strong>de</strong> uno solo.let Declara que una lista <strong>de</strong> variables será usada <strong>de</strong>ntro <strong>de</strong>l cuerpo <strong>de</strong>l let y les da un valorinicial; por omisión, dicho valor es nil ; <strong>de</strong>spués evalúa las <strong>de</strong>más expresiones <strong>en</strong> el cuerpo<strong>de</strong>l let y regresa el valor <strong>de</strong> regreso <strong>de</strong> la última. D<strong>en</strong>tro <strong>de</strong>l cuerpo <strong>de</strong>l let, el intérprete <strong>de</strong>elisp no ve los valores <strong>de</strong> las variables cuyos nombres ya estaban ligados fuera <strong>de</strong>l let 8 .Por ejemplo,( l e t ( ( foo ( b u f f e r −name ) )( b a r ( b u f f e r −s i z e ) ) )( message " E s t e b u f f e r es % s y t i e n e %d c a r á c t e r e s . "foo b a r ) )save-excursion Almac<strong>en</strong>a los valores <strong>de</strong>l punto, la marca y el buffer actual antes <strong>de</strong> evaluarel cuerpo <strong>de</strong> la forma. Los restaura una vez terminada la ejecución <strong>de</strong> la última expresión<strong>en</strong> su cuerpo.Por ejemplo,( message " Somos %d c a r á c t e r e s h a s t a e s t e punto ( <strong>en</strong> e s t e b u f f e r . ) "(− ( p o i n t )( save−e x c u r s i o n( goto−c h a r ( p o i n t −min ) ) ( p o i n t ) ) ) )if Evalúa el primer argum<strong>en</strong>to <strong>de</strong> la función; si es verda<strong>de</strong>ro, evalúa el segundo argum<strong>en</strong>to; <strong>en</strong>caso contrario, evalúa el tercero (si existe).La forma especial if se llama condicional. Hay otras formas condicionales <strong>en</strong> elisp, peroif es probablem<strong>en</strong>te la más usada.Por ejemplo,( i f ( s t r i n g = ( i n t −to−s t r i n g 21)( s u b s t r i n g ( emacs−v e r s i o n ) 7 9 ) )( message " E s t a es l a v e r s i ón 21 <strong>de</strong> Emacs " )( message " E s t a NO es l a v e r s i ón 21 <strong>de</strong> Emacs " ) )equal Prueba si dos objetos son el mismo. equal regresa verda<strong>de</strong>ro si los objetoseq ti<strong>en</strong><strong>en</strong> la misma estructura y cont<strong>en</strong>idos. eq regresa verda<strong>de</strong>ro si los dos objetos son <strong>en</strong>realidad el mismo objeto.8 Esto repres<strong>en</strong>ta un concepto muy importante <strong>en</strong> l<strong>en</strong>guajes <strong>de</strong> programación, llamado alcance léxico,pero ya t<strong>en</strong>drás muchos semestres para dominar toda esa terminología; por el mom<strong>en</strong>to t<strong>en</strong>drás queconformarte – y nosotros también – con <strong>en</strong>t<strong>en</strong><strong>de</strong>r el concepto.


310 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te< >=La función < verifica si su primer argum<strong>en</strong>to es m<strong>en</strong>or que el segundo; las <strong>de</strong>másrevisan respectivam<strong>en</strong>te m<strong>en</strong>or o igual, mayor y por último mayor o igual. Las cuatrofunciones recib<strong>en</strong> argum<strong>en</strong>tos numéricos.message Imprime un valor <strong>en</strong> el área <strong>de</strong> eco. El m<strong>en</strong>saje sólo pue<strong>de</strong> ser <strong>de</strong> una línea <strong>de</strong>longitud. El primer argum<strong>en</strong>to es una ca<strong>de</strong>na que pue<strong>de</strong> cont<strong>en</strong>er ‘ %s’, ‘ %d’, o ‘ %c’para imprimir el valor <strong>de</strong> argum<strong>en</strong>tos que sigan a la ca<strong>de</strong>na. El argum<strong>en</strong>to usado por ‘ %s’<strong>de</strong>be ser una ca<strong>de</strong>na. El argum<strong>en</strong>to usado por ‘ %d’ <strong>de</strong>be ser un número. El argum<strong>en</strong>tousado por ‘ %c’ <strong>de</strong>be ser un número y será impreso como el carácter con ese valor <strong>en</strong> elcódigo ASCII.setq La función setq asigna el valor <strong>de</strong> su primer argum<strong>en</strong>to al valor <strong>de</strong>l segundo.set El primer argum<strong>en</strong>to es citado automáticam<strong>en</strong>te por setq. Hace lo mismo para subsecu<strong>en</strong>tesparejas <strong>de</strong> valores. Otra función set sólo toma dos argum<strong>en</strong>tos y los evalúa ambosantes <strong>de</strong> asignar el valor <strong>de</strong>l segundo al primero.buffer-name Sin argum<strong>en</strong>tos, regresa el nombre <strong>de</strong>l buffer actual, como ca<strong>de</strong>na.buffer-file-name Sin argum<strong>en</strong>tos, regresa el nombre <strong>de</strong>l archivo que el buffer actual estávisitando.curr<strong>en</strong>t-buffer Regresa el buffer <strong>en</strong> el cual Emacs está activo; pue<strong>de</strong> ser algún buffer distintoal que está visible <strong>en</strong> la v<strong>en</strong>tana <strong>de</strong> Emacs.other-buffer Regresa el buffer más reci<strong>en</strong>tem<strong>en</strong>te seleccionado (uno distinto al que se pasacomo parámetro a other-buffer y al buffer actual).switch-to-buffer Selecciona un buffer para que Emacs esté activo <strong>en</strong> él, y lo <strong>de</strong>spliega <strong>en</strong> lav<strong>en</strong>tana para que los usuarios puedan verlo. Usualm<strong>en</strong>te está ligada a C-x b .set-buffer Cambia la at<strong>en</strong>ción <strong>de</strong> Emacs a un buffer don<strong>de</strong> los programas correrán. No alteralo que se está vi<strong>en</strong>do <strong>en</strong> la v<strong>en</strong>tana.buffer-size Regresa el número <strong>de</strong> carácteres <strong>en</strong> el buffer actual.point Regresa el valor <strong>de</strong> la posición actual <strong>de</strong> punto, como <strong>en</strong>tero; esto es igual al número <strong>de</strong>carácteres <strong>de</strong>s<strong>de</strong> el inicio <strong>de</strong>l buffer.point-min Regresa el mínimo valor permisible para el punto <strong>en</strong> el buffer actual. Esto es 1, am<strong>en</strong>os que narrowing esté activo.point-max Regresa el máximo valor permisible para el punto <strong>en</strong> el buffer actual. Esto es elfinal <strong>de</strong>l buffer, a m<strong>en</strong>os que narrowing esté activo.Actividad 9.36 Escribe una función no interactiva que duplique el valor <strong>de</strong> su argum<strong>en</strong>to.Después haz la función interactiva.Actividad 9.37 Escribe una función que pruebe si el valor actual <strong>de</strong> fill-column es mayor queel argum<strong>en</strong>to pasado a la función, y si lo es, que man<strong>de</strong> el m<strong>en</strong>saje apropiado al área <strong>de</strong> eco.


9.5 Funciones relacionadas con buffers 3119.5. Algunas funciones relacionadas con buffersEn esta sección estudiaremos varias funciones <strong>de</strong> Emacs. Esto usualm<strong>en</strong>te se llama “walkthrough”, que sería más o m<strong>en</strong>os equival<strong>en</strong>te a “un paseo por”. La i<strong>de</strong>a es mostrarte ejemplos <strong>de</strong>verdad <strong>de</strong> todo lo que hemos visto. Apr<strong>en</strong><strong>de</strong>r vi<strong>en</strong>do es una técnica muy usada <strong>en</strong> programacióny estamos seguros que te servirá mucho, así que siéntate cómodam<strong>en</strong>te, respira hondo y ponat<strong>en</strong>ción.Las funciones que analizaremos aquí están todas relacionadas con buffers; más a<strong>de</strong>lanteveremos otro tipo <strong>de</strong> funciones. Describiremos cada función, <strong>en</strong> su mom<strong>en</strong>to, <strong>de</strong> manera breve;si te interesa ver la docum<strong>en</strong>tación completa <strong>de</strong> la función, pue<strong>de</strong>s usar C-h f < nombre <strong>de</strong>la función> Enter ; o si es una variable C-h v Enter .9.5.1. Definición (simplificada) <strong>de</strong> beginning-of-bufferLa función beginning-of-buffer es una bu<strong>en</strong>a función para com<strong>en</strong>zar nuestro paseo porlas funciones <strong>de</strong> Emacs, ya que es s<strong>en</strong>cilla y a estas alturas ya <strong>de</strong>bes estar familiarizado conella. Cuando se usa interactivam<strong>en</strong>te, beginning-of-buffer mueve el cursor al inicio <strong>de</strong>l buffer,<strong>de</strong>jando la marca <strong>en</strong> la posición previa. Usualm<strong>en</strong>te está ligada a M-< .Sin más, aquí está nuestra <strong>de</strong>finición simplificada (es simplificada porque la versión realmaneja una opción compleja a<strong>de</strong>más <strong>de</strong>l comportami<strong>en</strong>to que hemos <strong>de</strong>scrito):1 ( <strong>de</strong>fun s i m p l i f i e d −b e g i n n i n g −of−b u f f e r ( )2 " Mueve e l punto a l i n i c i o d e l b u f f e r ;3 d e j a n d o l a marca <strong>en</strong> l a p o s i c i o n a c t u a l . "4 ( i n t e r a c t i v e )5 ( push−mark )6 ( goto−c h a r ( p o i n t −min ) ) )Nota que ti<strong>en</strong>e sus cinco partes como toda bu<strong>en</strong>a <strong>de</strong>finición. La parte que no conoces aún,es el cuerpo <strong>de</strong> la función, que <strong>en</strong> este caso consta <strong>de</strong> dos expresiones:5 ( push−mark )6 ( goto−c h a r ( p o i n t −min ) )La primera <strong>de</strong> ellas, (push-mark), al ser evaluada por el intérprete lo que hace es poner lamarca <strong>en</strong> la posición actual <strong>de</strong>l cursor, <strong>en</strong> don<strong>de</strong> sea que éste esté. Dicha posición se guarda <strong>en</strong>el anillo <strong>de</strong> marcas (Emacs ti<strong>en</strong>e varios tipos <strong>de</strong> anillos, el <strong>de</strong> marcas, el <strong>de</strong> la muerte y otros ytodos son muy útiles).La sigui<strong>en</strong>te línea, (goto-char (point-min)), mueve el cursor a la primera posición <strong>de</strong>l buffer.¿Por qué poner la marca <strong>en</strong> el lugar anterior? A primera vista no parece obvio, pero <strong>en</strong> lapráctica uno usualm<strong>en</strong>te <strong>de</strong>sea regresar al inicio <strong>de</strong>l buffer temporalm<strong>en</strong>te, como por ejemplo


312 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>tepara hacer un pequeño ajuste <strong>en</strong> las líneas iniciales, para revisar algún dato o alguna otra actividad.Sin embargo, el punto más importante es usualm<strong>en</strong>te el <strong>de</strong> edición más reci<strong>en</strong>te, así queponi<strong>en</strong>do la marca <strong>en</strong> él es fácil regresar a ese punto (prueba, por ejemplo, C-x C-x ).Cuando veamos funciones que <strong>de</strong>sconozcas, por ejemplo goto-char, recuerda que pue<strong>de</strong>susar C-h f , seguido <strong>de</strong>l nombre <strong>de</strong> la función, para terminar con Enter para obt<strong>en</strong>er sudocum<strong>en</strong>tación.Actividad 9.38 Escribe la función simplified-<strong>en</strong>d-of-buffer.La <strong>de</strong>finición <strong>de</strong> mark-whole-bufferEsta función, mark-whole-buffer, no es más difícil que nuestra versión simplificada <strong>de</strong>beginning-of-buffer y, a difer<strong>en</strong>cia <strong>de</strong> aquélla, ésta no está simplificada; veremos la versiónreal.Lo que hace mark-whole-buffer es poner el punto al inicio <strong>de</strong>l buffer y la marca al final; noes tan usada como las anteriores, pero es importante. Usualm<strong>en</strong>te está ligada a C-x h . Luceasí:1 ( <strong>de</strong>fun mark−whole−b u f f e r ( )2 " Pone e l punto 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 ( i n t e r a c t i v e )4 ( push−mark ( p o i n t ) )5 ( push−mark ( p o i n t −max ) )6 ( goto−c h a r ( p o i n t −min ) ) )En esta función, las últimas dos expresiones pon<strong>en</strong> la marca al final <strong>de</strong>l buffer y la otra mueveel punto a la primera posición. Pero, ¿por qué aparece (push-mark (point)) como primeralínea <strong>de</strong>l cuerpo? Nuevam<strong>en</strong>te, la i<strong>de</strong>a <strong>de</strong>trás <strong>de</strong> esto es que la posición actual (antes <strong>de</strong> llamara mark-whole-buffer) es la posición <strong>de</strong> edición, la más importante actualm<strong>en</strong>te <strong>en</strong> el buffer; lapráctica indica que cuando uno marca todo el buffer, lo hace con la int<strong>en</strong>ción <strong>de</strong> reformatearlo,re-in<strong>de</strong>ntarlo, copiarlo, o algo similar, pero <strong>de</strong>spués <strong>de</strong> eso, uno <strong>de</strong>sea regresar a la posiciónprevia <strong>de</strong> edición.¿Cómo regresamos a esa posición? Pues es muy s<strong>en</strong>cillo. Recuerda que dijimosq que pushmarkempuja la marca a un anillo que pue<strong>de</strong>s recorrer; por omisión C-x C-x te lleva a laposición previa <strong>de</strong> la marca, y ya sabes que C–Space pone la marca. Pues C–Space , que<strong>en</strong> realidad es un ligado <strong>de</strong> la función set-mark-command, hace más que eso: si le pasas unargum<strong>en</strong>to prefijo, brinca a esa marca <strong>en</strong> el anillo local <strong>de</strong> marcas; ¡vamos, inténtalo! ¡Ejecutados veces C-u C–Space y ve lo que suce<strong>de</strong>!La <strong>de</strong>finición <strong>de</strong> app<strong>en</strong>d-to-bufferLa función app<strong>en</strong>d-to-buffer copia una región (la región actual <strong>en</strong> el buffer actual) a unbuffer especificado. Usaremos la función insert-buffer-substring para copiar la región; comoes <strong>de</strong> esperarse, esta última recibe dos posiciones, la inicial y la final, y el buffer <strong>de</strong>l cual <strong>de</strong>beextraer la subca<strong>de</strong>na compr<strong>en</strong>dida <strong>en</strong>tre dichas posiciones.


9.5 Funciones relacionadas con buffers 313Esas posiciones no son otras que el punto y la marca (que ro<strong>de</strong>an la región) <strong>en</strong> el bufferactual; aquí está nuestra <strong>de</strong>finición:( <strong>de</strong>fun app<strong>en</strong>d−to−b u f f e r ( b u f f e r s t a r t <strong>en</strong>d )" Agrega e l t e x t o <strong>de</strong> l a r e g i ón a l BUFFER .Es i n s e r t a d o <strong>en</strong> BUFFER a n t e s <strong>de</strong> su punto .Cuando es l l a m a d a <strong>de</strong>s<strong>de</strong> un programa r e c i b e t r e s argum<strong>en</strong>tos :un b u f f e r o su nombre , y dos numeros e s p e c i f i c a n d o e l a r e aa c o p i a r . "( i n t e r a c t i v e " BAgregar a l b u f f e r : \ nr " )( l e t ( ( o l d b u f ( c u r r e n t −b u f f e r ) ) )( save−e x c u r s i o n( s e t −b u f f e r ( get −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 <strong>en</strong>d ) ) ) )Analiza parte por parte la función y verás que no hay muchas cosas nuevas; lo que si ti<strong>en</strong>e esuna mezcla funcional <strong>de</strong> varias cosas que vimos muy por <strong>en</strong>cima. Primero te convi<strong>en</strong>e probarlapara que veas cómo funciona y eso aclarará mucho. Visita un archivo <strong>de</strong> prueba <strong>en</strong> un buffer,marca una región (pon la marca y mueve el punto un par <strong>de</strong> líneas abajo, por ejemplo). Ahoraregresa al buffer *scratch*, copia y evalúa esta función y pon el punto al final <strong>de</strong>l buffer.A continuación, regresa al buffer <strong>de</strong>l archivo que acabas <strong>de</strong> abrir (don<strong>de</strong> pusiste la marcay el punto anteriorm<strong>en</strong>te) y llama a la función: M-x app<strong>en</strong>d-to-buffer. Te pi<strong>de</strong> un buffer, tepropondrá el más reci<strong>en</strong>te (si hiciste lo que acabo <strong>de</strong> <strong>de</strong>cir, <strong>de</strong>be ser *scratch*); presiona Entery verás aparecer la región <strong>en</strong> el buffer *scratch*.Muy bi<strong>en</strong>. Ahora, ¿qué es lo que pasó? Vamos por partes:1. Sólo necesitamos tres argum<strong>en</strong>tos, el nombre <strong>de</strong>l buffer al que vamos a copiar (<strong>de</strong>stino) ylas posiciones <strong>de</strong>l punto y la marca <strong>en</strong> el buffer fu<strong>en</strong>te. Nota que no necesitamos tambiénel nombre <strong>de</strong>l buffer fu<strong>en</strong>te, porque para que la función haga lo que esperas que haga,ti<strong>en</strong>es – necesariam<strong>en</strong>te – que estar <strong>en</strong> dicho buffer.2. La forma ( interactive "BAgregar al buffer : \nr"), solicita un buffer (el <strong>de</strong>stino) y ya sabesque r pasa como dos argum<strong>en</strong>tos consecutivos las posiciones <strong>de</strong>l punto y la marca. Nosólo eso, r siempre pasa primero el más pequeño, así que cuando llamemos a insert-buffersubstring,que espera su segundo argum<strong>en</strong>to sea m<strong>en</strong>or o igual que su tercer argum<strong>en</strong>to,no t<strong>en</strong>dremos ningún problema.3. El cuerpo consta <strong>de</strong> una expresión let, que es la primera que vemos <strong>en</strong> acción. La usamospara guardar el buffer actual (el fu<strong>en</strong>te) <strong>en</strong> una variable local llamada oldbuf. ¿Por qué?Porque t<strong>en</strong>emos que cambiar <strong>de</strong> buffer (al <strong>de</strong>stino) para po<strong>de</strong>r insertar la subca<strong>de</strong>na.4. Nota también el uso <strong>de</strong> save-excursion, que con la explicación <strong>de</strong>l punto anterior ya <strong>de</strong>beser obvio. Lo usamos aquí (antes <strong>de</strong> cambiar <strong>de</strong> buffer) para que guar<strong>de</strong> la informacióna<strong>de</strong>cuada y nos regrese aquí cuando acabe la función.5. set-buffer es nueva, aunque ya la habíamos explicado <strong>en</strong> el la sección 9.4.5. Lo que hacees cambiar la at<strong>en</strong>ción <strong>de</strong> Emacs (si no está <strong>en</strong> la v<strong>en</strong>tana, no aparecerá por la acción<strong>de</strong> esta función) al buffer que recibe como parámetro. En este caso, le dice a Emacs,( set−buffer (get−buffer−create buffer )), que se cambie al buffer <strong>de</strong>stino, pero ¡oh sorpresa!aquí nos <strong>en</strong>contramos con otra función nueva: get-buffer-create, y, para no variar con


314 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>telos nombres largos y auto-explicativos <strong>de</strong> Emacs, esta función recibe una ca<strong>de</strong>na o unbuffer como argum<strong>en</strong>to. Si es un buffer se mueve a ese buffer; si es una ca<strong>de</strong>na, busca unbuffer con ese nombre y se mueve a él; finalm<strong>en</strong>te, si es una ca<strong>de</strong>na pero no hay ningúnbuffer <strong>en</strong> Emacs con ese nombre, crea uno nuevo y se mueve a él.6. Por último, t<strong>en</strong>emos ( insert −buffer−substring oldbuf start <strong>en</strong>d) que lo único que hace escortar la subca<strong>de</strong>na compr<strong>en</strong>dida <strong>en</strong>tre start y <strong>en</strong>d <strong>en</strong> nuestro buffer orig<strong>en</strong> (recuerda queguardamos su cont<strong>en</strong>ido <strong>en</strong> la variable oldbuf) y luego insertarla <strong>en</strong> la posición actual.9.5.2. Resum<strong>en</strong>Aquí está un resum<strong>en</strong> <strong>de</strong> las funciones que acabamos <strong>de</strong> revisar:<strong>de</strong>scribe-function Imprim<strong>en</strong> la docum<strong>en</strong>tación <strong>de</strong> una función o una variable.<strong>de</strong>scribe-variable Usualm<strong>en</strong>te están ligadas a C-h f y C-h v , respectivam<strong>en</strong>te.push-mark Pone la marca <strong>en</strong> una localidad particular y almac<strong>en</strong>a el valor <strong>de</strong> la marca anterior<strong>en</strong> el anillo <strong>de</strong> marcas. La marca es una posición <strong>en</strong> el buffer que mant<strong>en</strong>drá su posiciónrelativa aun cuando sea agregado o eliminado texto <strong>de</strong>l buffer.goto-char Pone el punto <strong>en</strong> la posición especificada por el valor <strong>de</strong> su argum<strong>en</strong>to, que pue<strong>de</strong>ser un número, un marcador, o una expresión que regresa el número <strong>de</strong> una posición, talcomo (point-min).insert-buffer-substring Copia una región <strong>de</strong> texto <strong>de</strong> un buffer, que se pasa como argum<strong>en</strong>toa la función <strong>en</strong> el buffer actual.mark-whole-buffer Marca todo el buffer como una región. Usualm<strong>en</strong>te está ligado a C-x h .set-buffer Cambia la at<strong>en</strong>ción <strong>de</strong> Emacs a otro buffer, pero no cambia la v<strong>en</strong>tana que estási<strong>en</strong>do <strong>de</strong>splegada. Se usa cuando un programa (a difer<strong>en</strong>cia <strong>de</strong> un humano) va a trabajar<strong>en</strong> un buffer distinto.get-buffer-create Encu<strong>en</strong>tra un buffer nombrado o crea uno si un buffer con eseget-buffer nombre no existe. La función get-buffer regresa nil si el buffer nombrado no existe.Actividad 9.39 Usa if y la función get-buffer para construir una función interactiva que imprimaun m<strong>en</strong>saje dici<strong>en</strong>do si un buffer dado existe o no.9.6. Funciones fundam<strong>en</strong>tales: car, cdr, consEn elisp, car, cdr y cons son funciones fundam<strong>en</strong>tales. La función cons se usa para construirlistas, mi<strong>en</strong>tras que las funciones car y cdr se usan para <strong>de</strong>scomponerlas.Retrasamos la discusión <strong>de</strong> estas funciones hasta este mom<strong>en</strong>to, porque para hacer cosasinteresantes usando estas funciones fundam<strong>en</strong>tales era necesario que conocieras las formas especialesque revisamos y que manejaras <strong>de</strong> mejor forma buffers, ca<strong>de</strong>nas, etc.


9.6 Funciones fundam<strong>en</strong>tales 315La función cons es una abreviatura <strong>de</strong> la palabra construct y sirve justam<strong>en</strong>te para construirlistas. Las otras dos funciones, <strong>de</strong>sgraciadam<strong>en</strong>te, ti<strong>en</strong><strong>en</strong> nombres esotéricos, y <strong>de</strong>safortunadosporque no significan absolutam<strong>en</strong>te nada útil; por razones históricas se sigu<strong>en</strong> usando y <strong>en</strong>funciones <strong>de</strong> Emacs sigu<strong>en</strong> apareci<strong>en</strong>do, así que aquí también los usaremos. Pero pue<strong>de</strong>s p<strong>en</strong>sar<strong>en</strong> ellas como primer elem<strong>en</strong>to, el car, y el resto <strong>de</strong> la lista, el cdr (que por cierto, se pronunciacould-er <strong>en</strong> inglés).También pres<strong>en</strong>taremos rápidam<strong>en</strong>te varias funciones utilitarias más, como l<strong>en</strong>gth, setcar,nthcdr y nthcdr. Culminaremos la sección y este breve curso <strong>de</strong> Emacs elisp revisando copyregion-as-kill,una función <strong>de</strong> Emacs muy útil y relativam<strong>en</strong>te más compleja que todas lasanteriores.9.6.1. car y cdrEl car <strong>de</strong> la lista es simplem<strong>en</strong>te el primer elem<strong>en</strong>to <strong>de</strong> la lista. El car <strong>de</strong> la lista (rosavioleta clavel azuc<strong>en</strong>a) es rosa. Int<strong>en</strong>ta evaluar lo sigui<strong>en</strong>te:( c a r ’ ( r o s a v i o l e t a c l a v e l azuc<strong>en</strong>a ) )Verás que el símbolo rosa aparece <strong>en</strong> el área <strong>de</strong> eco. Un mejor nombre sería first (y <strong>de</strong>hecho este nombre también existe <strong>en</strong> Emacs elisp; está <strong>de</strong>finido como un alias <strong>de</strong> car <strong>en</strong> elpaquete cl.el).El car no remueve el primer elem<strong>en</strong>to <strong>de</strong> la lista, esto es, <strong>de</strong>spués <strong>de</strong> aplicar car a una lista,la lista sigue si<strong>en</strong>do la misma. En el caló <strong>de</strong> elisp, esto significa que car es una función no<strong>de</strong>structiva.cdr <strong>de</strong> una lista es el resto <strong>de</strong> la lista, esto es, cdr regresa la parte <strong>de</strong> la lista que sigueal primer elem<strong>en</strong>to. De tal forma que (cdr ’(rosa violeta clavel azuc<strong>en</strong>a)) regresa (violetaclavel azuc<strong>en</strong>a).Al igual que car, cdr no remueve ningún elem<strong>en</strong>to <strong>de</strong> la lista. Claram<strong>en</strong>te, un mejor nombrepara cdr sería rest y al igual que first, rest también existe (<strong>en</strong> el paquete cl.el) y es un alias <strong>de</strong>cdr.Cuando car y cdr se aplican a listas <strong>de</strong> símbolos (como <strong>en</strong> los ejemplos anteriores) elelem<strong>en</strong>to <strong>de</strong> la lista regresado por car es rosa sin paréntesis, como símbolo. Sin embargo, elcdr <strong>de</strong> la lista es siempre otra lista.Por otro lado, <strong>en</strong> una lista <strong>de</strong> listas, el primer elem<strong>en</strong>to es una lista. car regresa este primerelem<strong>en</strong>to como lo que es: una lista. Por ejemplo, evalúa el sigui<strong>en</strong>te ejemplo:( c a r ’ ( ( l e ón t i g r e c h i t a )( g a z e l a a n t í l o p e z e b r a )( b a l l e n a d e l f ín t i b u r ón ) ) )Esta función regresa la lista <strong>de</strong> animales carnívoros, (león tigre chita), mi<strong>en</strong>tras que el cdr <strong>de</strong>esa lista es la lista: ((gazela antílope zebra) (ball<strong>en</strong>a <strong>de</strong>lfín tiburón)).


316 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teconsLa función cons construye una lista; es la inversa <strong>de</strong> car y cdr. Por ejemplo, cons pue<strong>de</strong>usarse para hacer una lista <strong>de</strong> cuatro elem<strong>en</strong>tos a partir <strong>de</strong> una lista <strong>de</strong> sólo tres elem<strong>en</strong>tos,agregando uno al principio así:( cons ’ r o s a ’ ( v i o l e t a c l a v e l azuc<strong>en</strong>a ) )Después <strong>de</strong> evaluar esa expresión verás a nuestra querida y vieja amiga, la lista (rosa violetaclavel azuc<strong>en</strong>a) aparecer <strong>en</strong> el área <strong>de</strong> eco.cons siempre requiere una lista como segundo argum<strong>en</strong>to y lo que regresa es una nuevalista cuyo car es el primer argum<strong>en</strong>to y cuyo cdr es su segundo argum<strong>en</strong>to (la lista). No pue<strong>de</strong>sempezar una lista a partir <strong>de</strong> nada, necesitas empezarla a partir <strong>de</strong> la lista vacía. Por ejemplo,evalúa las sigui<strong>en</strong>tes expresiones <strong>en</strong> secu<strong>en</strong>cia:( cons ’ azuc<strong>en</strong>a ( ) )( cons ’ c l a v e l ’ ( azuc<strong>en</strong>a ) )( cons ’ v i o l e t a ’ ( c l a v e l azuc<strong>en</strong>a ) )( cons ’ r o s a ’ ( v i o l e t a c l a v e l azuc<strong>en</strong>a ) )Nota que <strong>en</strong> la primera expresión estamos usando a ( ) como la lista vacía, pero recuerdaque es exactam<strong>en</strong>te lo mismo que usar nil .Encontrar la longitud <strong>de</strong> una lista: l<strong>en</strong>gthnthcdrPue<strong>de</strong>s usar la función l<strong>en</strong>gth <strong>de</strong> elisp para saber cuántos elem<strong>en</strong>tos ti<strong>en</strong>e una lista, como<strong>en</strong> los sigui<strong>en</strong>tes ejemplos:( l e n g t h ’ ( azuc<strong>en</strong>a ) )( l e n g t h ’ ( d a i s y b u t t e r c u p ) )( l e n g t h ( ) )Los valores que obt<strong>en</strong>drás una vez que evalúes las expresiones, repres<strong>en</strong>tan el número <strong>de</strong>elem<strong>en</strong>tos <strong>en</strong> cada lista, 1, 2 y 0 respectivam<strong>en</strong>te.La función nthcdr está asociada con la función cdr. Lo que hace es aplicar cdr repetidam<strong>en</strong>te.Si sacas el cdr <strong>de</strong> la lista ( rosa violeta clavel azuc<strong>en</strong>a) obt<strong>en</strong>drás la lista ( violeta clavel azuc<strong>en</strong>a).Si ahora sacas el cdr <strong>de</strong> esta nueva lista, obt<strong>en</strong>drás ( clavel azuc<strong>en</strong>a); (nota que si sacas dosveces el cdr <strong>de</strong> la misma lista, obt<strong>en</strong>drás lo mismo, ya que es no <strong>de</strong>structiva). Es <strong>de</strong>cir, si evalúas(cdr (cdr (rosa violeta clavel azuc<strong>en</strong>a ))) obt<strong>en</strong>drás ( clavel azuc<strong>en</strong>a).La función nthcdr hace lo mismo que repetidas llamadas a cdr anidadas. En el sigui<strong>en</strong>teejemplo, el argum<strong>en</strong>to 2 se pasa a la función nthcdr, junto con la lista, y el valor que regresa esla lista sin los dos primeros elem<strong>en</strong>tos, que es lo mismo que aplicar dos veces cdr <strong>en</strong> ca<strong>de</strong>na.( n t h c d r 2 ’ ( r o s a v i o l e t a c l a v e l azuc<strong>en</strong>a ) )


9.6 Funciones fundam<strong>en</strong>tales 317Actividad 9.40 Usando la lista original, ( rosa violeta clavel azuc<strong>en</strong>a), aplica nthcdr pasándoleargum<strong>en</strong>tos numéricos <strong>de</strong>l 0 al 5. ¿Pue<strong>de</strong>s explicarlo? Si no pue<strong>de</strong>s, <strong>en</strong>tonces aplica elmismo número <strong>de</strong> veces (<strong>de</strong> manera anidada) cdr a la misma lista. Ahora sí, explícalo.setcarComo te pue<strong>de</strong>s imaginar por sus nombres, las funciones setcar y setcdr (que veremos<strong>en</strong> un mom<strong>en</strong>to) asignan nuevos valores al car y al cdr <strong>de</strong> una lista. En realidad cambian lalista original, a difer<strong>en</strong>cia <strong>de</strong> car y cdr que son no <strong>de</strong>structivas. Una forma <strong>de</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>r cómofunciona esto es experim<strong>en</strong>tando. Empezaremos con la función setcar.Primero, po<strong>de</strong>mos hacer una lista y luego asignar a una variable dicha lista, utilizando lafunción setq. Aquí está una lista <strong>de</strong> animales:( s e t q a n i m a l e s ’ ( g i r a f a a n t i l o p e t i g r e l e o n ) ) .Evalúa las sigui<strong>en</strong>tes expresiones. Una vez evaluadas, pue<strong>de</strong>s confirmar que la variableanimales ahora apunta a la lista ( girafa antilope tigre leon). A continuación, evalúa la funciónsetcar pasándole dos argum<strong>en</strong>to, la variable animales y el símbolo citado hipo; es <strong>de</strong>cir, evalúa:( s e t c a r a n i m a l e s ’ hipo )Verás el símbolo hipo aparecer <strong>en</strong> el área <strong>de</strong> eco. Ahora evalúa nuevam<strong>en</strong>te la variable animalesy notarás que la lista ha cambiado.setcdrLa función setcdr es similar a la función setcar, excepto que esta función cambia el segundoy subsecu<strong>en</strong>tes elem<strong>en</strong>tos <strong>de</strong> una lista <strong>en</strong> lugar <strong>de</strong>l primero.Por ejemplo, asigna el valor <strong>de</strong> una variable animales−domesticables, evaluando la sigui<strong>en</strong>teexpresión:( s e t q animales −d o m e s t i c a b l e s ’ ( c a b a l l o vaca o v e j a p e r r o ) )Ahora, evalúa:( s e t c d r animales −d o m e s t i c a b l e s ’ ( g a t o c o c o d r i l o ) )Verás la lista (gato cocodrilo ) aparecer <strong>en</strong> el área <strong>de</strong> eco. Ése es el valor <strong>de</strong> regreso <strong>de</strong> la función;ahora verifica su efecto secundario, evaluando animales−domesticables.Actividad 9.41 Construye una lista <strong>de</strong> aves evaluando varias expresiones cons. Guarda esalista <strong>en</strong> una variable, con setq. Investiga qué pasa cuando haces un cons <strong>de</strong> una lista conella misma; por ejemplo, qué pasa cuando haces (cons aves aves), suponi<strong>en</strong>do, claro, que lavariable don<strong>de</strong> guardaste tu lista se llama aves. Reemplaza la primera ave <strong>de</strong> tu lista con unpez. Reemplaza el resto <strong>de</strong> las aves <strong>en</strong> la lista con peces.


318 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te9.6.2. Cortando y guardando textoCuando matas texto <strong>en</strong> un buffer, con alguno <strong>de</strong> los comandos que matan texto, Emacsguarda ese texto <strong>en</strong> una lista para que puedas traerlo <strong>de</strong> nuevo a la vida con alguno <strong>de</strong> loscomandos que hac<strong>en</strong> yank. Por lo que la lista pue<strong>de</strong> lucir más o m<strong>en</strong>os así:( " un pedazo <strong>de</strong> t e x t o " " t e x t o f i n a l " )La función cons pue<strong>de</strong> usarse para añadir una pieza <strong>de</strong> texto a esta lista, como <strong>en</strong>:( cons " o t r a p i e z a <strong>de</strong> t e x t o " ’ ( " un pedazo <strong>de</strong> t e x t o " " t e x t o f i n a l " ) )Y <strong>de</strong>spués, con un uso apropiado <strong>de</strong> car y nthcdr pue<strong>de</strong>s obt<strong>en</strong>er <strong>de</strong> vuelta todas las secciones<strong>de</strong> texto almac<strong>en</strong>adas <strong>en</strong> la lista. Por ejemplo, si quisieras el segundo elem<strong>en</strong>to <strong>de</strong> la lista,podrías evaluar:( c a r ( n t h c d r 1 ’ ( " o t r a p i e z a <strong>de</strong> t e x t o "" un pedazo <strong>de</strong> t e x t o "" t e x t o f i n a l " ) ) )que <strong>de</strong>be mostrar "un pedazo <strong>de</strong> texto ".Las funciones <strong>de</strong> Emacs que hac<strong>en</strong> kill y yank <strong>en</strong> realidad son más complejas. Para empezar,el anillo <strong>de</strong> la muerte (equival<strong>en</strong>te a nuestra lista <strong>en</strong> el ejemplo anterior) es circular (<strong>de</strong> ahí elnombre <strong>de</strong> anillo) por lo que una vez que llegas al último elem<strong>en</strong>to, si quieres seguir buscandopartes <strong>de</strong> texto <strong>en</strong> el anillo, te <strong>de</strong>be llevar al primero <strong>de</strong> la lista.La función principal <strong>de</strong> este capítulo ti<strong>en</strong>e que ver con el anillo <strong>de</strong> la muerte y cómo se usa.Para que te vayas aclimatando, primero te mostraremos una función llamada zap–to–char.zap-to-charLa función zap-to-char elimina el texto <strong>en</strong> la región compr<strong>en</strong>dida <strong>en</strong>tre la localización <strong>de</strong>lcursor (i.e. el punto) y la sigui<strong>en</strong>te aparición <strong>de</strong> un carácter (incluido este último) dado. El textoque zap-to-char elimina se guarda <strong>en</strong> el anillo <strong>de</strong> la muerte; y pue<strong>de</strong> sacarse <strong>de</strong> ahí con C-y(yank). Si se le pasa un argum<strong>en</strong>to prefijo, <strong>en</strong>tonces elimina el texto hasta <strong>en</strong>contrar ese número<strong>de</strong> pres<strong>en</strong>cias <strong>de</strong>l carácter.Entonces, si el cursor estuviera al inicio <strong>de</strong> esta oración y el carácter fuera s, Entonces,sería eliminada. Si el argum<strong>en</strong>to prefijo fuese 2, ‘Entonces, s’ sería eliminado.Para <strong>de</strong>terminar cuánto texto ti<strong>en</strong>e que ser eliminado, zap-to-char utiliza una función <strong>de</strong>búsqueda. Las búsquedas se usan ext<strong>en</strong>sivam<strong>en</strong>te <strong>en</strong> el código que manipula texto <strong>en</strong> Emacs,por lo que mi<strong>en</strong>tras revisamos estas funciones te rogamos pongas especial at<strong>en</strong>ción <strong>en</strong> la función<strong>de</strong> búsqueda y <strong>en</strong> la <strong>de</strong> borrado.


9.6 Funciones fundam<strong>en</strong>tales 3191 ( <strong>de</strong>fun zap−to−c h a r ( a r g c h a r )2 " Mata e l t e x t o h a s t a l a ARG−ésima a p a r i c i ón <strong>de</strong> CHAR.3 Va h a c i a a t r ás s i ARG es n e g a t i v o . Marca un e r r o r s i CHAR4 no es e n c o n t r a d o . "5 ( i n t e r a c t i v e "∗ p \ ncZap t o c h a r : " )6 ( k i l l −r e g i o n ( p o i n t )7 ( progn8 ( s e a r c h −f o r w a r d ( char −to−s t r i n g c h a r ) n i l n i l a r g )9 ( p o i n t ) ) ) )Analicemos ahora la función por partes:1. La sección 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 <strong>en</strong> otras palabras, si es <strong>de</strong> sólo lectura. Esto es obvio, porque si no po<strong>de</strong>moseditarlo, no po<strong>de</strong>mos borrar texto alguno.b) La ‘p’ le dice a Emacs que la función recibirá como primer argum<strong>en</strong>to el argum<strong>en</strong>toprefijo. Éste ya lo conocías.c) El \n separa los argum<strong>en</strong>tos y la c le dice a Emacs que <strong>de</strong>be pedir un carácter, utilizandopara ello el prompt: Zap to char : .2. El cuerpo <strong>de</strong> la función conti<strong>en</strong>e la función que mata (esto es, que elimina) el texto <strong>de</strong> laregión <strong>de</strong>s<strong>de</strong> la posición actual (la primera pres<strong>en</strong>cia <strong>de</strong> ( point )) hasta la posición (incluidaella) don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra el carácter. Esto es la primera parte:6 ( k i l l −r e g i o n ( p o i n t ) . . .La sigui<strong>en</strong>te parte <strong>de</strong>l código utiliza la función progn. El cuerpo <strong>de</strong> progn consiste <strong>de</strong>llamadas a search-forward y nuevam<strong>en</strong>te a point. Es más fácil <strong>en</strong>t<strong>en</strong><strong>de</strong>r el funcionami<strong>en</strong>to<strong>de</strong> progn una vez que <strong>en</strong>ti<strong>en</strong>das cómo funciona la búsqueda hacia a<strong>de</strong>lante, searchforward,así que primero veremos esta última y luego regresamos a progn.3. La función search-forward se usa para localizar el carácter que marca la posición hastala que queremos cortar el texto. Si la búsqueda es exitosa, <strong>de</strong>ja el punto inmediatam<strong>en</strong>te<strong>de</strong>spués <strong>de</strong>l último carácter <strong>en</strong> la ca<strong>de</strong>na objetivo (<strong>en</strong> este caso, la ca<strong>de</strong>na objetivo es sólo<strong>de</strong> un carácter <strong>de</strong> largo). Si la búsqueda es hacia atrás, <strong>de</strong>ja el punto justo antes <strong>de</strong>l primercarácter <strong>en</strong> la ca<strong>de</strong>na objetivo. A<strong>de</strong>más, search-forward regresa t para señalar verda<strong>de</strong>ro,por lo que mover el punto es un efecto secundario.En zap-to-char, la llamada a la función search-forward luce como:8 ( s e a r c h −f o r w a r d ( char −to−s t r i n g c h a r ) n i l n i l a r g )La función search-forward toma cuatro argum<strong>en</strong>tos:a) El primer argum<strong>en</strong>to es el objetivo, aquello que estamos buscando. Éste <strong>de</strong>be ser unaca<strong>de</strong>na, tal como “s”.Nota que <strong>en</strong> elisp, un carácter no es visto (automáticam<strong>en</strong>te) como una ca<strong>de</strong>na <strong>de</strong>un solo carácter. Por eso usamos (char−to−string char) para transformar el caráctera una ca<strong>de</strong>na, como search-forward lo quiere.


320 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teb) El segundo argum<strong>en</strong>to limita la búsqueda; es una posición específica <strong>en</strong> el buffer.En este caso, la búsqueda pue<strong>de</strong> ir hasta el final <strong>de</strong>l buffer, por lo que no estamoslimitando la búsqueda y <strong>en</strong>tonces usamos nil .c) El tercer argum<strong>en</strong>to le dice a la función qué <strong>de</strong>be hacer si la búsqueda falla – pue<strong>de</strong>señalar un error (e imprimir un m<strong>en</strong>saje) o pue<strong>de</strong> regresar nil . Usar nil como tercerargum<strong>en</strong>to provoca que la función marque un error.d) El cuarto argum<strong>en</strong>to para search-forward es una cu<strong>en</strong>ta <strong>de</strong> repetición – cuántaspres<strong>en</strong>cias <strong>de</strong> la ca<strong>de</strong>na <strong>de</strong>be buscar. Este argum<strong>en</strong>to es opcional y si la función sellama sin una cu<strong>en</strong>ta <strong>de</strong> repetición, la función recibe por omisión 1. Si este argum<strong>en</strong>toes negativo, la búsqueda va hacia atrás.En su forma g<strong>en</strong>eral, search-forward se ve así:( s e a r c h −f o r w a r d " ca<strong>de</strong>na o b j e t i v o "l ímite−<strong>de</strong>−la −búsquedaque−hacer −s i −la −búsqueda−f a l l acu<strong>en</strong>ta −<strong>de</strong>−r e p e t i c i ón )4. La función progn es tal que provoca que todos sus argum<strong>en</strong>tos sean evaluados <strong>en</strong> secu<strong>en</strong>ciay luego regresa el valor <strong>de</strong>l último. Las expresiones previas (a la última) se evalúansólo por sus efectos secundarios, ya que sus valores <strong>de</strong> regreso se <strong>de</strong>scartan.Su forma g<strong>en</strong>eral es:( prognc uerpo . . . )En zap-to-char, la expresión progn ti<strong>en</strong>e que hacer dos cosas: poner el punto <strong>en</strong> la posicióncorrecta y luego regresar la posición <strong>de</strong> ese punto para que kill-region pueda hacersu trabajo.El primer argum<strong>en</strong>to <strong>de</strong> progn es search-forward. El segundo argum<strong>en</strong>to es (point). Estaexpresión regresa el valor <strong>de</strong>l punto, que <strong>en</strong> este caso será la localización a la que se hamovido search-forward.De acuerdo, <strong>de</strong> acuerdo, fue una explicación muy larga. Lo s<strong>en</strong>timos, pero no conocíassearch-forward y progn, que son dos funciones muy útiles y muy usadas <strong>en</strong> elisp. Así queaquí te va un resum<strong>en</strong> <strong>de</strong> cómo funciona zap-to-char ahora que sabes cómo funcionan todaslas funciones auxiliares:El primer argum<strong>en</strong>to pasado a kill-region es la posición <strong>de</strong>l punto <strong>en</strong> el mom<strong>en</strong>to que ejecutaszap-to-char. D<strong>en</strong>tro <strong>de</strong>l progn, la función <strong>de</strong> búsqueda mueve el punto justo <strong>de</strong>spués <strong>de</strong>lcarácter hasta el que queremos cortar; point regresa el punto <strong>de</strong> esta nueva posición. La funciónkill-region pone estos dos valores juntos, el primero como inicio <strong>de</strong> la región y el segundo comoel punto final <strong>de</strong> ésta y elimina la región.La función progn es necesaria porque kill-region recibe sólo dos argum<strong>en</strong>tos; y fallaría sisearch-forward y point fueran escritas <strong>en</strong> secu<strong>en</strong>cia, <strong>en</strong> lugar <strong>de</strong> como argum<strong>en</strong>tos <strong>de</strong> progn.Es <strong>de</strong>cir que progn es el segundo argum<strong>en</strong>to <strong>de</strong> kill-region y su valor <strong>de</strong> regreso es el valor queregresa ( point ).Obviam<strong>en</strong>te, ésta no es la única manera <strong>de</strong> hacer esta función: bi<strong>en</strong> pudimos haber guardadoel valor regresado por search-forward <strong>en</strong> una variable local (con let) y luego usarlo <strong>en</strong> kill-


9.6 Funciones fundam<strong>en</strong>tales 321region. Pero esta forma que hemos revisado, es la que se usa <strong>de</strong>s<strong>de</strong> la versión 19 <strong>de</strong> Emacs y esmás elegante, a<strong>de</strong>más <strong>de</strong> que muestra el uso <strong>de</strong> una nueva función que te servirá mucho: progn.<strong>de</strong>lete-region: nota culturalLa función zap-to-region que acabamos <strong>de</strong> ver utiliza a la función kill-region; ésta a su vezutiliza otras dos funciones, copy-region-as-kill, que veremos <strong>en</strong> un minuto, y <strong>de</strong>lete-region.La función <strong>de</strong>lete-region es interesante y muy s<strong>en</strong>cilla; lo único que hace es borrar texto <strong>de</strong>forma tal que no puedas recuperarlo.Sin embargo, <strong>de</strong>lete-region no está escrita <strong>en</strong> Emacs-elisp sino <strong>en</strong> C. Es una <strong>de</strong> las primitivas<strong>de</strong> Emacs.9.6.3. Inicialización <strong>de</strong> variables: <strong>de</strong>fvarÉsta es la última parada antes <strong>de</strong> po<strong>de</strong>r explicar copy-region-as-kill y es importante, porquela variable kill −ring, el lugar don<strong>de</strong> se guardan todas las secciones <strong>de</strong> texto que se matan, secrea con <strong>de</strong>fvar.La función <strong>de</strong>fvar vi<strong>en</strong>e <strong>de</strong> <strong>de</strong>fine variable y es una forma especial, similar a setq yaque asigna un valor a una variable. Sin embargo, es distinta a setq <strong>en</strong> dos aspectos: primero,sólo asigna un valor a una variable si la variable aún no ti<strong>en</strong>e uno; si la variable ya ti<strong>en</strong>e unvalor, <strong>de</strong>fvar no sobreescribe su valor actual. Segundo, <strong>de</strong>fvar ti<strong>en</strong>e una ca<strong>de</strong>na que sirve paradocum<strong>en</strong>tar la variable.Para ver el valor actual <strong>de</strong> una variable cualquiera, usamos <strong>de</strong>scribe-variable, usualm<strong>en</strong>teligada a C-h v . Por ejemplo, checa lo que dice C-h v cuando le pasas kill-ring. Verás doscosas importantes: primero su valor, que pue<strong>de</strong> ser muy pequeño o muy gran<strong>de</strong>, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong>cuánto hayas matado <strong>en</strong> la sesión <strong>de</strong> Emacs hasta el mom<strong>en</strong>to; verás también su docum<strong>en</strong>tación,que comi<strong>en</strong>za más o m<strong>en</strong>os así:Docum<strong>en</strong>tation :L i s t of k i l l e d t e x t s e q u e n c e s .La <strong>de</strong>finición <strong>de</strong> kill-ring usando <strong>de</strong>fvar pue<strong>de</strong> 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 s e q u e n c e s . " )Como pue<strong>de</strong>s notar, su valor inicial es nil , que ti<strong>en</strong>e s<strong>en</strong>tido, ya que si no has guardadonada <strong>en</strong> el anillo no esperarías que cuando quieras pegar (recuperar <strong>de</strong>l anillo, o revivir) 9 , algoapareciera, ¿o sí?9 No hay traducción exacta para yank, pero <strong>en</strong> notación <strong>de</strong> muchos otros editores <strong>de</strong> texto, equivaldríaa pegar, sólo que es mucho más po<strong>de</strong>roso porque ti<strong>en</strong>e memoria.


322 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te9.6.4. copy-region-as-killLa función copy-region-as-kill copia una región <strong>de</strong> texto <strong>de</strong>l buffer <strong>en</strong> una variable que sellama kill −ring. Si llamas a kill-region-as-kill inmediatam<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> haber ejecutado unkill-region, Emacs junta la sección <strong>de</strong> texto recién copiada con la anterior. Esto significa que sihaces un yank <strong>de</strong>spués, obt<strong>en</strong>drás todo el texto <strong>de</strong> las últimas dos operaciones <strong>de</strong> muerte. Porotro lado, si algún otro comando prece<strong>de</strong> a la acción <strong>de</strong> copy-region-as-kill, la función copiael texto <strong>en</strong> una <strong>en</strong>trada separada <strong>en</strong> el anillo <strong>de</strong> la muerte.Aquí está el código <strong>de</strong> la función. Probablem<strong>en</strong>te <strong>en</strong> versiones muy reci<strong>en</strong>tes <strong>de</strong> Emacs seadistinto; <strong>de</strong> cualquier forma esta versión es lo sufici<strong>en</strong>tem<strong>en</strong>te compleja e interesante para quela analicemos aquí.1 ( <strong>de</strong>fun copy−r e g i o n −as−k i l l ( beg <strong>en</strong>d )2 " 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 ero no l a mata . "3 ( i n t e r a c t i v e " r " )4 ( i f ( eq l a s t −command ’ k i l l −r e g i o n )5 ( k i l l −app<strong>en</strong>d ( b u f f e r −s u b s t r i n g beg <strong>en</strong>d ) ( < <strong>en</strong>d beg ) )6 ( s e t q k i l l −r i n g7 ( cons ( b u f f e r −s u b s t r i n g beg <strong>en</strong>d ) k i l l −r i n g ) )8 ( 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 )9 ( 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 ) ) )10 ( s e t q t h i s −command ’ k i l l −r e g i o n )11 ( s e t q k i l l −r i n g −yank−p o i n t e r k i l l −r i n g ) )El cuerpoSi revisas con cuidado la <strong>de</strong>finición notarás que ti<strong>en</strong>e sus cinco partes. Los dos argum<strong>en</strong>tos,beg y <strong>en</strong>d y el código “r” <strong>de</strong> interactive (que regresa la región, como dos argum<strong>en</strong>tos numéricosconsecutivos) <strong>de</strong>b<strong>en</strong> darte una i<strong>de</strong>a respecto a qué hac<strong>en</strong> refer<strong>en</strong>te al inicio (beg, por beginning) yfin (<strong>en</strong>d) <strong>de</strong> la región. Los parámetros están <strong>en</strong> inglés, porque cuando comi<strong>en</strong>ces a ver el código<strong>de</strong> distintas funciones <strong>de</strong> Emacs por tu cu<strong>en</strong>ta, verás que la región se usa exhaustivam<strong>en</strong>te ycuriosam<strong>en</strong>te éstos son los nombre favoritos para nombres <strong>de</strong> parámetros <strong>en</strong> funciones quemanejan la región.El cuerpo <strong>de</strong> la función comi<strong>en</strong>za con un if – línea 4 –. Nos sirve para distinguir dos tipos<strong>de</strong> situaciones: saber si el comando ejecutado inmediatam<strong>en</strong>te antes que éste fue (o no) unkill-region. En caso <strong>de</strong> que haya sido, la nueva región muerta se pega a la anterior. En casocontrario, se inserta (la región muerta) al inicio <strong>de</strong>l anillo <strong>de</strong> la muerte.Las últimas expresiones son setq. Una asigna a la variable this −command el valor kill −regiony la otra hace que la variable kill −ring−yank−pointer apunte al anillo <strong>de</strong> la muerte.El cuerpo <strong>de</strong>l copy-region-as-kill amerita una discusión más <strong>de</strong>tallada y la mostramos acontinuación:La función copy-region-as-kill fue escrita con sumo cuidado para po<strong>de</strong>r:


9.6 Funciones fundam<strong>en</strong>tales 323Fusionar uno o más comandos que matan <strong>en</strong> una sola pieza <strong>de</strong> texto que pudiera ser pegadanuevam<strong>en</strong>te con un solo comando. No ti<strong>en</strong>es i<strong>de</strong>a lo útil que es esto, pero ev<strong>en</strong>tualm<strong>en</strong>telo sabrás.Todo lo que matas (o los comandos que matan hacia a<strong>de</strong>lante) se aña<strong>de</strong>n al final <strong>de</strong>l textocopiado previam<strong>en</strong>te, y los comandos que copian o matan texto <strong>en</strong> reversa se copian alprincipio <strong>de</strong>l texto copiado previam<strong>en</strong>te. De esta manera, las palabras <strong>en</strong> el texto (que seva pegando) se manti<strong>en</strong><strong>en</strong> <strong>en</strong> el or<strong>de</strong>n correcto.La función hace uso <strong>de</strong> dos variables para mant<strong>en</strong>er el rastro <strong>de</strong> los comandos actual yanterior que ejecutó Emacs. Las dos variables son this −command y last −command.Normalm<strong>en</strong>te, siempre que una función se ejecuta Emacs asigna esa función a this −command,<strong>en</strong> este ejemplo copy-region-as-kill. Al mismo tiempo, Emacs asigna el valor <strong>de</strong> last −commandal valor anterior <strong>de</strong> this −command. Sin embargo, el comando copy-region-as-kill es difer<strong>en</strong>te;asigna el valor <strong>de</strong> this −command a kill −region, que es el nombre <strong>de</strong> la función que llama acopy-region-as-kill.En la primera parte <strong>de</strong>l cuerpo <strong>de</strong> copy-region-as-kill, una expresión if <strong>de</strong>termina si el valor<strong>de</strong> last −command es kill-region. Si lo es, la parte “<strong>en</strong>tonces” <strong>de</strong>l if se evalúa; usa la función killapp<strong>en</strong>dpara concat<strong>en</strong>ar el texto copiado con esta llamada al texto que ya se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> laprimera posición <strong>de</strong>l anillo <strong>de</strong> la muerte. Por otro lado, si el valor <strong>de</strong> last −command no eskill-region, <strong>en</strong>tonces la función copy-region-as-kill agrega un nuevo elem<strong>en</strong>to al anillo <strong>de</strong> lamuerte.La función kill-app<strong>en</strong>dLa función kill-app<strong>en</strong>d que se usa <strong>en</strong> la <strong>de</strong>finición <strong>de</strong> copy-region-as-kill se muestra acontinuación:( <strong>de</strong>fun k i l l −app<strong>en</strong>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, po<strong>de</strong>mos analizarla por partes (nota que no ti<strong>en</strong>e docum<strong>en</strong>tación). La funciónsetcar utiliza concat para concat<strong>en</strong>ar el nuevo texto al car <strong>de</strong>l anillo <strong>de</strong> la muerte. Sipre-agrega o post-agrega, <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong>l resultado <strong>de</strong> la expresión 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 región que se está matando está antes que la región que mató el último comando,<strong>en</strong>tonces <strong>de</strong>bemos agregar antes (pre-agregar) el texto; contrariam<strong>en</strong>te, si el texto muerto siguea lo que se mató con anterioridad, <strong>en</strong>tonces <strong>de</strong>bemos agregarlo <strong>de</strong>spués. La expresión if <strong>de</strong>p<strong>en</strong><strong>de</strong><strong>de</strong>l predicado before−p para <strong>de</strong>cidir si el texto nuevo <strong>de</strong>be ir antes o <strong>de</strong>spués <strong>de</strong> lo que está <strong>en</strong>el car <strong>de</strong>l anillo <strong>de</strong> la muerte.


324 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teEl símbolo before−p es el nombre <strong>de</strong> uno <strong>de</strong> los argum<strong>en</strong>tos <strong>de</strong> kill-app<strong>en</strong>d. En la funcióncopy-region-as-kill su valor se calcula con (< <strong>en</strong>d beg), lo que es verda<strong>de</strong>ro cuando el texto queestamos cortando va antes que los que están <strong>en</strong> el car <strong>de</strong>l anillo <strong>de</strong> la muerte (y por <strong>en</strong><strong>de</strong> serápre-agregado).Pre-agregar está repres<strong>en</strong>tado 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 <strong>en</strong>t<strong>en</strong><strong>de</strong>r cómo funciona esto, primero necesitamos <strong>en</strong>t<strong>en</strong><strong>de</strong>r cómo funciona concat.La función concat liga o une dos ca<strong>de</strong>nas <strong>de</strong> texto. El resultado es una ca<strong>de</strong>na. Por ejemplo,( c o n c a t " abc " " d e f " )regresa "abc<strong>de</strong>f".Ahora sí, po<strong>de</strong>mos <strong>en</strong>t<strong>en</strong><strong>de</strong>r rápidam<strong>en</strong>te cómo funciona kill-app<strong>en</strong>d: modifica el cont<strong>en</strong>ido<strong>de</strong>l anillo <strong>de</strong> la muerte. La función setcar cambia <strong>en</strong> realidad el primer elem<strong>en</strong>to <strong>de</strong> la lista.Logra esto usando concat para reemplazar el viejo cont<strong>en</strong>ido <strong>de</strong>l primer elem<strong>en</strong>to <strong>de</strong>l anillocon un nuevo primer elem<strong>en</strong>to que se obti<strong>en</strong>e concat<strong>en</strong>ando el viejo texto con el nuevo (el textorecién muerto, esto es). El nuevo texto se pone antes que el viejo o al revés, <strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> siestaba antes o <strong>de</strong>spués <strong>en</strong> el buffer, respectivam<strong>en</strong>te.La parte final <strong>de</strong> copy-region-as-killMuy bi<strong>en</strong>; <strong>de</strong>spués <strong>de</strong> haber <strong>en</strong>t<strong>en</strong>dido cómo funciona copy-region-as-kill cuando el comandoprevio fue también un kill-region, ahora t<strong>en</strong>emos que ver la última parte: ¿qué pasacuando el comando previo no fue kill-region?Lo que hace es asignar como valor al anillo <strong>de</strong> la muerte una nueva lista que es igual a laanterior, pero ahora como primer elem<strong>en</strong>to ti<strong>en</strong>e el texto recién cortado. Esto se logra con lasección:6 ( s e t q k i l l −r i n g7 ( cons ( b u f f e r −s u b s t r i n g beg <strong>en</strong>d ) k i l l −r i n g ) )La sigui<strong>en</strong>te parte es nuevam<strong>en</strong>te una expresión if. Esta expresión sirve únicam<strong>en</strong>te paramant<strong>en</strong>er acotado el tamaño <strong>de</strong>l anillo <strong>de</strong> la muerte; usualm<strong>en</strong>te su valor es 30. Es <strong>de</strong>cir, evitaque el anillo <strong>de</strong> la muerte guar<strong>de</strong> más allá <strong>de</strong>l valor que t<strong>en</strong>ga kill-ring-max. Esto se logra conla sección <strong>de</strong> código:8 ( 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 )9 ( 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 expresión if es que si pasa <strong>de</strong>l tamaño permitido, <strong>en</strong>tonces convierte <strong>en</strong> nilel último elem<strong>en</strong>to <strong>de</strong>l anillo <strong>de</strong> la muerte. Ya vimos las funciones setcdr y nthcdr así que esto


9.6 Funciones fundam<strong>en</strong>tales 325no <strong>de</strong>be parecerte tan extraño. Salvo quizá por el uso <strong>de</strong> la función llamada 1−, que resta uno asu argum<strong>en</strong>to.A continuación sigu<strong>en</strong> dos asignaciones <strong>en</strong> el código <strong>de</strong> copy-region-as-kill, la primera:10 ( 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 <strong>de</strong>l if anterior, por lo que se ejecutan siempreque se ejecute la función. Lo único que hace es guardar el símbolo kill −region <strong>en</strong> la variablethis −command, por lo que si volvemos a copiar algún texto inmediatam<strong>en</strong>te <strong>de</strong>spués, éste serápegado al car <strong>de</strong>l anillo <strong>de</strong> la muerte.Finalm<strong>en</strong>te, la última línea11 ( s e t q k i l l −r i n g −yank−p o i n t e r k i l l −r i n g )actualiza el apuntador global kill −ring−yank−pointer que dice <strong>en</strong> todo mom<strong>en</strong>to cuál es elsigui<strong>en</strong>te texto a revivir. Esta variable es usada por yank y yank-pop, pero, por cuestiones <strong>de</strong>espacio, ya no ceremos estas dos últimas funciones veremos aquí.9.6.5. Resum<strong>en</strong>Aquí está un resum<strong>en</strong> <strong>de</strong> las funciones que introdujimos reci<strong>en</strong>tem<strong>en</strong>te:car Regresa el primer elem<strong>en</strong>to <strong>de</strong> una lista.cdr Regresa el resto <strong>de</strong> la lista.nthcdr Regresa el resultado <strong>de</strong> sacar el cdr ‘n’ veces a una lista.cons Construye una lista agregando su primer argum<strong>en</strong>to como primer elem<strong>en</strong>to a la lista querecibe como segundo argum<strong>en</strong>to. Si no recibe una lista como segundo argum<strong>en</strong>to, <strong>en</strong>toncescrea lo que se conoce como una lista impropia, aunque todo lo que se pue<strong>de</strong> hacer conlistas impropias se pue<strong>de</strong> hacer con listas normales, así que no <strong>de</strong>bería preocuparte.setcar Cambia el primer elem<strong>en</strong>to <strong>de</strong> una lista.setcdr Cambia el resto <strong>de</strong> una lista.progn Evalúa cada uno <strong>de</strong> sus argum<strong>en</strong>tos <strong>en</strong> secu<strong>en</strong>cia y regresa el valor <strong>de</strong>l último, <strong>de</strong>scartandotodos los valores intermedios.search-forward Busca una ca<strong>de</strong>na y si la <strong>en</strong>cu<strong>en</strong>tra, mueve el punto. Recibe cuatro argum<strong>en</strong>tos:1. La ca<strong>de</strong>na a buscar (objetivo).2. Opcional, un límite para la búsqueda.3. Opcional, qué hacer si falla, regresa nil o un m<strong>en</strong>saje <strong>de</strong> error.4. Opcional, cuántas veces repetir la búsqueda; si el argum<strong>en</strong>to es negativo, busca haciaatrás.kill-region Corta el texto <strong>en</strong>tre el punto y la marca <strong>de</strong>l buffer y lo guarda <strong>en</strong> el anillo <strong>de</strong> lamuerte, para que puedas revivirlo con yank.


326 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te<strong>de</strong>lete-region Elimina el texto <strong>en</strong>tre el punto y la marca <strong>de</strong>l buffer y lo <strong>de</strong>scarta. No pue<strong>de</strong>srecuperarlo.copy-region-as-kill Copia el texto <strong>en</strong>tre el punto y la marca al anillo <strong>de</strong> la muerte para quepuedas recuperarlo. La función ni corta ni mueve el texto <strong>de</strong>l buffer.Actividad 9.42 Escribe una función interactiva que busque una ca<strong>de</strong>na. Si la búsqueda <strong>en</strong>cu<strong>en</strong>trala ca<strong>de</strong>na, <strong>de</strong>ja el punto <strong>de</strong>spués <strong>de</strong> ésta y <strong>de</strong>spliega el m<strong>en</strong>saje “La <strong>en</strong>contré”. (NOutilices search-forward como el nombre <strong>de</strong> tu función; si lo haces, sobre-escribirás la funciónexist<strong>en</strong>te que vi<strong>en</strong>e con Emacs. Usa un nombre como busca.)Actividad 9.43 Escribe una función que imprima el tercer elem<strong>en</strong>to <strong>de</strong>l anillo <strong>de</strong> la muerte <strong>en</strong>el área <strong>de</strong> eco, si existe, claro. Si el anillo <strong>de</strong> la muerte no ti<strong>en</strong>e un tercer elem<strong>en</strong>to, manda unm<strong>en</strong>saje apropiado.9.7. Lluvia <strong>de</strong> funciones útiles <strong>de</strong> Emacs-elispPonte cómodo y relájate, ya que <strong>en</strong> esta sección no hay ejercicios, sólo funciones y explicacionesbreves. Sin embargo, si las tecleas y pruebas, estamos seguros que te divertirás, las<strong>en</strong>t<strong>en</strong><strong>de</strong>rás mejor y te serán útiles como patrones para funciones futuras.9.7.1. ¿Quién o qué es ASCII?Es común imprimir la tabla <strong>de</strong> carácteres ASCII 10 , pero obviam<strong>en</strong>te hacerlo tecleando carácterpor carácter no es precisam<strong>en</strong>te una i<strong>de</strong>a brillante. Por un lado son 128 carácteres (2 7 ) <strong>en</strong>el ASCII estándar y 256 <strong>en</strong> el ext<strong>en</strong>dido (2 8 ). Aquí está una función <strong>en</strong> elisp que lo hace pornosotros.( <strong>de</strong>fun show−a s c i i ( )" Muestra e l ASCII como una l i s t a <strong>de</strong> p a r e j a s . "( i n t e r a c t i v e )( l e t ( ( c o u n t e r 0 ) )( d o t i m e s ( i 256)( i n s e r t ( f o r m a t "( %d, %c ) " i i ) )( wh<strong>en</strong> ( eq c o u n t e r 10)( i n s e r t " \ n " )( s e t q c o u n t e r 0 ) )( s e t q c o u n t e r ( i n c f c o u n t e r ) ) ) ) )10 ASCII son las siglas <strong>de</strong> American Standard Co<strong>de</strong> for Information Interchange, aunque se utilizapara referirnos al conjunto <strong>de</strong> codificación que predominó hasta hace un par <strong>de</strong> años. Hoy día Unico<strong>de</strong>es el estándar <strong>de</strong> facto para codificación.


9.7 Lluvia <strong>de</strong> funciones 327Sólo evalúa la función; <strong>de</strong>spués muévete a un buffer que puedas editar y ejecutaM-x show–ascii y verás aparecer varias líneas, cada una con diez o m<strong>en</strong>os <strong>de</strong> tales parejas.Por ejemplo, la séptima línea <strong>de</strong>be lucir así:( 6 1 , = ) (62 , >) ( 6 3 , ? ) ( 6 4 ,@) ( 6 5 ,A) ( 6 6 ,B) ( 6 7 ,C) ( 6 8 ,D) ( 6 9 , E ) ( 7 0 , F )y que pue<strong>de</strong>s leer cómo el código ASCII <strong>de</strong> ‘A’ es 65, el <strong>de</strong> ’B’ es 66 y así sucesivam<strong>en</strong>te.Lo más interesante <strong>de</strong> esta función es el uso <strong>de</strong> la función dotimes que, como su nombreindica, hace algo un cierto número <strong>de</strong> veces. Ti<strong>en</strong>e la sigui<strong>en</strong>te sintaxis:( d o t i m e s (VAR COUNT [RESULT ] ) BODY . . . )Evalúa BODY ligando VAR a un <strong>en</strong>tero sucesivo <strong>de</strong>s<strong>de</strong> 0 (cero) inclusive, hasta COUNT (noincluido). Después evalúa RESULT, para obt<strong>en</strong>er el valor <strong>de</strong> regreso, o regresa nil por omisión.Ahora ya <strong>de</strong>be ser obvio cómo funciona la función show-ascii: primero inicializa el contadorlstinline|counter| <strong>en</strong> 0; utiliza i como índice para recorrer todos los posibles valores ASCII<strong>de</strong>s<strong>de</strong> 0 hasta 255 (recuerda que el 256 no está incluido) y va imprimi<strong>en</strong>do cada valor numéricoy su correspondi<strong>en</strong>te carácter. Esto lo hace la función format. Lo que sigue, sirve para agregaruna nueva línea cada que hemos impreso diez parejas y no ti<strong>en</strong>e mayor complicación.9.7.2. ¿Cómo numerar una región <strong>de</strong> líneas?Algo que pue<strong>de</strong> ser muy útil, aunque sea poco común, es numerar una lista <strong>de</strong> objetos,digamos la lista <strong>de</strong> tus libros que casualm<strong>en</strong>te ti<strong>en</strong>es escrita <strong>en</strong> un archivo. Con lo que sabes <strong>de</strong>edición lo podrías hacer más o m<strong>en</strong>os así: visitas el archivo <strong>en</strong> un buffer <strong>de</strong> Emacs, te mueves alprimer carácter <strong>de</strong> la primera línea y tecleas 1.− ; luego te mueves a la sigui<strong>en</strong>te línea, regresasa la primera posición <strong>en</strong> la línea y tecleas 2.− ; y así sucesivam<strong>en</strong>te.No su<strong>en</strong>a muy difícil. Con un poco <strong>de</strong> práctica podrías llegar a la primera posición <strong>de</strong> lasigui<strong>en</strong>te línea con teclear sólo dos combinaciones <strong>de</strong> teclas y agregar un número (uno o másdígitos), un punto, un guión y un espacio; son sólo unos cuantos carácteres más. Y <strong>en</strong> efecto,es muy s<strong>en</strong>cillo. ¡Desgraciadam<strong>en</strong>te tú ti<strong>en</strong>es 8272 libros <strong>en</strong> tu lista! A<strong>de</strong>más, como eres muyescrupuloso quieres que todos los títulos <strong>de</strong> tus libros comi<strong>en</strong>c<strong>en</strong> <strong>en</strong> la misma columna, o lo quees lo mismo quieres que la numeración agregue exactam<strong>en</strong>te el mismo número <strong>de</strong> carácteres acada línea. No hay problema, aquí esta una función <strong>en</strong> elisp que lo hace:1 ( <strong>de</strong>fun numera ( beg <strong>en</strong>d )2 " Numera l a s l i n e a s <strong>en</strong> l a r e g i ón . "3 ( i n t e r a c t i v e " r " )4 ( l e t ∗ ( ( l i n e s ( count −l i n e s beg <strong>en</strong>d ) )5 ( padding ( l e n g t h ( i n t −to−s t r i n g l i n e s ) ) ) )6 ( goto−c h a r beg )7 ( d o t i m e s ( l i n e l i n e s )8 ( i n s e r t ( f o r m a t9 ( c o n c a t " %" ( f o r m a t " % cd " padding ) " d.− " )10 (1+ l i n e ) ) )11 ( forward −l i n e 1 ) ) ) )


328 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>teHay pocas cosas nuevas <strong>en</strong> esta función. Por ejemplo, la función count-lines (línea 4) queregresa el número <strong>de</strong> líneas que hay <strong>en</strong> la región; la función int-to-string (línea 5) que convierteun <strong>en</strong>tero a una ca<strong>de</strong>na. Todo lo <strong>de</strong>más <strong>de</strong>be ser medianam<strong>en</strong>te obvio, salvo quizá por el <strong>de</strong>talle<strong>de</strong> la variable llamada padding (línea 5), que la usamos para saber <strong>de</strong> cuántas posiciones ti<strong>en</strong>eque ser la ca<strong>de</strong>na que vamos a agregar.El razonami<strong>en</strong>to que usamos fue el sigui<strong>en</strong>te: si hay seis líneas <strong>en</strong> la región, <strong>en</strong>tonces elgrueso <strong>de</strong> la ca<strong>de</strong>na que t<strong>en</strong>emos que agregar <strong>en</strong> cada línea es: un carácter (para el dígito <strong>de</strong> lalínea), un carácter para el punto, uno para el guión y un espacio, <strong>en</strong> total cuatro. Pero si hay 28líneas, <strong>en</strong>tonces necesitamos un carácter más (los primeros nueve serán <strong>de</strong> un dígito y t<strong>en</strong>dránun espacio a la izquierda <strong>de</strong>l dígito) y los sigui<strong>en</strong>tes ya son <strong>de</strong> dos, y así sucesivam<strong>en</strong>te. Puesbi<strong>en</strong>, padding – línea 9 – es justam<strong>en</strong>te el número <strong>de</strong> carácteres que <strong>de</strong>be ocupar el número <strong>de</strong>línea, y format <strong>en</strong>ti<strong>en</strong><strong>de</strong> ese parámetro y agrega los espacios <strong>en</strong> blanco necesarios a la izquierda<strong>de</strong>l número.9.7.3. In<strong>de</strong>ntar es un placer, borrar espacios <strong>en</strong> blanco un martirioUna <strong>de</strong> los aspectos más interesantes <strong>de</strong> Emacs es que sabe cómo in<strong>de</strong>ntar el texto <strong>de</strong> misprogramas. Sin embargo, como casi cualquier otra cosa <strong>en</strong> esta vida, no es perfecto. Por ejemplo,digamos que al final <strong>de</strong> una línea pongo un carácter que abre un nuevo bloque (sin importar ell<strong>en</strong>guaje <strong>de</strong> programación). Emacs <strong>de</strong>tecta el carácter e inserta una nueva línea y luego, digamosotros siete espacios <strong>en</strong> blanco para que comi<strong>en</strong>ces a poner el cuerpo <strong>de</strong>l bloque. En la mayoría<strong>de</strong> los casos esto es una b<strong>en</strong>dición. Sin embargo, supongamos que tecleé un carácter <strong>de</strong> más <strong>en</strong>la línea anterior (cerca <strong>de</strong>l final <strong>de</strong> la línea), ¿cómo regreso? Lo más probable es que int<strong>en</strong>teusar BackSpace para borrar el carácter y continuar.Lo que <strong>en</strong> realidad suce<strong>de</strong> es que ti<strong>en</strong>es que teclear ocho o diez veces BackSpace , <strong>en</strong>lugar <strong>de</strong> sólo una o dos, porque primero borras todos los espacios blancos que agregó Emacs.Claro, te preguntarás por qué no utilizar las funciones <strong>de</strong> posicionami<strong>en</strong>to <strong>de</strong> cursor y luegoborramos y listo. Pues por muchas razones, la primera <strong>de</strong> ellas que usualm<strong>en</strong>te uno sabe lo quetecleó mal casi instantáneam<strong>en</strong>te. Tus <strong>de</strong>dos viajan <strong>en</strong> el teclado más rápido <strong>de</strong> lo que lees, ymi<strong>en</strong>tras <strong>de</strong>tectas el error uno o dos carácteres más ya fueron impresos; lo natural, o instintivosi así lo prefieres, es inmediatam<strong>en</strong>te teclear dos o tres veces (<strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> qué tan lejos estéel error) la tecla BackSpace y continuar editando.Algunos modos ya incluy<strong>en</strong> variables que modifican el comportami<strong>en</strong>to <strong>de</strong> la función quese ejecuta cuando presionamos BackSpace , pero algunos no. Aquí está una versión <strong>de</strong> unafunción que borra intelig<strong>en</strong>tem<strong>en</strong>te todos los espacios <strong>en</strong> blanco hasta llegar a un carácter noblanco y <strong>de</strong>spués el código para instalarla <strong>en</strong> Emacs:


9.7 Lluvia <strong>de</strong> funciones 3291 ( <strong>de</strong>fun my−e l e c t r i c −d e l e t e ( a r g )2 " Borra 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 ,3 t a b u l a d o r e s , y nuevas l i n e a s −−. Si ‘my−hungry−d e l e t e −key ’ no4 es 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 ón5 a c t u a l son b o r r a d o s . "6 ( i n t e r a c t i v e "P " )7 ( i f ( or ( n o t my−hungry−d e l e t e −key )8 a r g )9 ( f u n c a l l my−d e l e t e −f u n c t i o n ( p r e f i x −numeric−v a l u e a r g ) )10 ( l e t ( ( h e r e ( p o i n t ) ) )11 ( skip −c h a r s −backward " \ t \ n " )12 ( i f ( / = ( p o i n t ) h e r e )13 ( d e l e t e −r e g i o n ( p o i n t ) h e r e )14 ( f u n c a l l my−d 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 función.Si la variable my−hungry−<strong>de</strong>lete−key, que no aparece <strong>en</strong> el cuerpo <strong>de</strong> la función, es nil o si lepasamos un argum<strong>en</strong>to numérico a la función, <strong>en</strong>tonces se ejecuta:8 ( f u n c a l l my−d e l e t e −f u n c t i o n ( p r e f i x −numeric−v a l u e a r g ) )En esta línea hay dos funciones nuevas, pero ambas son triviales: prefix-numeric-value queregresa el valor numérico <strong>de</strong>l argum<strong>en</strong>to pasado a la función y funcall que evalúa su primerargum<strong>en</strong>to como si fuera una función, pasándole el resto <strong>de</strong> los argum<strong>en</strong>tos. Nota que no esequival<strong>en</strong>te a:(my−d e l e t e −f u n c t i o n ( p r e f i x −numeric−v a l u e a r g ) )porque esto trataría <strong>de</strong> buscar una función llamada my-<strong>de</strong>lete-function, pero tal función noexiste y <strong>de</strong> existir probablem<strong>en</strong>te no sería lo que nosotros buscamos. Es una variable, cuyo valores, así es adivinaste: el nombre <strong>de</strong> una función. Hablemos un poco sobre la razón <strong>de</strong> hacerlo así;porque si lo pi<strong>en</strong>sas dos veces parece una complicación innecesaria; ¿por qué no ponemos ahíel nombre <strong>de</strong> la función que es el valor <strong>de</strong> my-<strong>de</strong>lete-function? Porque hay muchas funcionessimilares para borrar carácteres y quieres darle la oportunidad a los usuarios <strong>de</strong> utilizar la quemejor les acomo<strong>de</strong>.Ahora, ¿qué pasa si la condición <strong>de</strong>l if es falsa? Se ejecuta la sigui<strong>en</strong>te parte (lineas 10–14),que sí parece una función como las que hemos visto. Primero guardamos el valor actual <strong>de</strong>lpunto <strong>en</strong> una variable llamada here (linea 10), nos saltamos todos los blancos (hacia atrás) yahora vemos si <strong>en</strong> realidad nos movimos o no. Si nos movimos, <strong>en</strong>tonces borramos la región; sino nos movimos (quiere <strong>de</strong>cir que estamos <strong>en</strong> una literal) <strong>en</strong>tonces sólo borramos un carácter.Nuevam<strong>en</strong>te borramos con la función para borrar que el usuario quiera.Por ejemplo, para programar <strong>en</strong> elisp, pue<strong>de</strong>s poner esto <strong>en</strong> tu ∼/.emacs:


330 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>te( add−hook ’ emacs−l i s p −mo<strong>de</strong>−hook( lambda ( )( d e f i n e −key emacs−l i s p −mo<strong>de</strong>−map " \ C−m" ’ newline −and−i n d e n t )( d e f i n e −key emacs−l i s p −mo<strong>de</strong>−map ’ ( b a c k s p a c e ) ’my−e l e c t r i c −d e l e t e )( s e t q my−d e l e t e −f u n c t i o n ’ backward−d e l e t e −char −u n t a b i f ymy−hungry−d e l e t e −key t ) ) )que básicam<strong>en</strong>te le dice a Emacs que cada vez que tecleas Enter , <strong>de</strong>be pasar a la sigui<strong>en</strong>telínea y luego in<strong>de</strong>ntar a<strong>de</strong>cuadam<strong>en</strong>te. También le indica que BackSpace <strong>de</strong>be ejecutar lafunción que recién analizamos; por último le doy nombre a las dos variables que se usan <strong>de</strong>ntro<strong>de</strong>l cuerpo <strong>de</strong> la función.9.7.4. Un ejercicio totalm<strong>en</strong>te inútil, o eso parece¿Cuántas veces has t<strong>en</strong>ido la necesidad <strong>de</strong> partir una oración <strong>en</strong> una lista <strong>de</strong> las palabras queconstituy<strong>en</strong> la oración? ¿Nunca? En realidad no es común, al m<strong>en</strong>os no <strong>en</strong> elisp. Sin embargo,es un bu<strong>en</strong> ejemplo para mostrar el manejo <strong>de</strong> ca<strong>de</strong>nas y listas <strong>en</strong> elisp.La función que verás usa dos funciones auxiliares. A <strong>de</strong>cir, las dos funciones auxiliares sonlas que hac<strong>en</strong> el trabajo y la función principal sólo “oculta” <strong>de</strong>talles que el usuario <strong>de</strong> la funciónno ti<strong>en</strong>e por qué conocer. Esto es una práctica usual <strong>en</strong> programación: sólo pi<strong>de</strong> al usuario losparámetros que el usuario conoce.1 ( <strong>de</strong>fun s t r i n g −t o k e n i z e r ( c h a r s t r )2 " Regresa 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 s3 <strong>en</strong> l a ca<strong>de</strong>na STR que e s t án s e p a r a d o s por CHAR. "4 ( 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 ) )56 ( <strong>de</strong>fun 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 )7 " Regresa 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 s8 <strong>en</strong> l a ca<strong>de</strong>na STR que e s t án s e p a r a d o s por CHAR. "9 ( l e t ∗ ( ( i n d e x ( in<strong>de</strong>x −of c h a r s t r 0 ) ) )10 ( i f ( n u l l i n d e x )11 ( i f ( s t r i n g −e q u a l s t r " " )12 ( r e v e r s e r e s )13 ( r e v e r s e ( cons s t r r e s ) ) )14 ( 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 ) )15 ( cons ( s u b s t r i n g s t r 0 i n d e x )16 r e s ) ) ) ) )1718 ( <strong>de</strong>fun in<strong>de</strong>x −of ( c h a r s t r c o u n t )19 " Regresa e l í n d i c e <strong>de</strong> l a p r i m e r a a p a r i c i ón <strong>de</strong> CHAR20 <strong>en</strong> l a ca<strong>de</strong>na STR empezando <strong>en</strong> COUNT. "21 ( cond ( ( s t r i n g −e q u a l s t r " " ) n i l )22 ( ( char −e q u a l ( a r e f s t r 0) c h a r ) c o u n t )23 ( t ( in<strong>de</strong>x −of c h a r ( s u b s t r i n g s t r 1) (1+ c o u n t ) ) ) ) )


9.7 Lluvia <strong>de</strong> funciones 331string-tok<strong>en</strong>izer es la función interfaz y recibe dos parámetros, la ca<strong>de</strong>na que vamos a seccionary el carácter que separa las secciones. Por la pregunta con la que iniciamos la sección,podría p<strong>en</strong>sarse que siempre usaríamos un espacio <strong>en</strong> blanco como separador. Finalm<strong>en</strong>te laspalabras <strong>en</strong> una oración casi siempre están separadas por un espacio (ignorando muchas reglasgramaticales, claro, porque los signos <strong>de</strong> puntuación y más <strong>de</strong> un espacio también <strong>de</strong>limitanpalabras). Pero no lo hicimos así, porque esta función es más g<strong>en</strong>eral y po<strong>de</strong>mos fácilm<strong>en</strong>tehacer una especialización <strong>de</strong> string-tok<strong>en</strong>izer que sirva para separar palabras <strong>en</strong> una oración.Bi<strong>en</strong>. Nota que esta función no hace más que llamar a string-tok<strong>en</strong>izer-aux, pero con tresparámetros. Los primeros dos son los que pasó el usuario (una ca<strong>de</strong>na y un carácter separador)y un tercero, nil o la lista vacía. La función auxiliar usará este último parámetro para iralmac<strong>en</strong>ando las secciones (o sub-ca<strong>de</strong>nas).Veamos <strong>en</strong>tonces cómo funciona string-tok<strong>en</strong>izer-aux. Primero calcula el índice <strong>de</strong>ntro <strong>de</strong>la ca<strong>de</strong>na STR <strong>en</strong> el cuál está la primera pres<strong>en</strong>cia <strong>de</strong>l carácter separador – <strong>en</strong> realidad el cálculolo hace la segunda función auxiliar, in<strong>de</strong>x-of, pero por el mom<strong>en</strong>to vas a t<strong>en</strong>er que creerme quesí funciona, es <strong>de</strong>cir, que sí regresa un <strong>en</strong>tero que repres<strong>en</strong>ta la posición (<strong>en</strong> la ca<strong>de</strong>na) <strong>de</strong> laprimera pres<strong>en</strong>cia <strong>de</strong>l carácter separador – .A continuación vi<strong>en</strong>e una serie <strong>de</strong> pruebas; primero preguntamos si el índice es nil (linea10); si lo es, <strong>en</strong>tonces preguntamos si la ca<strong>de</strong>na es la ca<strong>de</strong>na vacía <strong>en</strong> la linea 11 (i.e. si yaconsumimos toda la <strong>en</strong>trada). Si la respuesta es afirmativa, regresamos el resultado <strong>en</strong> reversa(más a<strong>de</strong>lante explicaré por qué <strong>en</strong> reversa). Si la ca<strong>de</strong>na aún no es la ca<strong>de</strong>na vacía, quiere <strong>de</strong>cirque el cont<strong>en</strong>ido completo <strong>de</strong> la ca<strong>de</strong>na <strong>de</strong>be ser la última parte <strong>de</strong>l resultado (ya no se pue<strong>de</strong>separar más); asi que lo agregamos al resultado y lo regresamos.Como la función string-tok<strong>en</strong>izer-aux es una función recursiva, ti<strong>en</strong>e dos partes importantes.La primera, la cláusula <strong>de</strong> escape, que es la parte que acabamos <strong>de</strong> revisar <strong>en</strong> el párrafoanterior. Ahora, como bu<strong>en</strong> ejemplo <strong>de</strong> función recursiva, también ti<strong>en</strong>e una parte don<strong>de</strong> se llamaa sí misma. Veamos cómo llegamos ahí. Si el índice no es nil (la primera pregunta <strong>en</strong> lalinea 10), <strong>en</strong>tonces sabemos que in<strong>de</strong>x-of regresó un número, un índice <strong>en</strong> la ca<strong>de</strong>na, por loque sabemos hasta dón<strong>de</strong> hay que cortar y eso hacemos: cortamos <strong>de</strong>s<strong>de</strong> el inicio <strong>de</strong> la ca<strong>de</strong>nahasta el índice (sin incluir al carácter separador) y agregamos esto al inicio <strong>de</strong> la lista resultado.Ahora t<strong>en</strong>emos que analizar el resto <strong>de</strong> la ca<strong>de</strong>na y por eso hacemos una llamada recursiva ala función misma, pero ahora usando como parámetros: (1) el mismo carácter separador; (2) elresto <strong>de</strong> la ca<strong>de</strong>na (<strong>de</strong>spués <strong>de</strong>l primer carácter separador y sin incluirlo) y (3) con la nueva listaresultado que ya ti<strong>en</strong>e <strong>en</strong> su primera posición la ca<strong>de</strong>na recién cortada.Esto se repite tantas veces como carácteres separadores cont<strong>en</strong>ga la ca<strong>de</strong>na inicial, hastaque fnalm<strong>en</strong>te termina y regresa la lista. Por ejemplo, supón que hacemos la sigui<strong>en</strong>te llamada:( s t r i n g −t o k e n i z e r ? " es una b o n i t a ca<strong>de</strong>na " )La notación ? (signo <strong>de</strong> interrogación y espacio) le dice a Emacs que le estamos pasandoun carácter, <strong>en</strong> este caso un espacio blanco. Lo que regresará es una lista <strong>de</strong> la forma("es" "una" "bonita" "ca<strong>de</strong>na"). Nota cómo ninguna <strong>de</strong> las sub-ca<strong>de</strong>nas (palabras) conti<strong>en</strong>e alcarácter separador.La función auxiliar in<strong>de</strong>x-of es también una función recursiva. Ti<strong>en</strong>e dos casos base (ocláusulas <strong>de</strong> escape): la primera se activa cuando se agota la ca<strong>de</strong>na (que se va recortando <strong>en</strong> uncarácter con cada llamada a sí misma); la segunda se activa cuando el carácter que estábamos


332 Ext<strong>en</strong>di<strong>en</strong>do tu ambi<strong>en</strong>tebuscando es <strong>en</strong>contrado. Su tercer parámetro es un contador, que si le pasamos 0 (cero) nosregresará el índice <strong>en</strong> la ca<strong>de</strong>na don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra el carácter separador por primera vez. Lossigui<strong>en</strong>te ejemplos <strong>de</strong>b<strong>en</strong> aclarar un poco la situación:( in<strong>de</strong>x −of ? " es una b o n i t a ca<strong>de</strong>na " 0)2( in<strong>de</strong>x −of ? " una b o n i t a ca<strong>de</strong>na " 0)3que si cu<strong>en</strong>tas <strong>de</strong>s<strong>de</strong> 0 son los índices <strong>de</strong>l primer espacio <strong>en</strong> blanco <strong>en</strong> ambos casos. Para redon<strong>de</strong>arla i<strong>de</strong>a <strong>de</strong> la recursividad, estos ejemplos sigu<strong>en</strong> el comportami<strong>en</strong>to <strong>de</strong> las llamadasrecursivas <strong>de</strong> la función string-tok<strong>en</strong>izer-aux:( s t r i n g −t o k e n i z e r −aux ? " es una b o n i t a ca<strong>de</strong>na " ( ) )( s t r i n g −t o k e n i z e r −aux ? " una b o n i t a ca<strong>de</strong>na " ( " es " ) )( s t r i n g −t o k e n i z e r −aux ? " b o n i t a ca<strong>de</strong>na " ( " una " " es " ) )( s t r i n g −t o k e n i z e r −aux ? " ca<strong>de</strong>na " ( " b o n i t a " " una " " es " ) )( s t r i n g −t o k e n i z e r −aux ? " " ( " ca<strong>de</strong>na " " b o n i t a " " una " " es " ) )( r e v e r s e ( " ca<strong>de</strong>na " " b o n i t a " " una " " es " ) )( " es " " una " " b o n i t a " " ca<strong>de</strong>na " )Esto también <strong>de</strong>be aclarar por qué t<strong>en</strong>emos que regresar el resultado <strong>en</strong> reversa: porque fuimosmeti<strong>en</strong>do las sub-ca<strong>de</strong>nas al inicio <strong>de</strong> la lista. Si las fuéramos meti<strong>en</strong>do al final no habríanecesidad, pero luciría más compleja la función.Por último, <strong>de</strong>cimos que las funciones in<strong>de</strong>x-of y string-tok<strong>en</strong>izer-aux están ambas <strong>en</strong>forma recursiva <strong>de</strong> cola, primero porque son recursivas y segundo porque lo último que hac<strong>en</strong>es llamarse a sí mismas. Una función recursiva pue<strong>de</strong> hacer muchas llamadas a sí misma, peroestá <strong>en</strong> forma recursiva <strong>de</strong> cola si y sólo si el que llama regresa inmediatam<strong>en</strong>te <strong>de</strong>spués. Porejemplo, la sigui<strong>en</strong>te función calcula el n-ésimo término <strong>en</strong> la serie <strong>de</strong> Fibonacci:( <strong>de</strong>fun f i b ( n )( i f ( < n 2)1(+ ( f i b (− n 1 ) ) ( f i b (− n 2 ) ) ) ) )pero no está <strong>en</strong> forma recursiva <strong>de</strong> cola, porque cuando terminan las llamadas recursivas noregresa la función ya que falta realizar las sumas.9.7.5. Resum<strong>en</strong>Aquí está un resum<strong>en</strong> <strong>de</strong> las funciones que acabamos <strong>de</strong> revisar:dotimes Ti<strong>en</strong>e la sigui<strong>en</strong>te sintaxis:( d o t i m e s (VAR COUNT [RESULT ] ) BODY . . . )Evalúa BODY ligando VAR a un <strong>en</strong>tero sucesivo <strong>de</strong>s<strong>de</strong> 0 inclusive, hasta COUNT (excluyéndolo).Después evalúa RESULT para obt<strong>en</strong>er el valor <strong>de</strong> regreso, o regresa nil poromisión.


9.8 Para saber más 333count-lines Ti<strong>en</strong>e la sigui<strong>en</strong>te sintaxis:( count −l i n e s START END &o p t i o n a l IGNORE−INVISIBLE )Regresa el número <strong>de</strong> líneas <strong>en</strong>tre START y END. Usualm<strong>en</strong>te esto equivale al número <strong>de</strong>carácteres <strong>de</strong> nueva línea <strong>en</strong>tre esas dos posiciones, pero pue<strong>de</strong> ser una más si el mayor <strong>de</strong>los dos números no está al inicio <strong>de</strong> una línea.Si el valor <strong>de</strong>l parámetro opcional es distinto <strong>de</strong> nil , <strong>en</strong>tonces las líneas ocultas (o colapsadas)con selective-display no se consi<strong>de</strong>ran para la cu<strong>en</strong>ta.int-to-string Recibe un número como parámetro y lo convierte a una ca<strong>de</strong>na <strong>en</strong> notación<strong>de</strong>cimal. Utiliza un signo negativo si el número es negativo; algo que no es obvio <strong>de</strong>lnombre <strong>de</strong> la función es que pue<strong>de</strong> recibir tanto <strong>en</strong>teros como números <strong>de</strong> punto flotante.funcall Evalúa el primer argum<strong>en</strong>to como si fuera una función, pasándole el resto <strong>de</strong> los argum<strong>en</strong>toscomo sus parámetros. Por tanto, ( funcall ’cons ’x ’y) regresa (x . y).9.8. Para saber másEmacs-Lisp es un l<strong>en</strong>guaje muy po<strong>de</strong>roso; sin embargo, no es un l<strong>en</strong>guaje utilizado paramucho más que modificar y ext<strong>en</strong><strong>de</strong>r Emacs. Es <strong>de</strong>cir, su uso como l<strong>en</strong>guaje <strong>de</strong> producciónno es muy amplio, por lo que muy poca g<strong>en</strong>te invierte tiempo programando profesionalm<strong>en</strong>te<strong>en</strong> elisp. Es importante que sepas hacer cosas relativam<strong>en</strong>te s<strong>en</strong>cillas, como las que vimosaquí y algunas incluso un poco más complicadas, porque <strong>de</strong> esa manera podrás mejorar tuproductividad.Por otro lado, el número <strong>de</strong> usuarios <strong>de</strong> Emacs es tan gran<strong>de</strong>, hablando a nivel mundial,que es difícil que quieras hacer algo que no se le haya antojado a algui<strong>en</strong> más alguna vez y,más aún, es muy probable que esa cosa ya esté implem<strong>en</strong>tada; utiliza Google o visita alguno <strong>de</strong>estos sitios:http://www.gnu.orghttp://www.xemacs.orgUSENET o Google groups:• gnu.emacs.help• comp.emacs• comp.emacs.xemacs• gnu.emacs.gnus• gnu.emacs.sources


Apéndices


Distribuciones <strong>de</strong><strong>Linux</strong> AExist<strong>en</strong> varias formas <strong>de</strong> instalar <strong>Linux</strong> <strong>en</strong> tu computadora. A lo largo <strong>de</strong> este libro se utilizóUbuntu, pero hay muchas más opciones. Según www.distrowatch.com, <strong>en</strong> este mom<strong>en</strong>toexist<strong>en</strong> mas <strong>de</strong> 500 versiones distintas <strong>de</strong> <strong>Linux</strong>. Exist<strong>en</strong> algunas <strong>de</strong> ellas que ti<strong>en</strong><strong>en</strong> soporte porparte <strong>de</strong> gran<strong>de</strong>s empresas como Novell, Oracle, Red Hat o IBM. A<strong>de</strong>más, para empezar a usar<strong>Linux</strong> no necesitas instalarlo <strong>de</strong> forma perman<strong>en</strong>te <strong>en</strong> tu computadora, ya que muchas distribucionesti<strong>en</strong><strong>en</strong> lo que se conoce como un live cd, que es un disco que te permite utilizar <strong>Linux</strong><strong>de</strong>s<strong>de</strong> un cd o dvd sin t<strong>en</strong>er que copiarlo a tu disco duro. De esa forma pue<strong>de</strong>s <strong>de</strong>cidir si esadistribución <strong>de</strong> <strong>Linux</strong> ofrece lo que tú necesitas sin t<strong>en</strong>er que eliminar el sistema operativo queutilizas actualm<strong>en</strong>te. A lo largo <strong>de</strong> este apéndice te pres<strong>en</strong>taremos algunas <strong>de</strong> las distribucionesmás comunes <strong>de</strong> <strong>Linux</strong>, <strong>en</strong> dón<strong>de</strong> pue<strong>de</strong>s obt<strong>en</strong>erlas y cuáles son sus puntos clave.A.1.UbuntuA.1.1.FilosofíaDes<strong>de</strong> 2004 Ubuntu ha experim<strong>en</strong>tado un increm<strong>en</strong>to <strong>en</strong>orme <strong>en</strong> su número <strong>de</strong> usuarios,si<strong>en</strong>do actualm<strong>en</strong>te la distribución más popular. Como es una distribución <strong>de</strong>rivada <strong>de</strong> Debian(el cual revisaremos <strong>en</strong> A.2), cu<strong>en</strong>ta con toda la robustez <strong>de</strong> esa distribución. El principal problema<strong>de</strong> Debian es los largos periodos <strong>de</strong> tiempo que pue<strong>de</strong>n pasar <strong>en</strong>tre la liberación <strong>de</strong> nuevasversiones. Para evitar eso, los <strong>de</strong>sarrolladores <strong>de</strong> Ubuntu se han comprometido a liberar una


338 Distribuciones <strong>de</strong> <strong>Linux</strong>nueva versión cada seis meses. A<strong>de</strong>más los principales objetivos <strong>de</strong> Ubuntu son:Mant<strong>en</strong>er por siempre su gratuidad, y que nunca haya un costo adicional para obt<strong>en</strong>er una“versión profesional”.Hacer que Ubuntu pueda ser usado por el mayor número <strong>de</strong> personas.Estar siempre comprometido con el software libre.A pesar <strong>de</strong> t<strong>en</strong>er a su disposición todos los paquetes <strong>de</strong> Debian, <strong>en</strong> Ubuntu la instalación poromisión incluye un número reducido <strong>de</strong> paquetes, lo cual permite que pueda distribuirse <strong>en</strong> unsolo CD, <strong>de</strong>jando la instalación <strong>de</strong> otros paquetes como una <strong>de</strong>cisión posterior. Pue<strong>de</strong>s obt<strong>en</strong>eruna copia <strong>en</strong> http://www.ubuntu.com/A.1.2.Manejo <strong>de</strong> softwareEl manejo <strong>de</strong> paquetes <strong>de</strong>ntro <strong>de</strong> Ubuntu se hace utilizando archivos .<strong>de</strong>b, los cuales pue<strong>de</strong>nser instalados con la herrami<strong>en</strong>ta dpkg. Esta herrami<strong>en</strong>ta es la <strong>en</strong>cargada <strong>de</strong> <strong>de</strong>sempacar losarchivos, copiarlos a su <strong>de</strong>stino y ejecutar las operaciones para que el nuevo software operea<strong>de</strong>cuadam<strong>en</strong>te. Dado que dpkg es una herrami<strong>en</strong>ta po<strong>de</strong>rosa pero a la vez poco amigable,se han creado varias interfaces para hacer el trabajo <strong>de</strong> instalación más s<strong>en</strong>cillo. De dichasinterfaces, una <strong>de</strong> las más comunes es apt. Veamos como se instala un paquete haci<strong>en</strong>do uso <strong>de</strong>esta herrami<strong>en</strong>ta.Lo primero que necesitamos es saber cuál es el nombre <strong>de</strong>l paquete que <strong>de</strong>seamos instalar;para ello haremos uso <strong>de</strong> la herrami<strong>en</strong>ta apt-cache. Mediante ésta podremos consultar la lista<strong>de</strong> paquetes disponibles y ver cuál <strong>de</strong> ellos es el que nosotros <strong>de</strong>seamos. Estas listas se construy<strong>en</strong>a partir <strong>de</strong> los repositorios que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el archivo /etc/apt/sources.list. Dichoarchivo conti<strong>en</strong>e líneas como la sigui<strong>en</strong>te:<strong>de</strong>b h t t p : / / mx . a r c h i v e . ubuntu . com / ubuntu / main u n i v e r s eEsa línea indica lo sigui<strong>en</strong>te:La palabra <strong>de</strong>b indica que se van a obt<strong>en</strong>er archivos <strong>de</strong> binarios (también pue<strong>de</strong> aparecer<strong>de</strong>b−src, para indicar que se van a obt<strong>en</strong>er archivos <strong>de</strong> código fu<strong>en</strong>te).Le sigue el URL <strong>de</strong>l repositorio que indica <strong>de</strong> dón<strong>de</strong> se van a obt<strong>en</strong>er los paquetes.La sigui<strong>en</strong>te palabra indica qué distribución se utiliza (<strong>en</strong> este caso stable), y qué seccionesestán disponibles 1 (<strong>en</strong> este caso main).Pue<strong>de</strong>s agregar tantas líneas como necesites, para así agregar más repositorios que te permitant<strong>en</strong>er acceso a más paquetes. La mayor parte <strong>de</strong>l tiempo no necesitarás más que losrepositorios oficiales. En caso <strong>de</strong> que modifiques tus repositorios necesitarás indicarle a apt quereconstruya la lista <strong>de</strong> paquetes. Para po<strong>de</strong>r hacerlo, ejecuta como root la instrucción:% apt-get updateUna vez hecho eso, pue<strong>de</strong>s buscar el paquete que <strong>de</strong>seas, digamos emacs. Entonces es necesarioejecutar la instrucción:1 Entre las distintas secciones están: main universe multiverse restricted


A.2 Debian 339% apt-cache search emacsDe esa forma le indicamos a apt que <strong>de</strong>be buscar la lista <strong>de</strong> paquetes y regresarnos todoslos que cont<strong>en</strong>gan la palabra emacs <strong>en</strong> su nombre o su <strong>de</strong>scripción. 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 Emacsdrscheme − PLT Scheme Programming Environm<strong>en</strong>temacs−e x t r a − emacs c o n f i g u r a t i o nemacs−s n a p s h o t −g t k − The GNU Emacs e d i t o r ( with GTK+ 2 . x s u p p o r t )emms − The Emacs MultiMedia Systememacs21 − The GNU Emacs e d i t o remacs21−bin−common − The GNU Emacs e d i t o r ’ s d e p e n d e n t f i l e semacs21−common − The GNU Emacs e d i t o r ’ sSi quieres ver más <strong>de</strong>talles acerca <strong>de</strong> un paquete, <strong>en</strong>tonces pue<strong>de</strong>s ejecutar:% apt-cache search -f emacs21-commonCon lo cual obti<strong>en</strong>es un listado como:Package : emacs21−commonP r i o r i t y : o p t i o n a lS e c t i o n : e d i t o r sI n s t a l l e d −S i z e : 35948A r c h i t e c t u r e : a l lSource : emacs21V e r s i o n : 2 1 . 4 a−6ubuntu2R e p l a c e s : emacs21 ( < 21.2 −4)Dep<strong>en</strong>ds : emacs<strong>en</strong>−common ( >= 1 . 4 . 1 0 ) , dpkg ( >= 1 . 9 . 0 )S u g g e s t s : emacs21−e lC o n f l i c t s : emacs21−e l ( < 2 1 . 4 a −6) , w3−e lFil<strong>en</strong>ame : pool / main / e / emacs21 / emacs21−common_ 2 1 . 4 a−6_ a l l . <strong>de</strong>bS i z e : 10936074MD5sum : b4a981d12f6a39f43c896ddf924129fdSHA1 : 33 f667d8fbd5e18570d405c5c54d9e22643c9d6fD e s c r i p t i o n : The GNU Emacs e d i t o r ’ s shared , a r c h i t e c t u r ei n d e p e n d e n t i n f r a s t r u c t u r eGNU Emacs i s t h e e x t e n s i b l e s e l f −docum<strong>en</strong>ting t e x t e d i t o r .This package c o n t a i n s t h e a r c h i t e c t u r e i n d e p e n d e n t i n f r a s t r u c t u r et h a t ’ s s h a r e d by emacs21 and emacs21−nox .Esa instrucción pue<strong>de</strong>s ejecutarla con más <strong>de</strong> un paquete para que <strong>en</strong>cu<strong>en</strong>tres cuál es el que<strong>de</strong>seas instalar. Una vez hecho eso, será necesario ejecutar el comando <strong>de</strong> instalación <strong>de</strong> apt:% sudo apt-get install emacs21-commonCon lo cual apt te informará qué paquete se va a <strong>de</strong>scargar y cuánto espacio utilizará. Encaso <strong>de</strong> que existan <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias no resueltas, te informará cuáles son los paquetes que <strong>de</strong>besinstalar para satisfacerlas, y si así lo <strong>de</strong>seas, apt se <strong>en</strong>cargará <strong>de</strong> obt<strong>en</strong>erlas por ti.


340 Distribuciones <strong>de</strong> <strong>Linux</strong>A.2.DebianA.2.1.FilosofíaDebian es un sistema operativo libre, dinámico y gratis. Es distribuido por el Proyecto Debian.Su objetivo principal es distribuir un conjunto <strong>de</strong> software que sea capaz <strong>de</strong> satisfacer lamayoría <strong>de</strong> las necesida<strong>de</strong>s <strong>de</strong> los usuarios <strong>de</strong> una computadora. Para lograr eso, Debian actualm<strong>en</strong>teti<strong>en</strong>e 18,733 paquetes disponibles. Debian manti<strong>en</strong>e sus distribuciones <strong>en</strong> tres estados:stable (estable). Conti<strong>en</strong>e los paquetes oficiales; es la distribución lista para usarse y todo estágarantizado que funcionará.testing (<strong>de</strong> prueba). Conti<strong>en</strong>e paquetes que aún no han sido aceptados <strong>en</strong> la distribución estable,pero que <strong>en</strong> algún mom<strong>en</strong>to lo estarán.unstable (inestable). Conti<strong>en</strong>e paquetes <strong>en</strong> <strong>de</strong>sarrollo; probablem<strong>en</strong>te habrá paquetes que nofuncionarán <strong>de</strong>l todo bi<strong>en</strong>, pero también ti<strong>en</strong>e los paquetes más nuevos.Conforme va pasando el tiempo, los paquetes pue<strong>de</strong>n pasar <strong>de</strong> una distribución inestable auna <strong>de</strong> prueba y <strong>de</strong> ahí, <strong>de</strong>spués <strong>de</strong> una revisión minuciosa, finalm<strong>en</strong>te llegan a estable. Muchaspersonas consi<strong>de</strong>ran a Debian como la distribución más robusta <strong>de</strong> <strong>Linux</strong> 2 , si<strong>en</strong>do esto una consecu<strong>en</strong>cia<strong>de</strong> la <strong>en</strong>orme cantidad <strong>de</strong> paquetes que ti<strong>en</strong>e disponibles <strong>en</strong> sus repositorios, todas lasarquitecturas que soporta y la garantía <strong>de</strong> que <strong>en</strong> su versión estable todo está probado. Por <strong>de</strong>sgracia,esto pue<strong>de</strong> ocasionar que la versión estable sea obsoleta, pues revisar todos esos paquetespara garantizar que todo es seguro lleva mucho tiempo. Esto pue<strong>de</strong> no ser un problema si utilizasla versión <strong>de</strong> prueba o inestable. Pue<strong>de</strong>s <strong>de</strong>scargar Debian <strong>de</strong>s<strong>de</strong> http://www.<strong>de</strong>bian.org/.A.2.2.Manejo <strong>de</strong> softwareEl manejo <strong>de</strong> paquetes <strong>de</strong> Debian, al igual que Ubuntu, es mediante el manejador <strong>de</strong> paquetesdpkg y su interfaz apt. Para revisar cómo utilizar dichas herrami<strong>en</strong>tas, consulta la secciónA.1.A.3.FedoraA.3.1.FilosofíaFedora es una colección <strong>de</strong> proyectos patrocinados por Red Hat, y <strong>de</strong>sarrollados <strong>en</strong> contactocon la comunidad <strong>de</strong> software libre. Originalm<strong>en</strong>te Red Hat t<strong>en</strong>ía una sola distribución2 dando esto como resultado varias “guerras santas”


A.3 Fedora 341homónima a la compañía, pero <strong>en</strong> el 2003 ésta <strong>de</strong>sapareció. Red Hat dividió sus esfuerzos <strong>en</strong>dos direcciones: el proyecto Fedora mant<strong>en</strong>dría lo que antes era la distribución <strong>de</strong>l sistema operativoy Red Hat Enterprise se <strong>en</strong>cargaría <strong>de</strong> at<strong>en</strong><strong>de</strong>r a los cli<strong>en</strong>tes empresariales. El propósito<strong>de</strong>l proyecto Fedora es y ha sido apoyar el rápido progreso <strong>de</strong>l software libre y <strong>de</strong> su cont<strong>en</strong>ido.Esto incluye t<strong>en</strong>er procesos abiertos al público, transpar<strong>en</strong>cia y rápida innovación. Pue<strong>de</strong>sobt<strong>en</strong>erlo <strong>en</strong> http://fedoraproject.org/.A.3.2.Manejo <strong>de</strong> softwareEl manejo <strong>de</strong> paquetes <strong>de</strong> Fedora es mediante el uso <strong>de</strong> archivos .rpm, los cuales se instalanhaci<strong>en</strong>do uso <strong>de</strong> la herrami<strong>en</strong>ta rpm 3 . Para resolver las <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias que pue<strong>de</strong> t<strong>en</strong>er un paquete,e instalarlas automáticam<strong>en</strong>te, se hace uso <strong>de</strong> la herrami<strong>en</strong>ta yum 4 . Si se <strong>de</strong>sea instalaremacs <strong>en</strong> el sistema, lo primero que se <strong>de</strong>be hacer es buscar cuál es el paquete que se <strong>de</strong>seainstalar. Para eso se utiliza la instrucción:% yum search emacsCon lo cual se obti<strong>en</strong>e un listado <strong>de</strong> los paquetes que conti<strong>en</strong><strong>en</strong> la palabra emacs, y que se pue<strong>de</strong>observar a continuación.emacs . i386 21.4 −5 i n s t a l l e dMatched from :emacsThe GNU Emacs t e x t e d i t o r .Emacs i s a powerful , c u s t o m i z a b l e , s e l f −docum<strong>en</strong>ting ,mo<strong>de</strong>less 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 co<strong>de</strong> e d i t i n gf 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 yt o r e a d mail , 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 . org / s o f t w a r e / emacs /r e a d l i n e . i386 5.0 −3 i n s t a l l e dMatched 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 of f u n c t i o n s t h a t a l l o wu 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 mo<strong>de</strong>sa 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 lf 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 of p r e v i o u s l y −e n t e r e d commandl i n e s f o r r e c a l l i n g or 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 gcsh−l 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 <strong>de</strong>l paquete que quieres instalar, <strong>de</strong>bes ejecutar comoroot la instrucción:3 Redhat Package Manager4 Yellow dog Update Manager


342 Distribuciones <strong>de</strong> <strong>Linux</strong>% yum install emacs.i386Con lo cual yum te mostrara cuales son los paquetes que va a instalar, sus <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias y cuantoespacio van a ocupar.


Compilando eBinstalando a pieB.1.Aplicaciones no disponiblesHay ocasiones <strong>en</strong> las que quieres instalar una aplicación, pero no existe un paquete para elsistema <strong>de</strong> instalación <strong>de</strong> tu distribución. Algunas veces, algui<strong>en</strong> más se <strong>en</strong>carga <strong>de</strong> distribuirlosy pue<strong>de</strong>s o no conseguir un .<strong>de</strong>b o un .rpm <strong>en</strong> su página. En caso <strong>de</strong> que eso no sea posible, seránecesario compilar el paquete e instalarlo a pie. Esto pue<strong>de</strong> sonar más complicado <strong>de</strong> lo que <strong>en</strong>realidad es, pero para ilustrar el proceso veamos un ejemplo. Vamos a instalar un cli<strong>en</strong>te <strong>de</strong> MSNpara <strong>Linux</strong> que se conoce como amsn. Lo primero que necesitas es conseguir el código fu<strong>en</strong>te<strong>de</strong> la aplicación, que <strong>en</strong> este caso lo pue<strong>de</strong>s bajar <strong>de</strong> http://sourceforge.net/projects/amsn/.El archivo que vamos a bajar es amsn-0.96.tar.bz2, el número correspon<strong>de</strong> a la versión quebajamos, por lo que es probable que cuando tú lo consigas sea algo distinto. El sigui<strong>en</strong>te pasoes <strong>de</strong>scomprimir el archivo; <strong>en</strong> este caso, a partir <strong>de</strong> la ext<strong>en</strong>sión, sabemos que es un archivoempacado con tar y luego comprimido con bzip2. Para <strong>de</strong>sempacarlo pue<strong>de</strong>s usar el comandotar xvfj amsn-0.96.tar.bz2,o bi<strong>en</strong> hacerlo <strong>de</strong>s<strong>de</strong> Konqueror. Esto g<strong>en</strong>era el directorio amsn-0.96 En el <strong>en</strong>contrarás algunosarchivos que suel<strong>en</strong> ser estándar <strong>en</strong> las distribuciones <strong>de</strong> código fu<strong>en</strong>te <strong>en</strong> UNIX. Entre estos se<strong>en</strong>cu<strong>en</strong>tran, g<strong>en</strong>eralm<strong>en</strong>te, los sigui<strong>en</strong>tes archivos:READMEINSTALLconfigure


344 Compilando e instalando a pieEn el archivo README vi<strong>en</strong>e una breve explicación <strong>de</strong> qué es la aplicación, cómo funcionay a veces instrucciones para instalar. En caso <strong>de</strong> que las instrucciones para instalar no aparezcan<strong>en</strong> README, es porque están <strong>en</strong> INSTALL. La información más importante <strong>de</strong> este archivoson las <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias <strong>de</strong>l programa que quieres compilar y las opciones que le pue<strong>de</strong>s pasar alcompilarlo. El resto <strong>de</strong>l procedimi<strong>en</strong>to es igual para la mayoría <strong>de</strong> los programas, y usualm<strong>en</strong>tees:1. Configurar los parámetros <strong>de</strong> compilación.2. Compilar el programa.3. Instalar el programa.Configurando la compilaciónVeamos cómo se configuran los parámetros <strong>de</strong> compilación. Para hacer eso utilizamos herrami<strong>en</strong>tas<strong>de</strong> UNIX que se llaman automake y configure. El <strong>de</strong>sarrollador que preparó los fu<strong>en</strong>tespara instalar se <strong>en</strong>cargó <strong>de</strong> utilizar un guión <strong>de</strong> instalación con automake para que nosotrospodamos compilar con configure. De esa forma configure se <strong>en</strong>carga <strong>de</strong> buscar <strong>en</strong> dón<strong>de</strong> t<strong>en</strong>emosnosotros instaladas las <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias <strong>de</strong>l programa que queremos compilar, y establece <strong>en</strong>dón<strong>de</strong> queremos instalar nuestro programa una vez compilado, incluy<strong>en</strong>do binarios y docum<strong>en</strong>tación.Así que realicemos este paso para amsn. Es necesario que el archivo configure t<strong>en</strong>gapermisos <strong>de</strong> ejecución; <strong>en</strong> caso <strong>de</strong> que no sea así pue<strong>de</strong>s otorgárselos con chmod +x configure;una vez hecho eso ejecútalo con ./ configure. Verás que empieza a revisar si ti<strong>en</strong>es instaladastodas las <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias que necesitas; si no <strong>en</strong>cu<strong>en</strong>tra algo <strong>en</strong> ese mom<strong>en</strong>to se <strong>de</strong>t<strong>en</strong>drá y teindicará qué es lo que falta <strong>en</strong> tu sistema. Supongamos que <strong>en</strong> este mom<strong>en</strong>to configure indicaque no pue<strong>de</strong> <strong>en</strong>contrar el compilador <strong>de</strong> C, gcc; <strong>en</strong>tonces verás algo como:c h e c k i n g f o r gcc . . . noc h e c k i n g f o r cc . . . noc h e c k i n g f o r cc . . . noc h e c k i n g f o r c l . . . noc 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 found i n $PATHSerá necesario instalar este compilador. En este mom<strong>en</strong>to, si corres con suerte, bastará conutilizar tu manejador <strong>de</strong> paquetes mi<strong>en</strong>tras que <strong>en</strong> el peor <strong>de</strong> los casos t<strong>en</strong>drás que compilartambién ese paquete. Para instalar gcc y <strong>de</strong> paso g++ 1 <strong>en</strong> Ubuntu basta con ejecutar sudo aptgetinstall gcc g++. así que si una vez heco esto ultimo vuelves a ejecutar config, <strong>de</strong>berá seguircon su ejecución normal. En caso <strong>de</strong> que te hagan falta bibliotecas para seguir compilandotambién será necesario que las instales. Supongamos que no ti<strong>en</strong>es instalado Tk, el cual esnecesario para compilar amsn; cuando configure se <strong>de</strong>t<strong>en</strong>ga y nos indique que no <strong>en</strong>cu<strong>en</strong>trala biblioteca necesaria, recurrimos a apt para instalarla. En este caso es necesario instalar elpaquete <strong>de</strong> <strong>de</strong>sarrollo, pues queremos compilar código fu<strong>en</strong>te. Los paquetes <strong>de</strong> <strong>de</strong>sarrollo <strong>en</strong><strong>Linux</strong> ti<strong>en</strong><strong>en</strong> la terminación <strong>de</strong>v. Ejecutamos <strong>en</strong>tonces sudo apt−get install tk8.4−<strong>de</strong>v, y una1 g++ es el compilador <strong>de</strong> C++.


B.1 Aplicaciones no disponibles 345vez más ./ configure. Ahora amsn <strong>de</strong>bería compilar sin problemas 2 . En caso <strong>de</strong> que quierasmodificar algún parámetro <strong>de</strong> la instalación <strong>de</strong> amsn, pue<strong>de</strong>s ejecutra ./ configure −−help, locual te mostrará las opciones disponibles.CompilandoInstalandoCuando configure termina exitosam<strong>en</strong>te su ejecución, pue<strong>de</strong>s compilar el programa. Alterminar, configure crea un archivo <strong>de</strong> nombre Makefile <strong>en</strong> el archivo <strong>en</strong> don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra elcódigo fu<strong>en</strong>te. D<strong>en</strong>tro <strong>de</strong> ese archivo se <strong>en</strong>cu<strong>en</strong>tran las opciones y rutas que se prepararon <strong>en</strong>el sección B.1. La herrami<strong>en</strong>ta que lee el archivo Makefile, lleva el mismo nombre, makefile, yse invoca con el comando make. En caso <strong>de</strong> que no esté instalada, nuevam<strong>en</strong>te recurrimos aapt, sudo apt−get install make. Ahora, colocándonos <strong>en</strong> el directorio <strong>en</strong> don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tra elarchivo Makefile, tecleamos make y vemos cómo se compila todo 3 .Ahora vi<strong>en</strong>e la última parte. Después <strong>de</strong> haber compilado el programa es necesario instalarlo<strong>en</strong> algún lugar que facilite su acceso. De esa forma cualquier usuario <strong>de</strong>l sistema pue<strong>de</strong> usar elprograma que compilaste. Para llevar a cabo la instalación una vez más vas a hacer uso <strong>de</strong> make,pero esta vez es necesario hacerlo con permisos <strong>de</strong> super usuario, sudo make install . Verás comomake <strong>de</strong>spliega las instrucciones que está llevando a cabo.Listo. Una vez hecho esto, si tecleas amsn <strong>de</strong>s<strong>de</strong> tu consola, se iniciará el cli<strong>en</strong>te <strong>de</strong> MSN.Este proceso es casi estándar <strong>de</strong>ntro <strong>de</strong>l mundo UNIX, por lo que pue<strong>de</strong>s repetirlo para lamayoría <strong>de</strong>l código fu<strong>en</strong>te que quieras compilar e instalar. Si existe un paquete para la aplicaciónque <strong>de</strong>seas instalar <strong>de</strong>ntro <strong>de</strong>l manejador <strong>de</strong> paquetes <strong>de</strong> tu distribución, es mejor i<strong>de</strong>a usarloy no compilar a pie. Si compilas e instalas pier<strong>de</strong>s las v<strong>en</strong>tajas <strong>de</strong>l manejador, como saberfácilm<strong>en</strong>te qué aplicaciones ti<strong>en</strong>es instaladas y <strong>en</strong> qué versión están, o el <strong>de</strong>sinstalar fácilm<strong>en</strong>te 4 .2 Dep<strong>en</strong>di<strong>en</strong>do <strong>de</strong> qué t<strong>en</strong>gas instalado <strong>en</strong> tu máquina, es posible que necesites instalar más paquetes,pero el procedimi<strong>en</strong>to es igual al que acabamos <strong>de</strong> <strong>de</strong>scribir3 Dep<strong>en</strong>di<strong>en</strong>do <strong>de</strong> qué estés instalando, esto pue<strong>de</strong> tardar varios minutos4 En algunas aplicaciones pue<strong>de</strong>s usar sudo make uninstall para <strong>de</strong>sinstalar la aplicación


Emacs: archivosC<strong>de</strong> configuraciónA lo largo <strong>de</strong> este libro hemos revisado Emacs y muchas ext<strong>en</strong>siones, subsistemas y paquetespara ext<strong>en</strong><strong>de</strong>r la funcionalidad básica <strong>de</strong> Emacs. Conforme avanzamos, explicamos lasdistintas opciones y líneas <strong>de</strong> configuración, pero las integramos aquí para tu comodidad.C.1.∼/.emacs; ; E s t e a r c h i v o <strong>de</strong> c o n f i g u r a c i ó n p a r a Emacs , es un anexo d e l l i b r o :; ; <strong>Manual</strong> <strong>de</strong> s u p e r v i v e n c i a <strong>en</strong> <strong>Linux</strong>; ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗; ; ∗∗∗∗∗∗∗∗∗∗∗∗∗ f o n t −l o c k ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗; ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗( r e q u i r e ’ f o n t −l o c k )( add−hook ’ f o n t −lock −mo<strong>de</strong>−hook ’ t u r n −on−f a s t −l o c k )( g l o b a l −f o n t −lock −mo<strong>de</strong> 1); ; Color−theme :( add−to− l i s t ’ load −p a t h ( expand−f 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 −theme−c h a r c o a l −b l a c k )


348 Emacs: archivos <strong>de</strong> configuración; ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗; ; ∗∗∗∗∗∗∗∗∗∗∗ C o d i f i c a c i ó n : UTF−8 ∗∗∗∗∗∗∗∗∗∗∗; ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗( p r e f e r −coding −system ’ u t f −8); ; AUCTeX, RefTeX y preview −emacs :; ; Si AUCTeX y preview −emacs e s t á n i n s t a l a d o s <strong>de</strong> manera g l o b a l <strong>en</strong> 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 dos l í n e a s :( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / a u c t e x " ) )( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / a u c t e x / preview " ) )( r e q u i r e ’ tex −s i t e )( r e q u i r e ’ t e x )( r e q u i r e ’ l a t e x )( r e q u i r e ’ r e f t e x )( l o a d " preview −l a t e x . e l " n i l t t )( s e t q TeX−auto −save t )( s e t q TeX−p a r s e −s e l f t )( s e t q −d e f a u l t TeX−m a s t e r n i l )( s e t q LaTeX−s e c t i o n −hook’ ( LaTeX−s e c t i o n −h e a d i n gLaTeX−s e c t i o n − t i t l eLaTeX−s e c t i o n −t o cLaTeX−s e c t i o n −s e c t i o nLaTeX−s e c t i o n −l a b e l )); ; I s p e l l h a b l a n d o e s p a ñ o l .( s e t q i s p e l l −program−name " 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 " " es " ) 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; ; Si BBDB e s t á i n s t a l a d o <strong>en</strong> un s i t i o e s t á n d a r <strong>de</strong> Emacs , nor e q u i e r e s l a p r i m e r a l í n e a :( add−to− l i s t ’ load −p a t h ( expand−f 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 ’w3m−l o a d ); ; D i c t i o n a r y ( d i c t c l i e n t )


C.2 ∼/.vm 349( l o a d " 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 −match−words ); ; TRAMP( r e q u i r e ’ tramp )( s e t q tramp−d e f a u l t −method " scp " ); ; ERC( r e q u i r e ’ e r c )( r e q u i r e ’ erc −s p e l l i n g ); ; JDE y amigos :( load −f i l e " ~ / e l i s p / c e d e t / common / c e d e t . e l " )( semantic −load −<strong>en</strong>able −co<strong>de</strong>−h e l p e r s )( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / j d e / l i s p " ) )( add−to− l i s t ’ load −p a t h ( expand−f i l e −name " ~ / e l i s p / e l i b " ) )( r e q u i r e ’ j d e )( s e t q j<strong>de</strong> −<strong>en</strong>able −abbrev −mo<strong>de</strong> tj<strong>de</strong> −e l e c t r i c −r e t u r n −p tj<strong>de</strong> −b u i l d −f u n c t i o n ’ ( j<strong>de</strong> −ant −b u i l d )j<strong>de</strong> −<strong>de</strong>bugger ’ ( " JDEbug " )tempo−i n t e r a c t i v e t); ; S u b v e r s i o n Dep<strong>en</strong>di<strong>en</strong>do <strong>de</strong> t u c o n f i g u r a c i ó n , pue<strong>de</strong> s e r qu<strong>en</strong> 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 <strong>en</strong> UTF−8 a l r e p o s i t o r i o :( s e t e n v "LCCTYPE<strong>en</strong>US . u t f −8")( r e q u i r e ’ psvn )C.2.∼/.vm; ; −∗− emacs−l i s p −∗−( s e t q vm−spool −f i l e s’ ( ( " ~ / INBOX"" imap−s 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 : inbox : l o g i n : Juan .Doe : ∗ "" ~ /INBOX .CRASH" ) ))( s e t q vm−imap−auto −expunge− a l i s t’ (; ; Dejamos una c o p i a <strong>en</strong> e l s e r v i d o r .


350 Emacs: archivos <strong>de</strong> configuración( " imap−s 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 : inbox : l o g i n : Juan .Doe : ∗ " . n i l ))vm−skip −read −messages tvm−c i r c u l a r −f o l d e r s tvm−v 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 Viso . ∗ " ) ( a u t h o r " F r a n c i s c o S o l s o n a. ∗ " ) )) ))vm−summary−show−t h r e a d s t)( s e t q vm−mail−hea<strong>de</strong>r −from " Juan Doe < Juan . Doe@ci<strong>en</strong>cias . unam . mx>"s<strong>en</strong>d−mail−f u n c t i o n ’ smtpmail −s<strong>en</strong>d− i tsmtpmail −smtp−s 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"smtpmail −l o c a l −domain " c i e n c i a s . unam . mx"smtpmail −s<strong>en</strong>dto −domain " c i e n c i a s . unam . mx"); ; BBDB i n s i n u a t i o n :( bbdb−i n s i n u a t e −vm)C.3.∼/.emacs-w3m; ; −∗− emacs−l i s p −∗−( s e t q w3m−home−page " h t t p : / / www. f c i e n c i a s . unam . mx"w3m−d e f a u l t −d i s p l a y −i n l i n e −images t)


Bibliografía[1] DIVERSOS AUTORES The tex catalogue on line.http://www.tex.ac.uk/tex-archive/help/Catalogue/catalogue.html. Conti<strong>en</strong>e muchísimospaquetes <strong>de</strong> LATEX con su docum<strong>en</strong>tación, listos para ser <strong>de</strong>scargados.[2] ETTRICH, M. K<strong>de</strong>. http://www.k<strong>de</strong>.org.[3] HILBRICH, T. Emacs: Dictionary. http://www.myrkr.in-berlin.<strong>de</strong>/dictionary/.[4] ITO, A. Emacs: w3m. http://w3m.sourceforge.net.[5] KINNUCAN, P. Emacs: J<strong>de</strong>e - java <strong>de</strong>velopm<strong>en</strong>t <strong>en</strong>vironm<strong>en</strong>t for emacs.http://j<strong>de</strong>e.sunsite.dk/.[6] LUDLAM, E. Emacs: Ce<strong>de</strong>t - collection of emacs <strong>de</strong>velopm<strong>en</strong>t <strong>en</strong>vironm<strong>en</strong>t tools.http://ce<strong>de</strong>t.sourceforge.net/.[7] MITTELBACH, F., AND GOOSENS, M. The LATEX Companion, Second Edition. Addison-Wesley, 2004.[8] REICHOER, S. Emacs: psvn. http://www.xsteve.at/prg/vc_svn/.[9] STALLMAN, R. Emacs, gcc y gdb. http://www.gnu.org. Presi<strong>de</strong>nte <strong>de</strong> la Free SoftwareFoundation. Fundador GNU.[10] TORVALDS, L. El sistema operativo linux. http://www.linux.org.[11] TSUCHIYA, M. Emacs: emacs-w3m. http://emacs-w3m.namazu.org.[12] WALLIN, I., AND CEDEQVIST, 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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!