<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7872588298095020991</id><updated>2011-11-04T05:10:33.421+01:00</updated><category term='Conversaciones con HAL'/><category term='Reflexiones musicales'/><category term='Educación musical'/><category term='Reflexiones poéticas'/><category term='Aplicaciones de consola'/><category term='Cultura libre'/><category term='Educación'/><category term='Reflexiones tecnológicas'/><category term='Lenguajes de marcas'/><category term='Poesía'/><category term='Anécdotas'/><category term='Reflexiones filosóficas'/><category term='Reseñas de libros'/><title type='text'>Los pájaros de hogaño</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default?start-index=101&amp;max-results=100'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4180756225541545679</id><published>2011-11-02T16:35:00.002+01:00</published><updated>2011-11-02T16:36:09.945+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El chino de Kurosawa (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Ig9nSMDE5hQ/TrFjWx1sHlI/AAAAAAAAALo/bE4SbZxobJA/s1600/el-chino-de-kuroswa.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 366px;" src="http://3.bp.blogspot.com/-Ig9nSMDE5hQ/TrFjWx1sHlI/AAAAAAAAALo/bE4SbZxobJA/s400/el-chino-de-kuroswa.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5670422648822963794" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4180756225541545679?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4180756225541545679/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/11/el-chino-de-kurosawa-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4180756225541545679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4180756225541545679'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/11/el-chino-de-kurosawa-poema.html' title='El chino de Kurosawa (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Ig9nSMDE5hQ/TrFjWx1sHlI/AAAAAAAAALo/bE4SbZxobJA/s72-c/el-chino-de-kuroswa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5677343939678579102</id><published>2011-11-01T18:40:00.002+01:00</published><updated>2011-11-01T19:29:25.294+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El castaño de las eras (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dm2oAeF6m_c/TrA6e9qGIPI/AAAAAAAAALc/XE-9JWVL__0/s1600/el-castano-de-las-eras.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 359px;" src="http://4.bp.blogspot.com/-dm2oAeF6m_c/TrA6e9qGIPI/AAAAAAAAALc/XE-9JWVL__0/s400/el-castano-de-las-eras.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5670096234481066226" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5677343939678579102?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5677343939678579102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/11/el-castano-de-las-eras-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5677343939678579102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5677343939678579102'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/11/el-castano-de-las-eras-poema.html' title='El castaño de las eras (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dm2oAeF6m_c/TrA6e9qGIPI/AAAAAAAAALc/XE-9JWVL__0/s72-c/el-castano-de-las-eras.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-6129354857524042777</id><published>2011-10-30T15:08:00.002+01:00</published><updated>2011-10-30T15:09:02.455+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>La piedra del corazón (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-8eaj4l1v39Y/Tq1aa3x4NGI/AAAAAAAAALE/AJisqf8vpT4/s1600/la-piedra-del-corazon.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 396px;" src="http://3.bp.blogspot.com/-8eaj4l1v39Y/Tq1aa3x4NGI/AAAAAAAAALE/AJisqf8vpT4/s400/la-piedra-del-corazon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5669286923625575522" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-6129354857524042777?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/6129354857524042777/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/la-piedra-del-corazon-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6129354857524042777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6129354857524042777'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/la-piedra-del-corazon-poema.html' title='La piedra del corazón (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-8eaj4l1v39Y/Tq1aa3x4NGI/AAAAAAAAALE/AJisqf8vpT4/s72-c/la-piedra-del-corazon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7748319432604361227</id><published>2011-10-28T22:59:00.002+02:00</published><updated>2011-10-28T23:12:35.000+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El roble descuajado (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-8dBd7-ZIEyM/TqsaubMGCzI/AAAAAAAAAK4/yhAUVXwafr0/s1600/el-roble-descuajado.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 390px;" src="http://1.bp.blogspot.com/-8dBd7-ZIEyM/TqsaubMGCzI/AAAAAAAAAK4/yhAUVXwafr0/s400/el-roble-descuajado.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5668653940850690866" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7748319432604361227?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7748319432604361227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-roble-descuajado-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7748319432604361227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7748319432604361227'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-roble-descuajado-poema.html' title='El roble descuajado (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-8dBd7-ZIEyM/TqsaubMGCzI/AAAAAAAAAK4/yhAUVXwafr0/s72-c/el-roble-descuajado.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-6713021301808800859</id><published>2011-10-28T12:00:00.004+02:00</published><updated>2011-10-28T12:46:56.926+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>De la forma y sus demonios</title><content type='html'>Los estetas reclaman la descomposición de la forma, o su chocante "originalidad", o su libertad inconculcable y contestaria. Pues esteta es quien goza de esas literarias o artísticas rupturas, cansado como está ya, sin saberlo, de su no vivir entregado o vendido a la contemplación de tanto arte, mucho de él, según él dice, trasnochado; todo él, en todo caso, sucedáneo de una vida (la suya) donde el existir está marcado únicamente por el deseo de distinción, en gustos refinados y minoritarios, y por la carencia total de empatía con lo que hay detrás de todo arte verdadero.&lt;br /&gt;&lt;br /&gt;Los diletantes, por su parte, denostan los "experimentos" vanguardistas. Su buen gusto no tolera esos, según ellos, espurios esfuerzos de una inteligencia rebuscada y artificiosa  por destacarse de lo natural y sano y elevado. Aunque no sea elevación lo que el diletante busque, sino el adorno y suave consuelo de la monotonía de su, más que seguramente, afortunada y acomodada supervivencia.&lt;br /&gt;&lt;br /&gt;Ni unos ni otros se deshacen de sus prejuicios, pues son más que prejuicios, son su traición y su trampa. Ni unos ni otros comprenderían que detrás del equilibrio y quietud de la forma puede estar el deseo agónico de un corazón por hallar un último refugio a su desmembramiento y disolución (Hölderlin, Poemas de la Locura) o que por dentro de la forma derruida y la oclusión del sentido está siempre, cuando es verdadero, el martirio de un espíritu para el que la vida empieza a dejar de ser posible (Celan).&lt;br /&gt;&lt;br /&gt;Decía Schelling que el mayor logro de la filosofía sería su desaparición. Más valdría que el arte, todo él, desapareciese de la escena pública. O que quedase sólo como lo que realmente es, cuando es lo que es, desde que perdió su puesto en el seno de una comunidad efectiva, hace tiempo inexistente e irrecobrable, es decir, como la enfermedad o el pecado privado del exiliado, del tarado, del loco.&lt;br /&gt;&lt;br /&gt;El resto no es más que literatura. Cosas de estetas y diletantes, que, con razón (la suya siempre) arrojarán esta diatriba al fuego de su indiferencia, no sin antes haberla etiquetado como corresponde: un ejemplo intempestivo del malditismo romántico o postromántico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-6713021301808800859?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/6713021301808800859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/de-la-forma-y-sus-demonios.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6713021301808800859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6713021301808800859'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/de-la-forma-y-sus-demonios.html' title='De la forma y sus demonios'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5908485745533225302</id><published>2011-10-20T17:25:00.002+02:00</published><updated>2011-10-20T17:26:06.441+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>Iglesia de la Magdalena (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-1_BwCHKMMKE/TqA9f-UmJMI/AAAAAAAAAKg/BsqPeeP7_XU/s1600/iglesia-de-la-magdalena.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 338px;" src="http://4.bp.blogspot.com/-1_BwCHKMMKE/TqA9f-UmJMI/AAAAAAAAAKg/BsqPeeP7_XU/s400/iglesia-de-la-magdalena.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5665595950746707138" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5908485745533225302?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5908485745533225302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/iglesia-de-la-magdalena-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5908485745533225302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5908485745533225302'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/iglesia-de-la-magdalena-poema.html' title='Iglesia de la Magdalena (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1_BwCHKMMKE/TqA9f-UmJMI/AAAAAAAAAKg/BsqPeeP7_XU/s72-c/iglesia-de-la-magdalena.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-9167276996098601807</id><published>2011-10-19T18:40:00.003+02:00</published><updated>2011-10-20T01:17:42.530+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El reloj del salón (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-JjdVZ7GgvOM/Tp9aepER69I/AAAAAAAAAKU/wqj4OClj3Zk/s1600/el-reloj-del-salon.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 338px;" src="http://1.bp.blogspot.com/-JjdVZ7GgvOM/Tp9aepER69I/AAAAAAAAAKU/wqj4OClj3Zk/s400/el-reloj-del-salon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5665346338721754066" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-9167276996098601807?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/9167276996098601807/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-reloj-del-salon-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/9167276996098601807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/9167276996098601807'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-reloj-del-salon-poema.html' title='El reloj del salón (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JjdVZ7GgvOM/Tp9aepER69I/AAAAAAAAAKU/wqj4OClj3Zk/s72-c/el-reloj-del-salon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3935204165184155085</id><published>2011-10-18T16:34:00.004+02:00</published><updated>2011-10-18T17:02:59.795+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>Plaza de la Universidad (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-JK9a-6HKxPE/Tp2VHWxBIEI/AAAAAAAAAJ8/F3SqgRiDxTg/s1600/plaza-de-la-universidad.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 334px;" src="http://2.bp.blogspot.com/-JK9a-6HKxPE/Tp2VHWxBIEI/AAAAAAAAAJ8/F3SqgRiDxTg/s400/plaza-de-la-universidad.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5664847859904749634" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3935204165184155085?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3935204165184155085/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/plaza-de-la-universidad-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3935204165184155085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3935204165184155085'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/plaza-de-la-universidad-poema.html' title='Plaza de la Universidad (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-JK9a-6HKxPE/Tp2VHWxBIEI/AAAAAAAAAJ8/F3SqgRiDxTg/s72-c/plaza-de-la-universidad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5765554930274343427</id><published>2011-10-16T21:36:00.003+02:00</published><updated>2011-10-16T21:38:35.141+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El osolito (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-D9UbGJQfBNY/TpsyXCRwkHI/AAAAAAAAAJY/Sl48UC3go2o/s1600/el-osolito.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 349px;" src="http://2.bp.blogspot.com/-D9UbGJQfBNY/TpsyXCRwkHI/AAAAAAAAAJY/Sl48UC3go2o/s400/el-osolito.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5664176327678267506" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5765554930274343427?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5765554930274343427/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-osolito-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5765554930274343427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5765554930274343427'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-osolito-poema.html' title='El osolito (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-D9UbGJQfBNY/TpsyXCRwkHI/AAAAAAAAAJY/Sl48UC3go2o/s72-c/el-osolito.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8693358063314244040</id><published>2011-10-15T22:01:00.002+02:00</published><updated>2011-10-15T22:02:18.079+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El tarado (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-va7l10RFbOI/Tpnmr5RjxFI/AAAAAAAAAJM/_WAqy6CO-HQ/s1600/el-tarado.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 348px;" src="http://2.bp.blogspot.com/-va7l10RFbOI/Tpnmr5RjxFI/AAAAAAAAAJM/_WAqy6CO-HQ/s400/el-tarado.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663811648178340946" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8693358063314244040?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8693358063314244040/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-tarado-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8693358063314244040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8693358063314244040'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-tarado-poema.html' title='El tarado (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-va7l10RFbOI/Tpnmr5RjxFI/AAAAAAAAAJM/_WAqy6CO-HQ/s72-c/el-tarado.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-9179920387413771459</id><published>2011-10-14T22:51:00.002+02:00</published><updated>2011-10-14T23:08:54.435+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>Zampa (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-RT97_56hXvo/Tpik0B-uE3I/AAAAAAAAAIQ/3aBIMgdXCBs/s1600/zampa.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 364px;" src="http://1.bp.blogspot.com/-RT97_56hXvo/Tpik0B-uE3I/AAAAAAAAAIQ/3aBIMgdXCBs/s400/zampa.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663457745210053490" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-9179920387413771459?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/9179920387413771459/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/zampa-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/9179920387413771459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/9179920387413771459'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/zampa-poema.html' title='Zampa (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RT97_56hXvo/Tpik0B-uE3I/AAAAAAAAAIQ/3aBIMgdXCBs/s72-c/zampa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1765951090488154092</id><published>2011-10-12T12:45:00.003+02:00</published><updated>2011-10-15T12:25:59.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El sendero de la alambrada (poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-HVPq2tk87ds/TplfqeP9M9I/AAAAAAAAAJA/zzAhsZ-kSNE/s1600/el-sendero-de-la-alambrada.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 370px;" src="http://2.bp.blogspot.com/-HVPq2tk87ds/TplfqeP9M9I/AAAAAAAAAJA/zzAhsZ-kSNE/s400/el-sendero-de-la-alambrada.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663663189674243026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[retocado: 15/10/11]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1765951090488154092?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1765951090488154092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-sendero-de-la-alambrada-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1765951090488154092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1765951090488154092'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-sendero-de-la-alambrada-poema.html' title='El sendero de la alambrada (poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-HVPq2tk87ds/TplfqeP9M9I/AAAAAAAAAJA/zzAhsZ-kSNE/s72-c/el-sendero-de-la-alambrada.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-359490612857439029</id><published>2011-10-09T22:45:00.001+02:00</published><updated>2011-10-09T22:47:37.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>El pastizal de las terneras (un poema)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-AcFDuzT14dk/TpIIWhJPzVI/AAAAAAAAAH8/HO514aHcv4Y/s1600/el-pastizal-de-las-terneras.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 284px;" src="http://2.bp.blogspot.com/-AcFDuzT14dk/TpIIWhJPzVI/AAAAAAAAAH8/HO514aHcv4Y/s400/el-pastizal-de-las-terneras.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5661596864505433426" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-359490612857439029?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/359490612857439029/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-pastizal-de-las-terneras-un-poema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/359490612857439029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/359490612857439029'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/el-pastizal-de-las-terneras-un-poema.html' title='El pastizal de las terneras (un poema)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-AcFDuzT14dk/TpIIWhJPzVI/AAAAAAAAAH8/HO514aHcv4Y/s72-c/el-pastizal-de-las-terneras.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8187190928073973556</id><published>2011-10-03T14:34:00.009+02:00</published><updated>2011-10-15T12:23:14.476+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><title type='text'>Tres poemas</title><content type='html'>&lt;h4&gt;La reguera&lt;/h4&gt;&lt;br/&gt; (&lt;em&gt;16 de septiembre&lt;/em&gt;)&lt;br /&gt;[retocado: 15/10/11]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-gR3XWWXqK0s/TpleNZvnyHI/AAAAAAAAAIc/IqhJ9MuWgLI/s1600/la-reguera.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 340px;" src="http://4.bp.blogspot.com/-gR3XWWXqK0s/TpleNZvnyHI/AAAAAAAAAIc/IqhJ9MuWgLI/s400/la-reguera.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663661590737045618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;La Huerta Grande&lt;/h4&gt;&lt;br/&gt; (&lt;em&gt;17 de septiembre&lt;/em&gt;)&lt;br /&gt;[retocado: 15/10/11]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-cTprtgbi5vc/TplesTD6tCI/AAAAAAAAAIo/0QZ4P1UIfg4/s1600/la-huerta-grande.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 347px;" src="http://3.bp.blogspot.com/-cTprtgbi5vc/TplesTD6tCI/AAAAAAAAAIo/0QZ4P1UIfg4/s400/la-huerta-grande.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663662121519068194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;La casa materna&lt;/h4&gt; &lt;br/&gt; (&lt;em&gt;3 de octubre&lt;/em&gt;)&lt;br /&gt;[retocado: 15/10/11]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-hEW4pMecXKQ/Tple6FhVp2I/AAAAAAAAAI0/rnGebnLrk-c/s1600/la-casa-materna.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 383px;" src="http://1.bp.blogspot.com/-hEW4pMecXKQ/Tple6FhVp2I/AAAAAAAAAI0/rnGebnLrk-c/s400/la-casa-materna.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663662358402541410" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8187190928073973556?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8187190928073973556/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/tres-poemas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8187190928073973556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8187190928073973556'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/10/tres-poemas.html' title='Tres poemas'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gR3XWWXqK0s/TpleNZvnyHI/AAAAAAAAAIc/IqhJ9MuWgLI/s72-c/la-reguera.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5250842310086258376</id><published>2011-07-02T23:31:00.023+02:00</published><updated>2011-07-03T20:45:09.096+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poesía'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>Ocho poemas</title><content type='html'>Las palabras no dicen la verdad. Pero cantar es desdecirse en cada aliento. El mundo son las palabras de la infancia, que el hombre olvida. El viejo ---como cantaba Aleixandre en un poema último--- lo sabe: "sólo el niño conoce", pues está solo. Por eso únicamente el niño se despide. El hombre es ya el despedido, el que está más allá de sus adioses, después y detrás ---en el olvido--- de sus adioses. Olvidar es vivir. El canto es la memoria de ese olvido. Sobre todo cuando brota, un día cualquiera, de esa luz imposible de la infancia ---aquel día cualquiera de nuestro calendario---, antes de que el cantor lo olvide, y viva.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;27 de marzo&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-YAVu3gamOP0/Tg-eea6cEVI/AAAAAAAAAGU/UnDJ1nmLuwI/s1600/existencia.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://3.bp.blogspot.com/-YAVu3gamOP0/Tg-eea6cEVI/AAAAAAAAAGU/UnDJ1nmLuwI/s400/existencia.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624888705066733906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;3 de abril&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-M2_hUx8AKEs/Tg-eoQaXZRI/AAAAAAAAAGc/OfZ7NNfz6Pw/s1600/primicia.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://2.bp.blogspot.com/-M2_hUx8AKEs/Tg-eoQaXZRI/AAAAAAAAAGc/OfZ7NNfz6Pw/s400/primicia.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624888874046547218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;4 de abril&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Wq3JhAz1juU/Tg-ezAIRg9I/AAAAAAAAAGk/Jq6MhGNzrYY/s1600/los-cerezos.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 392px;" src="http://3.bp.blogspot.com/-Wq3JhAz1juU/Tg-ezAIRg9I/AAAAAAAAAGk/Jq6MhGNzrYY/s400/los-cerezos.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624889058654258130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;21 de abril&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-7X2CgukLrMs/Tg-e_HzOxDI/AAAAAAAAAGs/ZhlUbcyz85g/s1600/los-zorzales.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 395px; height: 400px;" src="http://4.bp.blogspot.com/-7X2CgukLrMs/Tg-e_HzOxDI/AAAAAAAAAGs/ZhlUbcyz85g/s400/los-zorzales.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624889266871911474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;15 de mayo&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-AU4R9DVanOk/Tg-fK1rSbII/AAAAAAAAAG0/jDAh0ApZZrQ/s1600/los-chopos.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://3.bp.blogspot.com/-AU4R9DVanOk/Tg-fK1rSbII/AAAAAAAAAG0/jDAh0ApZZrQ/s400/los-chopos.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624889468165188738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;22 de mayo&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-JonPsYw9tp0/Tg-fWH2wNgI/AAAAAAAAAG8/hkgpvdNO6Gk/s1600/la-corredera.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 397px; height: 400px;" src="http://2.bp.blogspot.com/-JonPsYw9tp0/Tg-fWH2wNgI/AAAAAAAAAG8/hkgpvdNO6Gk/s400/la-corredera.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624889662023677442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;5 de junio&lt;/em&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-QoKyKFI2VIE/ThC4iwoL6DI/AAAAAAAAAHU/X5JbFe3Qv94/s1600/universario.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 395px; height: 400px;" src="http://1.bp.blogspot.com/-QoKyKFI2VIE/ThC4iwoL6DI/AAAAAAAAAHU/X5JbFe3Qv94/s400/universario.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5625198841894266930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;26 de junio&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Rq8EnjDDKms/Tg-fsBCIaaI/AAAAAAAAAHM/jrmEviUHHSw/s1600/el-apeadero.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://2.bp.blogspot.com/-Rq8EnjDDKms/Tg-fsBCIaaI/AAAAAAAAAHM/jrmEviUHHSw/s400/el-apeadero.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624890038149474722" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5250842310086258376?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5250842310086258376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/07/ocho-poemas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5250842310086258376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5250842310086258376'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/07/ocho-poemas.html' title='Ocho poemas'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YAVu3gamOP0/Tg-eea6cEVI/AAAAAAAAAGU/UnDJ1nmLuwI/s72-c/existencia.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7195523420458748838</id><published>2011-01-19T13:40:00.008+01:00</published><updated>2011-01-19T21:58:25.162+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>Canto y escritura (II)</title><content type='html'>En la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2011/01/canto-y-escritura.html"&gt;entrada anterior&lt;/a&gt; a ésta presentaba ejemplos en los que la escritura trata de encontrar medios poco habituales de plasmar el canto que representa.&lt;br /&gt;&lt;br /&gt;Me gustaría añadir un nuevo ejemplo, donde las dificultades descritas en la entrada referida se hacen más evidentes y, en algún sentido, más peliagudas: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-HIqqxAvoQI/TTcGk_uYJUI/AAAAAAAAAFE/AiY_fuROZgo/s1600/algo-en-el-espejo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://1.bp.blogspot.com/_-HIqqxAvoQI/TTcGk_uYJUI/AAAAAAAAAFE/AiY_fuROZgo/s400/algo-en-el-espejo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563923097290548546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La primera es que hay aquí una polifonía implícita (aparte de la que introducen los paréntesis), polifonía no señalada de ninguna forma especial. Pero justo en el último verso esa polifonía se hace manifiesta, en la extraña sílaba con que se inicia ("prö"). En ese momento se unen "en acorde" dos voces: la sílaba final de "era" con la sílaba final de "tiempo", donde "ra" es continuación del "e-" del final del verso anterior y "po" es la continuación anticipada (pero prefigurada en la insistente repetición de "el tiempo" a lo largo del canto) de la sílaba "tiem-" con que acaba el verso. Pero ¿cómo cantar ambas voces a la vez? He preferido aquí construir una sílaba inexistente en castellano en que ambas voces (las sílabas correspondientes a cada voz) se traban en su decir simultáneo, pues es hacia esa precisa trabadura hacia la que el canto en ese momento se siente impelido.&lt;br /&gt;&lt;br /&gt;Podría haber elegido esta otra posibilidad, donde la palabra se ramifica, con el fin de señalar justamente que ambas ramificaciones deben pronunciarse simultáneamente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTcFIr7oG_I/AAAAAAAAAE8/Q3wLtZXzaVo/s1600/algo-en-el-espejo-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTcFIr7oG_I/AAAAAAAAAE8/Q3wLtZXzaVo/s400/algo-en-el-espejo-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563921511429446642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Probablemente, si el canto contuviera un mayor número de "acordes", esta sería la mejor forma de representarlos mediante la escritura, aun siendo menos precisa que la anterior. No se trataría en tal caso de caminos posibles del canto, como puede suceder en otros autores, sino de canto simultáneo.&lt;br /&gt;&lt;br /&gt;Una segunda dificultad tiene que ver con el carácter cíclico del poema (de ahí, entre otras cosas, el subtítulo "Letanía"). Podría haber echado mano, a pesar de mi tendencia acusada a no hacerlo nunca, de signos musicales de repetición, a saber, haber enmarcado el poema entre los signos ||: y :||, pero me ha parecido más conveniente y menos abstracto recurrir a una flecha que parta de la última sílaba del último verso y se dirija hacia el comienzo del primer verso. La flecha aquí no es más que la indicación de que el canto debe repetirse incesantemente, sin término, o hasta que la extenuación del recitador lo concluya abruptamente. Canto, pues, o letanía que no sale de sí, que se autoengendra y en sí mismo se desploma. Canto que sólo podrá enmudecer en un silencio inevitablemente prematuro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7195523420458748838?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7195523420458748838/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/01/canto-y-escritura-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7195523420458748838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7195523420458748838'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/01/canto-y-escritura-ii.html' title='Canto y escritura (II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-HIqqxAvoQI/TTcGk_uYJUI/AAAAAAAAAFE/AiY_fuROZgo/s72-c/algo-en-el-espejo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3601269271780098418</id><published>2011-01-17T01:12:00.008+01:00</published><updated>2011-01-17T16:45:43.380+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>Canto y escritura</title><content type='html'>Si ya Platón reflexionaba en el &lt;em&gt;Fedro&lt;/em&gt; sobre los peligros que para el filosofar podía conllevar la escritura, también la poesía escrita ---así lo he sentido yo siempre--- se enfrenta a amenazas semejantes, al menos para quien considera y siente, como es mi caso, que los versos que ahora leemos en un libro son únicamente canto y que sólo por razones históricas el canto ha dejado de ser directamente cantado por el cantor o intérprete (el rapsoda griego, por ejemplo) y se ha convertido en página escrita o impresa.&lt;br /&gt;&lt;br /&gt;Sé perfectamente que esta percepción de la poesía como canto se aleja de otras posibles. No voy a especular en este sentido. Simplemente, no me interesa la poesía que no es esencialmente un canto. De ahí, mi preferencia del término "canto", que evita malentendidos, en detrimento del término "poesía".&lt;br /&gt;&lt;br /&gt;El canto se canta. Debe cantarse el verso que se lee, debe entonarse en voz perceptible, si es que se quiere hacer justicia a su alma (el ritmo) y a su cuerpo (la palabra pronunciada). Sólo en su recitación cobra vida el poema, el verso. El lector del canto escrito es y debe ser su intérprete, de la misma forma que el cantante da vida a la partitura que canta.&lt;br /&gt;&lt;br /&gt;Normalmente no hay dificultades especiales en este sentido para quien recita, más que las ya conocidas, que se resuelven gracias a la práctica y el conocimiento práctico de recursos poéticos comunes (sinalefa, hiato, encabalgamiento, etc.). Pero los problemas se agudizan cuando el canto se instala en regiones menos familiares, donde no hay referencias establecidas por el uso, máxime cuando el libro de poemas no recurre a esa práctica habitual en la edición de partituras de música contemporánea, la de proporcionar una serie de instrucciones previas sobre la forma de ejecutar determinados signos no convencionales.&lt;br /&gt;&lt;br /&gt;En los casos a que me refiero se puede producir una confusión en el lector. Allí donde él ve algo que se resiste a su recitación inmediata puede entender que ya no se trata de la "partitura" de un canto, sino de alguna clase de pictograma, donde lo que cuenta es la pura forma de los signos escritos y su juego estético. Pero no siempre es así. Y cuando no es así, el poeta se enfrenta a una dificultad inesperada, la de presentar mediante una escritura extraña un canto que, en su dicción, se separa de lo familiar.&lt;br /&gt;&lt;br /&gt;Me gustaría ilustrar con ejemplos propios este tipo de dificultad.&lt;br /&gt;&lt;br /&gt;En la página de la figura siguiente, que pertenece al final de un poema más largo, utilizo la repetición de letras y la distancia entre versos para tratar de señalar al lector como debe cantar el poema, en concreto, la palabra "viene". Las distancias entre versos (los silencios entre versos) son mayores que los que separan los versos previos del poema; la dicción de ciertos fonemas debe alargarse mucho más de lo que normalmente les correspondería. No hay aquí ninguna forma especial de señalar mediante signos rítmicos propios de la música la duración exacta de estas "prolongaciones" de la duración (se supone, por lo demás, que el lector no tiene por qué saber música). Esto implica que se deja libertad al lector para que sea él quien busque un canto convincente y adecuado. De ahí que el número de repeticiones de letras o las distancias entre versos sea meramente aproximada.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTRf4Zbk9EI/AAAAAAAAAEU/Bj7u9uDtn6k/s1600/jaca.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTRf4Zbk9EI/AAAAAAAAAEU/Bj7u9uDtn6k/s400/jaca.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563176862213272642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El próximo ejemplo es más complicado. Aquí los paréntesis indican silencios. Pero en este caso la duración del silencio se establece con mayor precisión que en el caso anterior. &lt;br /&gt;&lt;br /&gt;Un lector atento puede llegar a comprender que en realidad se trata de dos tipos de silencio. Los primeros, que aparecen al final de algunos versos, están por algo que falta, que no se da. La repetición del canto inicial se retoma de nuevo, cuatro veces, como se observará, pero no siempre desde el mismo lugar del metro heptasilábico. Esto provoca en ocasiones la imposibilidad de completar el metro. Se produce entonces un vacío, que debe entonarse como silencio, como ausencia, y que se señala mediante dichos paréntesis. Junto con estos paréntesis hay otros de longitud variable. No se trata de meros huecos, cuyo tamaño ha sido caprichosamente elegido por razones de diseño gráfico. Se trata de agujeros o enmudecimientos en el canto (el mismo y único canto repetido cuatro veces), zonas donde el silencio se apodera del canto. Y ese silencio dura y ha de durar lo mismo que el canto sumergido en él. El lector se ve obligado a "sentir" por dentro el canto de antes mientras el silencio que lo embarga dura exactamente lo que aquel canto previo.&lt;br /&gt;&lt;br /&gt;Finalmente, tampoco es un artefacto arbitrario de la escritura situar las últimas palabras "sus arenas" fuera de la columna de heptasílabos. "sus arenas" debe salir del canto estrófico, y ello se indica extrayendo la palabra fuera de su lugar habitual, porque, en verdad, estas palabras rompen el pie yámbico en que se escancia el resto del poema. Justamente tal hecho puede igualmente indicar al lector hasta qué punto en este poema es esencial una entonación que exagere, más allá de lo que sería habitual en poesía española, precisamente ese pie, el yambo, que lo exagere (distinguiendo en la dicción la sílaba breve de la larga) hasta llegar a esas dos últimas palabras donde el canto se detiene contra su propia voluntad.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTRgHWtkv8I/AAAAAAAAAEc/AR5ZdD4fe8Q/s1600/aporia.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/TTRgHWtkv8I/AAAAAAAAAEc/AR5ZdD4fe8Q/s400/aporia.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563177119181488066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En el ejemplo que sigue las cosas parecen más comprensibles. Aquí el único recurso atípico es el uso de colores diferentes. Y lo que estos colores indican resulta, debería resultar, bastante claro: dos voces distintas. En efecto, se trata de un poema polifónico, a dos voces; más exactamente de dos cantos encajados uno en otro. Es obligación del lector interpretar estas dos voces como dos voces reales (tal vez, su propia voz y un susurro, alternativamente).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-HIqqxAvoQI/TTRgTnFaasI/AAAAAAAAAEk/6F88h6InkS0/s1600/premonicion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://3.bp.blogspot.com/_-HIqqxAvoQI/TTRgTnFaasI/AAAAAAAAAEk/6F88h6InkS0/s400/premonicion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563177329734871746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No me gustaría terminar sin un último ejemplo que, en alguna medida, contradice mi posición inicial, la de la prevalencia absoluta del canto sobre la escritura. En este ejemplo se usan dos recursos que no tienen ninguna posibilidad (o muy poca, sin duda) de encontrar dicción: una palabra tachada, y una palabra con parte de sus letras rotadas hacia atrás. Renuente, como soy, a todo artefacto que pertenezca a la mera escritura o la experimentación porque sí, me he sentido, sin embargo, obligado a pasar aquí por esta excepción, quizá en la sensación de que también el canto, como sucede en ciertos jeroglíficos antiguos, puede valerse en algunos extraños momentos de tales artefactos, para sugerir, allí donde se impone, matices puramente emocionales (una atmósfera súbita) en el interior de sí mismo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-HIqqxAvoQI/TTRgolJg4QI/AAAAAAAAAEs/20mrzsIBA1Y/s1600/la-encrucijada.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://1.bp.blogspot.com/_-HIqqxAvoQI/TTRgolJg4QI/AAAAAAAAAEs/20mrzsIBA1Y/s400/la-encrucijada.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563177689992454402" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3601269271780098418?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3601269271780098418/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/01/canto-y-escritura.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3601269271780098418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3601269271780098418'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2011/01/canto-y-escritura.html' title='Canto y escritura'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-HIqqxAvoQI/TTRf4Zbk9EI/AAAAAAAAAEU/Bj7u9uDtn6k/s72-c/jaca.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-6044209580244651190</id><published>2010-09-28T19:07:00.008+02:00</published><updated>2010-09-29T10:20:08.427+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones filosóficas'/><title type='text'>Nihilismo y aledaños</title><content type='html'>Desde hace bastante, el nihilismo, su sentido, su origen, sus consecuencias, sus fenómenos paralelos, etc. han ocupado continuamente mi pensamiento. En algún otro lugar de este blog he hecho &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2008/06/la-literatura-filosfica-y-la.html"&gt;referencias a ello&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Con ocasión de esta nueva entrada (cuánto tiempo sin volver al blog y cuánto, a buen seguro, el que transcurrirá sin que regrese a él) recuerdo libros extraordinarios, como muchas de las novelas de Dostoyevski, o releo mis propias reflexiones de hace algunos años, como estos fragmentos que ahora me atrevo a dar a la luz pública: &lt;a href="http://www.bubok.com/libros/190384/Apuntes-sobre-el-nihilismo"&gt;Apuntes sobre el nihilismo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pero los interrogantes que para mí abre el nihilismo siguen siendo tan inabordables como el propio nihilismo.&lt;br /&gt;&lt;br /&gt;Pienso, por ejemplo, en los personajes "nihilistas" de &lt;em&gt;Los demonios&lt;/em&gt; de Dostoyevski. ¿Cuántos nihilistas verdaderos hay ahí? ¿Cuántos son sólo aparentemente nihilistas?&lt;br /&gt;&lt;br /&gt;Hay también ahora aspectos psicológicos que reclaman mi atención últimamente. El motivo es múltiple. Parte de ese motivo nace de un intercambio teórico sobre figuras terribles de la historia contemporánea, no hace falta citar nombres, porque hay demasiados. Digamos que alguien, imbuido en un pensamiento de raíz oriental, teoriza del modo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;El problema de los grandes genocidas conocidos de todos es el de la perversión de una idea como consecuencia de un desajuste entre su "mundo onírico o ideal" y el "mundo real", concretamente de una imposibilidad por parte del asesino de canalizar la energía de su "mundo onírico o ideal" en el mundo real.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Pero una teoría como la citada comete el craso error de identificar al genocida nihilista con el mero loco, o, incluso, con ciertos tipos, bien humanos y no nihilistas, de criminales. No hay nada en este esbozo de teoría que permita distinguir un caso del otro. Y son radicalmente distintos, aunque pueda haber puntos de interferencia. Puede haber, en efecto, criminales y locos nihilistas, como también nihilistas que no actúan criminalmente ni locamente de acuerdo con lo que la sociedad estipula como locura o crimen. ¿No es acaso la sociedad contemporánea entera ella misma nihilista en un sentido muy profundo?&lt;br /&gt;&lt;br /&gt;Así, y en franca oposición al esbozo teórico referido, tiendo a pensar que la locura, tal como la entendemos normalmente, esto es, la patología verificable en las consultas de psiquiatras o psicólogos, bien pudiera ser una reacción psicológica de defensa contra la amenaza nihilista.&lt;br /&gt;&lt;br /&gt;Quisiera explicar ---y explicarme--- este último punto, sin pretender llegar a nada más que a dar vueltas sobre el tema.&lt;br /&gt;&lt;br /&gt;Si adopto metáforas arbitrarias (mi conocimiento de lo oriental es limitadísimo), por ejemplo, la metáfora del corazón (o, en general, de la entraña) como sede de la voluntad y de la energía creativa, o la metáfora del alma (o del espíritu) como sede del yo en el sentido platónico, y por tanto, su centro existencial, moral, etc., podría elaborar la siguiente hipótesis psicológica. Algo de andar por casa, naturalmente, porque carece de rigor filosófico (mejor sería hacer un poema; pero ahora no me sale ;-) )&lt;br /&gt;&lt;br /&gt;Las enfermedades paralizantes del ánimo, como la consabida y ubicua depresión, que, desde las metáforas aludidas, sería una parada del corazón, un debilitamiento absoluto de la energía psíquica, salvaguardaría al individuo, sometido a un conflicto interior de magnitud para él inabordable, del proceso verdaderamente destructivo que supondría la conversión de su alma ---siguiendo con las metáforas--- de fuente de luz en fuente de negror. Otros desequilibrios anímicos, en los que el sujeto se escinde o se rompe, también pudieran estar "protegiendo" al sujeto del salto nihilista. Por supuesto, el suicidio, mostraría en grado máximo esa forma de protección (Evidentemente, el Kirilov de Dostoyevski no es un nihilista).&lt;br /&gt;&lt;br /&gt;¿Salto nihilista? El salto nihilista es una expresión más para captar algo así como el verse súbitamente "endemoniado" (en el sentido de Dostoyevski). El verdadero endemoniado mantiene intactas y a su servicio todas sus facultades psíquicas. No hay ahí la parálisis del depresivo; ni hay tampoco la escisión del esquizofrénico; ni, por supuesto, la voluntad suicida (el suicida, el premeditado, ama, ante todo, su dignidad, que no puede preservar en sus circunstancias actuales y para cuya salvaguarda debe acudir a la voluntaria cesación de su existencia temporal). Pero el nihilista, el Piotr Stepanovich, por ejemplo, está lleno de juicio calculador y pletórico de fuerza creativa. Su creación no es otra que la nada; la aniquilación, &lt;em&gt;porque sí&lt;/em&gt; (y hay que subrayarlo), del mundo, potencia aniquiladora que puede enmascararse ideológicamente como se quiera, eso no sería más que una forma más o menos consciente de conseguir prosélitos y llevar a cabo el plan. Cualquier plan es intercambiable con tal de que su efecto coincida con el origen del que nace: la inexistencia absoluta en el alma del "endemoniado" de todo valor y de todo amor. El "endemoniado": un ser sin alma, o con un alma donde el ángel (diría, tal vez, un Platón cristianizado) ha sido suplantado por un demonio.&lt;br /&gt;&lt;br /&gt;¿Cuál es el origen del salto nihilista? Imposible saberlo. Hay, naturalmente un clima dominante, un clima nihilista circundante. ¿Se nace nihilista? No lo creo. Pero me interesa más la pregunta: ¿Puede uno llegar a perder (volvamos con la metáfora) su alma? ¿Qué sucede, por ejemplo, incluso en el más enérgico y espiritual de los hombres, cuando en ciertos momentos de extrema penuria y conflicto insoluble, los recursos psicológicos habituales (depresión, desequilibrio psíquico patológico de todo tipo) no están a la mano, no funcionan, o dejan de funcionar porque que se superan y se cura la patología inicial? ¿No puede suceder que la energía psíquica salga indemne, que el corazón continúe palpitando firme y regularmente, y el sujeto logre destruir el conflicto echando mano de lo más simple: la degradación definitiva de los elementos que lo constituyen, su nulificación, su conversión en meras nadas, nadas que ya no afectan porque se viven como nadas? El otro convertido en nada, quizá en un sentido muy levinasiano: la nada activa y plena (el demonio) en que se ha convertido el nihilista asimila al otro a su nada.&lt;br /&gt;&lt;br /&gt;¿Quién puede tolerar el asesinato del absoluto inocente? Esta pregunta del Iván Karamazov de Dostoyevski tiene una respuesta: sólo el nihilista. No puedo dejar de recordar, a propósito de esta última consideración, la primera secuencia de "Una historia de violencia", el film de Cronenberg, otra exposición maestra de un acto nihilista.&lt;br /&gt;&lt;br /&gt;Banalidad del mal, diría Hannah Arendt, mal que nace de la conversión de todo ser, de toda existencia, de toda fuente de luz, en pura nada, en lo arbitrariamente prescindible, porque no es nada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-6044209580244651190?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/6044209580244651190/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/09/nihilismo-y-aledanos.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6044209580244651190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6044209580244651190'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/09/nihilismo-y-aledanos.html' title='Nihilismo y aledaños'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-2391287641364345347</id><published>2010-02-17T16:44:00.004+01:00</published><updated>2010-02-18T01:24:19.121+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>El rey y el mendigo</title><content type='html'>&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2010/02/la-verdad-de-la-poesia.html"&gt;Hace unos días me referí&lt;/a&gt; a la última película de Tarkovski. Allí el cuadro de Leonardo, &lt;a href="http://es.wikipedia.org/wiki/Archivo:Leonardo_da_Vinci_Adoration_of_the_Magi.jpg"&gt;Adoración de los Reyes Magos&lt;/a&gt;, constituye un motivo central. La primera escena es un recorrido de abajo a arriba del cuadro, desde la mano oferente del mago hasta la copa del árbol, símbolo del Nuevo Reino, que se haya en la misma vertical que la ofrenda. En la película del director ruso esta ofrenda representa el sacrificio al que alude el nombre del film y en torno al cual gira su sentido.&lt;br /&gt;&lt;br /&gt;Sea cual sea la interpretación que queramos dar al cuadro, resulta obvia la maestría con que Leonardo ha sabido captar la naturaleza paradójica de la ofrenda y, en particular, de la ofrenda que el siervo ---aquí un mago, un sabio, pero siervo en definitiva--- eleva a su Señor, el Niño aquí. &lt;br /&gt;&lt;br /&gt;¿Quién da, quién recibe? El Niño en su plenitud no necesita ningún regalo. El mago, sin embargo, postrado tras el cansancio de un larguísimo viaje y lastrado por la precariedad de su existencia mortal requiere la atención de quien pueda salvarle en la esperanza.&lt;br /&gt;&lt;br /&gt;No es diferente la situación del poeta respecto al canto. Sócrates, en el &lt;a href="http://es.wikipedia.org/wiki/Ion_%28Plat%C3%B3n%29"&gt;Ión&lt;/a&gt;, se refería a lo que posteriormente se ha llamado inspiración con la metáfora del jardín de las Musas. Allí liba el poeta y obtiene el licor sagrado.&lt;br /&gt;&lt;br /&gt;Más cercano parece a la realidad del hecho poético imaginar al cantor como un vagabundo que merodea por los jardines inmortales y en cuyo corazón y en cuya boca liba la propia Musa. Sería la Musa quien otorga el canto, apenas sin intervención del cantor. Éste lo único que puede es estar cerca de donde la Musa quizá more.&lt;br /&gt;&lt;br /&gt;Vagabundo, entonces, el poeta, que lo pide todo y nada por sí puede, como el mago de Oriente, cuya existencia y cuyo sentido consistiría en ofrendar su esperanza a la mano salvífica.&lt;br /&gt;&lt;br /&gt;El poeta, pues, no da, recibe, recibe desde su penuria, desde su deseo, deseo al que no puede ni sabe sino sacrificase. Recibe el canto, que le hace siervo, cuando se le otorga; desterrado mendigo, cuando se le oculta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-2391287641364345347?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/2391287641364345347/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/02/el-rey-y-el-mendigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2391287641364345347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2391287641364345347'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/02/el-rey-y-el-mendigo.html' title='El rey y el mendigo'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3970868677051680421</id><published>2010-02-03T14:32:00.005+01:00</published><updated>2010-02-20T00:54:27.443+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>La verdad de la poesía</title><content type='html'>En &lt;a href="http://www.imdb.com/title/tt0091670/"&gt;Sacrificio&lt;/a&gt;, la última película de &lt;a href="http://es.wikipedia.org/wiki/Andréi_Tarkovski"&gt;Andréi Tarkovski&lt;/a&gt;, su protagonista principal, Alexander, justo después de tocar al órgano un preludio de Bach y justo antes de su unión salvífica con María, esto es, entre dos vivencias de sublime sencillez, relata una experiencia traumática. Tratando de agradar a su madre, muy enferma entonces, se propuso arreglar el jardín que la anciana contemplaba a diario y otorgarle una belleza sin mácula que ---eso pensaba él--- el jardín había perdido tras años de abandono y descuido. Después de varios días de incansable trabajo miró exhausto, pero orgulloso, el resultado de su esfuerzo. Lo que vio le espantó de horror: de la belleza natural de aquel jardín no quedaba nada, sólo las huellas de su guadaña y sus tijeras, que habían arruinado para siempre el objeto del amor de su madre.&lt;br /&gt;&lt;br /&gt;La filosofía moderna en su forma consumada, la de la fenomenología de &lt;a href="http://es.wikipedia.org/wiki/Husserl"&gt;Edmund Husserl&lt;/a&gt;, parte de un principio fundamental, su principio rector, su utopía, retornar a &lt;em&gt;las cosas mismas&lt;/em&gt; (&lt;em&gt;zurück zur Sachen selbst&lt;/em&gt;), dejar que las cosas se muestren tal cual son, sin que la intervención del pensamiento introduzca interpretaciones de la cosa no adecuadas a ella y que hagan pasar la cosa por lo que ella no es.&lt;br /&gt;&lt;br /&gt;¿Hay verdad en la poesía? Opino que sí, y que el dicho homérico &lt;em&gt;los poetas mienten demasiado&lt;/em&gt; habría que aplicárselo antes bien al artesano que, por imprudencia, precipitación o cualquier otro motivo bien comprensible, esclaviza al poeta que quiere ser, tratando de cuadrar el verso mediante su pericia. Todo artesano diestro sabe cómo completar el poema, cómo producirlo, incluso cuando ni tan siquiera hay poesía, cuando no hay &lt;em&gt;dato&lt;/em&gt;, cuando la cosa poética está ausente.&lt;br /&gt;&lt;br /&gt;Pero para que Tarkovski y Husserl hagan sentido, debemos presuponer que ciertamente hay la sencillez previa, el dato inicial. La cosa del poeta sería, desde esta perspectiva, la unidad de palabra, ritmo, imagen y emoción que abruma y embarga al poeta cuando está poseído ---por usar la idea platónica--- y que el poeta se ve impelido a explorar sin descanso. El artesano, que el poeta también es, alcanzaría el grado máximo de destreza cuando, armado de paciencia e inalienable inconformismo, fuese capaz de hacer enmudecer lo que en él hubiera de imposición, de sometimiento a una belleza cerrada y definitiva, de deseo de apaciguarse en lo no aporético.&lt;br /&gt;&lt;br /&gt;Quizá sea cierto que el esfuerzo mayor de todo artista consista esencialmente en descartar, en decir no a lo que por cansancio, precipitación o simple afán de notoriedad se cuela a hurtadillas.&lt;br /&gt;&lt;br /&gt;La verdad de la poesía radicaría, pues, en este deseo inexcusable de honestidad. El logro, el acierto ---de haberlo--- parece estar más allá de todo esfuerzo y de toda voluntad, tal vez como don, como regalo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3970868677051680421?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3970868677051680421/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/02/la-verdad-de-la-poesia.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3970868677051680421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3970868677051680421'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/02/la-verdad-de-la-poesia.html' title='La verdad de la poesía'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-2258973612520172661</id><published>2010-01-28T16:55:00.003+01:00</published><updated>2010-01-28T23:11:02.258+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>La lucidez del poeta</title><content type='html'>El poeta es lúcido donde el pensamiento no suele ni puede serlo. Cuando hay poesía, y no prescindible e insípida versificación, hay también lucidez.&lt;br /&gt;&lt;br /&gt;La lucidez del filósofo, en las pocas veces en que puede hallarse, no basta. El poeta es necesario, pues sólo él pone los cuerpos, ese alear del viento, esa mirada fugitiva e insustituible, bajo la luz de su palabra. &lt;br /&gt;&lt;br /&gt;Palabra que acoge el tiempo, pero no el tiempo objetivo de la ciencia, ni siquiera el tiempo fenomenológico de la vida (Bergson, Husserl), sino la sustancia misma del tiempo, cada una de esas cosas insignificantes de las que científico y filósofo hacen abstracción metódicamente necesaria. &lt;br /&gt;&lt;br /&gt;Pues la poesía es recuerdo, cercanía del corazón al latir del tiempo que vive en los seres fugitivos, arrojados a un heraclíteo fluir, donde se gasta y se juega la vida, la nuestra, la única que al cabo enciende nuestros ojos, porque la amamos, porque la perdemos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-2258973612520172661?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/2258973612520172661/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-lucidez-del-poeta.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2258973612520172661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2258973612520172661'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-lucidez-del-poeta.html' title='La lucidez del poeta'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3574094391479392902</id><published>2010-01-27T10:57:00.004+01:00</published><updated>2010-01-27T11:22:01.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cultura libre'/><title type='text'>La música contemporánea también puede ser libre</title><content type='html'>No suelo aludir aquí a los sitios web de mis amigos, aunque a veces los cite o los enlace, con gran gusto por mi parte, todo hay que decirlo. Pero en este caso voy a hacer una excepción.&lt;br /&gt;&lt;br /&gt;Y haré la excepción no porque el amigo sea aquí un íntimo de toda la vida con el que tantas cosas se han compartido y se siguen compartiendo; ni siquiera por las muchísimas veces que hemos hablado, entre copa o copa, o paseo y paseo, de la necesidad de abrir también la cultura de la música contemporánea, tan enclaustrada, por desgracia, en las inaccesibles sedes de sus habituales lugares de manifestación. &lt;br /&gt;&lt;br /&gt;Haré la excepción precisamente porque con su gesto, con el gesto de mi amigo, esa cultura accede al lugar de todos para ser compartida, como era necesario. Y lo hace, quizá sea ello lo más significativo, de la mano del trabajo de un músico excepcional en muchos sentidos ---y creo que de esto entiendo lo suficiente como para no dejarme mover por subjetivos afectos.&lt;br /&gt;&lt;br /&gt;Espero que todos disfruten de la generosidad de mi amigo y que otros sepan tomar el guante sin dejarse llevar por tópicos trasnochados. He ahí el enlace:&lt;br /&gt;&lt;br /&gt;http://joseluistora.wordpress.com/&lt;br /&gt;&lt;br /&gt;Gracias, Jose&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3574094391479392902?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3574094391479392902/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-musica-contemporanea-tambien-puede.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3574094391479392902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3574094391479392902'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-musica-contemporanea-tambien-puede.html' title='La música contemporánea también puede ser libre'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1236650889435189078</id><published>2010-01-26T15:42:00.004+01:00</published><updated>2010-01-26T16:53:26.948+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>El dandi y el inquisidor</title><content type='html'>La carne está hecha de tiempo y de memoria. Por eso es ella la que, abierta en el tremor de su deseo, recibe la promesa de un futuro, el solo nuestro, donde seguir amando.&lt;br /&gt;&lt;br /&gt;Negar la carne es matar el tiempo que ella es, y matar el amor ---el único posible para el hombre--- que en ella se asienta y se construye. Pues no hay amor de los espíritus desasidos, no puede haberlo. Y si hubiera un reencuentro más allá de este tiempo, tendría que ser también el de los cuerpos, aun en su forma descompuesta, ceniza o polvo enamorado que, en su enamoramiento, retiene la totalidad de su ayer.&lt;br /&gt;&lt;br /&gt;Pero morir es fácil, amar es lo difícil. O, como diría el poeta, desde la sabiduría de su vejez:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;&lt;br /&gt;Contar la vida por los besos dados&lt;br /&gt;no es alegre. Pero más triste es darlos sin memoria.&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;Y porque es difícil el amor, la tentación es grande, la tentación de muerte, la más grande de todas: quemar la carne y su memoria en pos de una nívea pureza, donde ya nada accede más que el propio ojo paranoico, ante un espejo exento en que nada transcurre.&lt;br /&gt;&lt;br /&gt;El inquisidor de Aleixandre es, tal vez, la figura más inquietante y extrema de sus "Diálogos del conocimiento". Acaso la más inexplicable. ¿Pero lo es realmente?&lt;br /&gt;&lt;br /&gt;No veo a este inquisidor, que pretende salvar todo lo puro, matando la impureza de la carne, sino como un caso límite del &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2010/01/el-amador-y-el-dandi.html"&gt;dandi&lt;/a&gt;, al que ayer dediqué un comentario.&lt;br /&gt;&lt;br /&gt;Si el dandi descubre aún dentro de sí, y por debajo de su frialdad, el lejano calor de una rosa fugitiva, el inquisidor, congelado hasta sus entrañas, se arriesga por entero a una voraz simplicidad, terapia final para una soledad sin mácula en que descansar definitivamente.&lt;br /&gt;&lt;br /&gt;Porque es, ciertamente, la impureza que todavía en el dandi persiste, esa complejidad que un sentimiento de afecto añade, allí donde no debiera haber ya afecto alguno, lo que el inquisidor se niega violentamente a soportar. Él es, pues, el corolario del dandi, su implacable consecuencia, la del que anhela sacrificar el último residuo de su incongruencia en el altar de una pureza glacial, hialina.&lt;br /&gt;&lt;br /&gt;El inquisidor sería, entonces, el brote paranoico del dandi, su paroxismo, el que completa el puzle de su experiencia a base de suprimir toda esa ambigüedad que un resto de amor implica, a base de concentrarse en los puros hechos, que, desprovistos de todo contenido afectivo, resultan, ahora sí, susceptibles de cuadrar en perfecta y lógica coherencia ante el espejo de un presente absoluto, donde la carne se extingue sin dejar huella, y la memoria y la nostalgia y la desesperación enmudecen para siempre:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;&lt;br /&gt;En el espejo gélidas&lt;br /&gt;miro otras luces, brillo&lt;br /&gt;de ese cristal sin curso,&lt;br /&gt;y sé: su frío es vida.&lt;br /&gt;Sólo un reflejo o mano&lt;br /&gt;mortal, que vida otorga.&lt;br /&gt;Y sé. Quien calla, escucha.&lt;br /&gt;¡Pero todos se abrasen!&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1236650889435189078?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1236650889435189078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/el-dandi-y-el-inquisidor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1236650889435189078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1236650889435189078'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/el-dandi-y-el-inquisidor.html' title='El dandi y el inquisidor'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3882491771010306345</id><published>2010-01-25T08:44:00.015+01:00</published><updated>2010-01-26T01:30:13.105+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>El amador y el dandi</title><content type='html'>Tradicionalmente se ha entendido que el amor tiene su doble: el odio. Pero odio y amor son diferentes. Ninguno de ellos es meramente la ausencia de su supuesto contrario. Ni siquiera se podría decir que son contrarios, acaso sólo en sus efectos.&lt;br /&gt;&lt;br /&gt;El amor requiere, para empezar ---y hablo sólo de lo que no son formas sucedáneas de amor--- del compromiso de los amantes. Sin amante, sin los amantes, no hay amor. El amor reside en los amantes y crea un mundo únicamente en torno de ellos, aunque pueda tener efectos sobre el resto, no necesariamente benefactores, piénsese, por ejemplo, en Romeo y Julieta, o en la razón por la que Hölderlin cantara:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;[Dios] nunca perdona&lt;br /&gt;que perturbéis la paz de los amantes.&lt;cite&gt;&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;El odio, a diferencia del amor, es de naturaleza vírica y ajeno a la actividad de sus operadores. El odio se instala, más bien, en la pasividad del que odia, allí donde todo resto de amor y compasión han desaparecido, para arrasarlo entero y reclamar toda su energía psíquica, que, desde ese momento, se concentra en el deseo de mal o muerte del ser odiado. Es probable que la mayor parte de las personas sea ajena, por fortuna, al verdadero sentimiento de odio, que no conoce misericordia ni perdón.&lt;br /&gt;&lt;br /&gt;El amor difícilmente es puro y simple, pues, en tanto constructor de un mundo, debe vérselas con la complejidad inherente a todo acto creativo. El odio, por su parte, es de una pureza y de una simplicidad demoledoras. Nada ambiguo hay. Todo en él es deseo de destrucción, de aniquilación.&lt;br /&gt;&lt;br /&gt;La aniquilación que el odio exige actúa también, y muy en especial, sobre quien la ejerce. El que odia se aniquila a sí mismo, al destruir en el otro el fundamento de su humanidad, premisa de todo odio en sentido propio.&lt;br /&gt;&lt;br /&gt;Esta divagación por las inhóspitas simas del odio era necesaria para comprender mejor un sentimiento aparentemente análogo por su carácter destructivo ---tanto para su objeto como para su sujeto---, pero mucho más afín al amor, quizá precisamente su opuesto, el que tradicionalmente debería haber sido considerado como tal. Me refiero a la frialdad afectiva extrema, a la anestesia de los afectos. &lt;br /&gt;&lt;br /&gt;Típico de este sentimiento es su carácter totalizador: todos caen en su red. En su formas extremas de manifestación, la frialdad se desentiende de los otros de manera bien distinta a lo que sucede en el odio. Más que aniquilados, los otros aparecen borrados, como bultos que no cuentan, molestos como máximo, pero indignos, por insignificantes, de la atención que tan fijamente sigue existiendo en todo odio.&lt;br /&gt;&lt;br /&gt;Formas de anestesia afectiva en grados más o menos altos son frecuentes en personas que han amado y que, a la vez, han sufrido más de lo que han podido soportar.&lt;br /&gt;&lt;br /&gt;La intensidad del dolor afectivo, como también sucede en el dolor físico, no es mensurable por medios objetivos. Tiendo, sin embargo, a pensar que lo soportable o insoportable de un dolor tiene que ver no tanto con su nivel de intensidad cuanto con su cualidad.&lt;br /&gt;&lt;br /&gt;Si bien las manifestaciones de esta frialdad extrema pueden ser escandalosas, máscaras de buena disposición y buen comportamiento son mucho más frecuentes. Así, la entrega extenuante a un trabajo solitario, que requiere rigor y grandes dosis de paciencia sostenida en el tiempo, puede ser también un síntoma de frialdad en personas no proclives por naturaleza a tales empresas. Más expresivamente, la figura del dandi, protegido por su traje y sus suaves maneras, habla bien de esa distancia ante todo lo que en su día afectara tan dolorosamente, todo lo que ahora quedaría borrado de la consideración emotiva tras la displicencia de un refinado cinismo.&lt;br /&gt;&lt;br /&gt;El último libro de &lt;a href="http://es.wikipedia.org/wiki/Vicente_Aleixandre"&gt;Vicente Aleixandre&lt;/a&gt;, cima, a mi entender, junto con "Poemas de la Consumación", de su obra poética, contiene, en el poema que lleva por título "Diálogo de los enajenados", una escalofriante exploración de esta clase de dandismo al que me estoy refiriendo. Los dos personajes del diálogo son el amador y el dandi. No podía ser menos; pues, como propongo, se trata de dos formas presentes en la vivencia amorosa: cuando se vive como posible, y cuando ya, por insoportable, deja de serlo. &lt;br /&gt;&lt;br /&gt;Creo que todos oscilamos o podemos oscilar a lo largo de la vida entre ambas variantes. Qué preponderancia tendrá cada una de ellas, dependerá seguramente del peso que en nuestra estructura anímica tenga cada momento de nuestra historia. &lt;br /&gt;&lt;br /&gt;También creo que esta oscilación se puede producir ---y quizá sea el caso más frecuente--- no en períodos de tiempo relativamente largos que se suceden uno a otro, sino como momentos diferenciados dentro de un mismo período de tiempo, de un hora en otra, de un día en otro...&lt;br /&gt;&lt;br /&gt;Oigamos un fragmento significativo del monólogo del dandi:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;&lt;br /&gt;[...] Yo me paseo con mi bastón tristísimo&lt;br /&gt;por la alameda última de mi ciudad sin paz.&lt;br /&gt;Bultos, más bultos. Sueño. Mi sonrisa no mata,&lt;br /&gt;pero sopla en los rostros y los borra. Pasad.&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;El fragmento y el poema al que pertenece merecería mucha mayor atención de la que yo he podido lograr en mis comentarios anteriores. Como todo fragmento poético contiene también bastante más de lo que un comentario pueda explorar. Sorprende, por ejemplo, el lirismo melancólico de los primeros dos versos. No parece encajar enteramente con la descripción del dandismo que he propuesto, donde la frialdad debería abarcarlo todo y donde, por ello, no resultaría apropiado ningún tipo de implicación afectiva. &lt;br /&gt;&lt;br /&gt;Quizá, y esto añade verdad a la posibilidad vital del dandismo, el dandi, el frío, el despegado de todo amor, no esté completamente desprovisto de afectos y, en particular, del sentimiento amoroso. Quizá el dandismo de carne y hueso consista primordialmente en un rechazo de todo lo que se arriesga en el trato con los otros, de una desesperanza o recelo definitivo respecto de los amores concretos, de las relaciones que se establecen entre las personas, los bultos que no cuentan. &lt;br /&gt;&lt;br /&gt;Pero el dandi aún mantiene su amor, de una forma depuradísima dentro de sí y sólo para sí, en el olor de una flor, por ejemplo, como se expresa en otro momento del poema, pero ya no en el beso, residuo de un engaño "burgués" ---se dice también allí---, donde falta la terrible lucidez que se obtiene al comprender la falacia de todo amor humano. En este sentido, el dandismo sería una posibilidad, aún más radical y a la vez devastadora, de vivencia del amor, cuando el amor entre los hombres ya no se soporta, una más que habría que añadir a las consideradas al final de mi &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2010/01/cernunda-y-el-amor.html"&gt;comentario de hace unos días a una frase de Cernuda&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No quisiera terminar sin aludir &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2010/01/la-humildad-de-la-palabra-poetica.html"&gt;de nuevo&lt;/a&gt; a Hölderlin. En la casa de Tübingen donde el poeta suabo vivió "loco" durante casi cuarenta años hay un grafiti que nadie ha borrado ---al menos todavía estaba allí la última vez que la visité--- y en el que se lee: "Hölderlin no estaba loco". &lt;br /&gt;&lt;br /&gt;¿No podría ser que Hölderlin, el amador, tuviera que acudir, más o menos conscientemente, y bajo la máscara de un fingido Scardanelli, a una suerte de dandismo extremo, que le protegiera para siempre de todo su pasado y todo su futuro?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3882491771010306345?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3882491771010306345/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/el-amador-y-el-dandi.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3882491771010306345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3882491771010306345'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/el-amador-y-el-dandi.html' title='El amador y el dandi'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7210505317366569576</id><published>2010-01-21T14:36:00.006+01:00</published><updated>2010-01-25T01:26:53.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>La humildad de la palabra poética</title><content type='html'>Unos de los versos más famosos de &lt;a href="http://es.wikipedia.org/wiki/H%C3%B6lderlin"&gt;Friedrich Hölderlin&lt;/a&gt; dice así:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Was bleibt, stiften die Dichter&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;Que se traduce habitualmente como:&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Lo que perdura lo fundan los poetas&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;Tal vez sea cierto. &lt;br /&gt;&lt;br /&gt;Pero si la palabra es siempre la palabra del amor y vive de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2010/01/cernunda-y-el-amor.html"&gt;su misma tensión&lt;/a&gt;, la tensión entre deseo infinito y cumplimiento imposible, entre ella misma y su silencio; si la palabra es, pues, palabra que renuncia a la posesión y a la permanencia, la palabra es despedida y sólo su despedirse perdura.&lt;br /&gt;&lt;br /&gt;Porque el canto es también su propio fin, y, cuando el canto termina, cumple paradójicamente su destino. Pues sólo en su acabarse completa su verdad, la verdad de estar hecho, también él, de la misma materia que el cantor. Por eso, el canto verdadero suscita la melancolía, porque en cada una de sus irrepetibles entonaciones muere, para no regresar, como todo aquello que canta, como las mismas lágrimas que dejase en nosotros, los que cantamos, los que escuchamos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7210505317366569576?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7210505317366569576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-humildad-de-la-palabra-poetica.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7210505317366569576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7210505317366569576'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/la-humildad-de-la-palabra-poetica.html' title='La humildad de la palabra poética'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5709659251917212839</id><published>2010-01-21T10:42:00.006+01:00</published><updated>2010-01-21T16:46:06.949+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones poéticas'/><title type='text'>Cernunda y el amor</title><content type='html'>&lt;a href="http://es.wikipedia.org/wiki/Luis_Cernuda"&gt;Luis Cernuda&lt;/a&gt; escribía lo siguiente en su 'Historial de un libro':&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Son necesarios [...] algunos años [...] para aprender, en amor, a regir la parte de egoísmo que, no del todo conscientemente, arriesgamos en él.&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Esta sentencia me pareció enigmática en mi adolescencia y en mi primera juventud. Con los años ---los años de los que habla Cernuda---, creo entenderla, a pesar de las discrepancias que en cuestiones de amor pudiera tener con el poeta sevillano.&lt;br /&gt;&lt;br /&gt;La parte de egoísmo se deja gobernar precisamente porque, pese a lo que diría Freud, no es completamente inconsciente. Parece, pues, cuestión de proponérselo en alguna medida. ¿En qué medida?&lt;br /&gt;&lt;br /&gt;Lo agudo de la reflexión cernudiana radica en que presupone sin más algo que seguramente poca gente estaría dispuesta a aceptar, a saber, que en todo amor hay implicada, querámoslo o no, sepámoslo o no, una parte de egoísmo.&lt;br /&gt;&lt;br /&gt;Egoísmo aquí es otro nombre para referirse a una íntima e inexcusable necesidad. Esta necesidad es el signo o síntoma de una precariedad sustantiva. Y esta precariedad, a su vez, es la otra cara del afán de plenitud en que consiste el hombre. Así pues, nuevamente, Deseo frente a Realidad.&lt;br /&gt;&lt;br /&gt;Sin sabiduría ---en el sentido griego del término---, este deseo de plenitud se lanza ciegamente sobre el cuerpo amado, en la absurda esperanza de que este cuerpo lo colmará para siempre. Lo absurdo de esta esperanza radica en que ella, por característica esencial de la existencia "mortal" ---como dirían, de nuevo, los griegos--- no tiene cumplimiento, no puede tenerlo, pues todo cuerpo está transido de tiempo, de finitud, de contingencia.&lt;br /&gt;&lt;br /&gt;Este amor, que no es sabio ni quiere serlo, deviene entonces, en su continuo desacierto, amor posesivo en todas sus múltiples manifestaciones, de las cuales los celos es la más conspicua, aunque no la única ---inolvidable en este sentido la película &lt;a href="http://www.imdb.com/title/tt0045361/"&gt;Él&lt;/a&gt; de &lt;a href="http://es.wikipedia.org/wiki/Luis_Bu%C3%B1uel"&gt;Luis Buñuel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cuando el egoísmo se ignora ---se quiere ignorar--- lo que se arriesga, ante todo, es la humanidad del hombre, en particular, su propio deseo de plenitud, que, al verse inevitablemente defraudado, se pierde en los escombros del fracaso amoroso.&lt;br /&gt;&lt;br /&gt;Regir el egoísmo presente en todo amor no sería, pues, sino comprender desde las entrañas esta esencia del hombre ---no valdría, por supuesto, que la comprensión fuese meramente racional. &lt;br /&gt;&lt;br /&gt;¿Pero es posible no renunciar al amor y aceptar su limitación intrínseca? No puedo imaginar más que dos formas humanamente practicables de hacerlo, ambas obviamente dolorosas, pues que se asientan precisamente en esa tensión entre Realidad y Deseo.&lt;br /&gt;&lt;br /&gt;La primera es la "solución" de Cernuda, y de otros, ---pienso, por ejemplo, en el "amor intransitivo" de &lt;a href="http://es.wikipedia.org/wiki/Rilke"&gt;Rilke&lt;/a&gt;---, solución de clara raigambre platónica: convertir al ser amado, al cuerpo amado, en "pretexto" consciente del amante, acicate de su deseo, que se proyectaría, a través y por medio del amado, en aquello inaccesible a que apunta. El deseo mismo es aquí, en cierto modo, el objeto del amor. Amor, pues, que es básicamente narcisista, y al que cabe dedicar un vida. Cernuda, como es sabido, dedicó "La Realidad y el Deseo" precisamente a su solo deseo.&lt;br /&gt;&lt;br /&gt;Los peligros de convertir al otro en mero medio, de instrumentalizarlo, resultan evidentes en este tipo de soluciones.&lt;br /&gt;&lt;br /&gt;La otra alternativa es, si cabe, más dolorosa para los amantes, que ahora, sin embargo, estarían en igualdad de condiciones. Consistiría en compartir la nostalgia que emana de la experiencia de un amor que se sabe finito, inexorablemente fugaz e incompleto, especialmente allí donde el amor es mayor y más profundamente parece y quiere consumarse. Vivir el amor, pues, como una despedida, que, en el más maravilloso de los casos, dura toda una vida, ese breve tránsito que es el hombre.&lt;br /&gt;&lt;br /&gt;La poesía no sólo puede decir mucho en este asunto, sino que además está embargada por él enteramente. ¿Acaso no es la tensión extrema entre la palabra y lo indecible a que apunta la misma tensión que vibra en todo amor?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5709659251917212839?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5709659251917212839/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/cernunda-y-el-amor.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5709659251917212839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5709659251917212839'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2010/01/cernunda-y-el-amor.html' title='Cernunda y el amor'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4436718388095117070</id><published>2009-10-02T11:59:00.009+02:00</published><updated>2009-10-07T00:10:02.712+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>Los abundantes rizos de HAL</title><content type='html'>De las cuatro partes en que se dividía &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/09/hal-tambien-escanea.html#problema"&gt;nuestro problema inicial&lt;/a&gt; queda la última, la de concatenar los pdfs generados por cada página del libro en un único pdf allí donde la obra escaneada consta de varias páginas. Tampoco esta tarea reviste dificultad especial. La herramienta adecuada a esta fin es, como comentamos entonces, &lt;code&gt;pdftk&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Un rápido vistazo por la página de manual de &lt;code&gt;pdftk&lt;/code&gt; nos da la solución. Pongamos, por ejemplo, que queremos obtener un único pdf, con el nombre &lt;code&gt;Dowland_The-Frog-Galliard.pdf&lt;/code&gt; a partir de estos tres:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Dowland_The-Frog-Galliard_1.pdf&lt;br /&gt;Dowland_The-Frog-Galliard_2.pdf&lt;br /&gt;Dowland_The-Frog-Galliard_3.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La operación se realiza con la siguiente instrucción, que asume que en nuestro directorio de hojas escaneadas no hay otra cosa que pdfs ---se recordará que el guión &lt;code&gt;escanear-a-pdf&lt;/code&gt;, diseñado en el artículo anterior, suprimía debidamente los ficheros del mismo nombre que no fueran pdfs:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pdftk Dowland_The-Frog-Galliard_* cat output Dowland_The-Frog-Galliard.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con esta expresión pedimos a &lt;code&gt;pdftk&lt;/code&gt; que tome como entrada todos los ficheros que empiezan por &lt;code&gt;Dowland_The-Frog-Galliard_&lt;/code&gt; (por tanto, todas las páginas correspondientes a esta obra de Dowland), los concatene (&lt;code&gt;cat&lt;/code&gt;) y produzca como resultado (&lt;code&gt;output&lt;/code&gt;) el fichero &lt;code&gt;Dowland_The-Frog-Galliard.pdf&lt;/code&gt;. (Es importante destacar que &lt;code&gt;pdftk&lt;/code&gt; acepta varios pdfs como entrada y que podemos referirnos a un conjunto de ellos mediante el comodín '&lt;code&gt;*&lt;/code&gt;'. Este tipo de abreviatura, que hemos visto de pasada en alguna otra ocasión, resulta de enorme utilidad cuando el objetivo es ejecutar operaciones para un conjunto de ficheros cuyos elementos no pueden especificarse completamente &lt;em&gt;a priori&lt;/em&gt;. De hecho, la solución que veremos a continuación aprovecha plenamente esta característica de la lengua de HAL.)&lt;br /&gt;&lt;br /&gt;El artículo y la conversación podrían terminar aquí, si no fuera porque el lector ya no es un usuario principiante de la consola y porque no debería conformarse sino con una solución general y automática para todos los casos posibles.&lt;br /&gt;&lt;br /&gt;Una solución automática no podemos obtenerla para la primera tarea, más allá, de donde lo hemos logrado. Es decir, no es practicable producir un pdf para toda hoja del libro o, lo que es lo mismo, dejar el libro en el escáner y regresar a las tres horas para apagar el aparato con la certeza de que éste habrá digitalizado todas sus páginas. Aquí, naturalmente, hay un límite físico, pues no disponemos del hardware que sea capaz de tal hazaña. Aunque existen &lt;a href="http://en.wikipedia.org/wiki/Robotic_book_scanner"&gt;robots que escanean libros&lt;/a&gt; ---que pasan las hojas por sí solos antes de escanearlas--- su precio está muy por encima de nuestro presupuesto, y plantearse construir uno supera nuestra destreza ingenieril. No queda más remedio que realizar a mano la tarea de selección de la hoja, de su ubicación en el escáner y de su procesamiento mediante nuestro guión &lt;code&gt;escanear-a-pdf&lt;/code&gt;. Pero el límite físico desaparece en el mismo momento en que HAL está en posesión de todos los ficheros digitales necesarios. Ahí ya no tenemos disculpa.&lt;br /&gt;&lt;br /&gt;Imaginemos, por ejemplo, que tras una sesión de escaneo, hemos obtenido los siguientes ficheros correspondientes a las páginas de dos obras de Dowland:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Dowland_The-Frog-Galliard_1.pdf&lt;br /&gt;Dowland_The-Frog-Galliard_2.pdf&lt;br /&gt;Dowland_The-Frog-Galliard_3.pdf&lt;br /&gt;Dowland_A-Fancy_1.pdf&lt;br /&gt;Dowland_A-Fancy_2.pdf&lt;br /&gt;Dowland_A-Fancy_3.pdf&lt;br /&gt;Dowland_A-Fancy_4.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que, naturalmente, desearíamos es que HAL ejecutase, sin nuestra intervención, estas dos instrucciones:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pdftk Dowland_The-Frog-Galliard_* cat output Dowland_The-Frog-Galliard.pdf&lt;br /&gt;pdftk Dowland_A-Fancy_* cat output Dowland_Fantasia.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La cosa no parece difícil. Tenemos en general un enunciado con esta forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pdftk &lt;em&gt;obra&lt;/em&gt;_* cat output &lt;em&gt;obra&lt;/em&gt;.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;donde el texto en cursiva corresponde a una variable ---un pronombre, si se quiere aplicar la metáfora lingüística--- que estará en cada caso por el nombre de la obra correspondiente.&lt;br /&gt;&lt;br /&gt;Podemos pergeñar, sin rebanarnos los sesos, un procedimiento para manejar esta clase de situación, lo hemos hecho en otros momentos. Podríamos seguir, por ejemplo, la siguiente estrategia:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Diseñar una instrucción que lea todos los ficheros del directorio que contiene las hojas escaneadas y extraiga el nombre de cada obra distinta.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Crear una variable, digamos, la variable &lt;code&gt;OBRAS&lt;/code&gt;, y asignarle como valor los nombres de obras producidos en la instrucción anterior.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Recorrer cada nombre almacenado en la variable &lt;code&gt;OBRAS&lt;/code&gt; y ejecutar para cada uno de ellos la instrucción &lt;code&gt;pdftk&lt;/code&gt; propuesta antes.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Si aplicamos las herramientas de manipulación de ficheros y flujos de texto conocidas de anteriores conversaciones, podemos llegar a diseñar una instrucción de extracción como la que se indica en el primer paso de nuestro proceso. Podríamos, por ejemplo, construir por medio de tuberías, una instrucción, cada una de cuyas secciones realizase estas operaciones:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Listar todos los ficheros del directorio que contiene las hojas escaneadas en pdf.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Seleccionar de la lista las hojas que constituyen páginas de una misma obra, o sea, aquellas que terminen con un número (el número de página). Nótese que puede haber nombres de fichero sin número al final, que corresponderían a las obras formadas por una sola hoja o página.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Extraer de esos nombres de fichero la parte relativa al nombre de la obra, esto es, el nombre del fichero sin el número de página.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Eliminar las repeticiones en la lista obtenida en los pasos anteriores.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Una instrucción como la siguiente refleja esta serie de manipulaciones:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ls | grep -E '.*_[[:digit:]]+.pdf' | cut -d'_' -f1,2 | sort -u&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Va de suyo que la instrucción funciona ---en concreto, el &lt;code&gt;grep&lt;/code&gt; y el &lt;code&gt;cut&lt;/code&gt;---, porque asumimos un determinado formato para el nombre de nuestros ficheros, a saber:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;autor_nombre-de-obra_página.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Gracias a él, el patrón de expresión regular para &lt;code&gt;grep&lt;/code&gt; puede contar con que el número de página, de haberlo, está justo antes de la especificación de extensión y después del resto del nombre del fichero. Asimismo &lt;code&gt;cut&lt;/code&gt; puede utilizar el carácter '&lt;code&gt;_&lt;/code&gt;' como delimitador de campos y devolver los campos primero y segundo del nombre del fichero proporcionado como entrada ---o sea, los que contienen el nombre del autor y de la obra, sin número de página (campo tercero)---, y que identifican exhaustivamente el nombre de la obra del caso.&lt;br /&gt;&lt;br /&gt;En general, y cuando se trata de manipular nombres de ficheros, conviene siempre establecer un formato uniforme fácilmente manipulable por las herramientas habituales con las que contamos. Esto nos librará de un montón de quebraderos de cabeza.&lt;br /&gt;&lt;br /&gt;Asignar el resultado de esta instrucción a la variable &lt;code&gt;OBRAS&lt;/code&gt; es trivial. De hecho, sabemos ya que tanto la instrucción anterior como la asignación se pueden realizar en un único paso, por medio de la sustitución de órdenes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;OBRAS=$(ls | grep -E '.*_[[:digit:]]+.pdf' | cut -d'_' -f1,2 | sort -u)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que resta es recorrer el contenido de la variable &lt;code&gt;OBRAS&lt;/code&gt;. Tras la operación anterior dicha variable será una lista de los nombres de obras que constan de varias páginas. Nada mejor, pues, que nuestro conocido &lt;code&gt;for&lt;/code&gt; para aplicar sobre cada miembro de esa lista la operación de concatenación de pdfs sugerida al principio:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for obra in $OBRAS&lt;br /&gt;do&lt;br /&gt;  pdftk ${obra}_* cat output ${obra}.pdf&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es fácil tratar de sacar más partido del &lt;code&gt;for&lt;/code&gt; y, por ejemplo, eliminar las páginas independientes, una vez producida la partitura completa, o, incluso, guardar en un fichero de registro referencia de las obras procesadas y del número de páginas de las que consta cada una de ellas. El guión completo, con estos añadidos y comentarios al código, sería el siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Lista de las obras que contienen varias páginas. El formato de&lt;br /&gt;# fichero de cada página es autor_titulo-de-la-obra_&amp;lt;n&amp;gt;, donde &amp;lt;n&amp;gt;&lt;br /&gt;# es el número de página&lt;br /&gt;OBRAS=$(ls | grep -E '.*_[[:digit:]].pdf' | cut -d'_' -f1,2 | sort -u)&lt;br /&gt;&lt;br /&gt;for obra in $OBRAS&lt;br /&gt;do&lt;br /&gt;  # número de páginas de la obra procesada&lt;br /&gt;  npags=$(ls ${obra}_* | wc -l)&lt;br /&gt;  # concatena las páginas de la obra&lt;br /&gt;  pdftk ${obra}_* cat output ${obra}.pdf&lt;br /&gt;  # elimina las páginas sueltas&lt;br /&gt;  rm ${score}_*&lt;br /&gt;  # añade una línea de registro&lt;br /&gt;  echo "$obra: $npags páginas" &gt;&gt; pdftk_log&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como se ve, tareas cuya automatización podría resultar intratable con herramientas gráficas superpotentes, se resuelven en pocos pasos a través de la humilde consola.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4436718388095117070?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4436718388095117070/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/10/los-abundantes-rizos-de-hal.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4436718388095117070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4436718388095117070'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/10/los-abundantes-rizos-de-hal.html' title='Los abundantes rizos de HAL'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-6251536355400676370</id><published>2009-10-01T10:59:00.004+02:00</published><updated>2009-10-01T17:23:04.141+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL también escanea (II)</title><content type='html'>Provistos de las herramientas adecuadas y consultadas someramente sus respectivas páginas de manual, construir el esquema de nuestro guión para escanear cada página y obtener un pdf ajustado a nuestros intereses es trivial [En cursiva se presentan el nombre del fichero que corresponde a la página escaneada; con rojo y verde indicamos, respectivamente, los ficheros de entrada y de salida implicados en cada parte del proceso]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scanimage &gt; &lt;em style="color:green"&gt;fichero&lt;/em&gt;&lt;br /&gt;unpaper &lt;em style="color:red"&gt;fichero&lt;/em&gt; &lt;em style="color:green"&gt;fichero.pbm&lt;/em&gt;&lt;br /&gt;convert &lt;em style="color:red"&gt;fichero.pbm&lt;/em&gt; &lt;em style="color:green"&gt;fichero.pdf&lt;/em&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se observará que en la primera instrucción hemos omitido la extensión del tipo de fichero (&lt;code&gt;pbm&lt;/code&gt;) por mera cuestión de conveniencia. Como sabemos que el fichero es un &lt;code&gt;pbm&lt;/code&gt; y, puesto que &lt;code&gt;unpaper&lt;/code&gt; producirá también un &lt;code&gt;pbm&lt;/code&gt;, evitamos algo más prolijo como:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scanimage &gt; &lt;em style="color:green"&gt;fichero-version-inicial.pbm&lt;/em&gt;&lt;br /&gt;unpaper &lt;em style="color:red"&gt;fichero-version-inicial.pmb&lt;/em&gt; &lt;em style="color:green"&gt;fichero-version-retocada.pbm&lt;/em&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Este esquema se puede enriquecer con opciones adecuadas para cada una de las instrucciones que lo componen:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scanimage --resolution 600dpi --mode Lineart --progress &gt; &lt;em style="color:green"&gt;fichero&lt;/em&gt;&lt;br /&gt;unpaper --size a4 &lt;em style="color:red"&gt;fichero&lt;/em&gt; &lt;em style="color:green"&gt;fichero.pbm&lt;/em&gt;&lt;br /&gt;convert -compress Group4 &lt;em style="color:red"&gt;fichero.pbm&lt;/em&gt; &lt;em style="color:green"&gt;fichero.pdf&lt;/em&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las opciones de &lt;code&gt;scanimage&lt;/code&gt; tienen el siguiente significado:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;--resolution 600dpi&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Define la resolución que tendrá la imagen resultante. En nuestro caso 600 puntos por pulgada, una resolución bastante alta. Resoluciones inferiores como 300dpi suelen ser suficientes y tienen la ventaja de acelerar la duración del proceso físico del escaneo.&lt;/dd&gt; &lt;br /&gt;&lt;dt&gt;&lt;code&gt;--mode Lineart&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Determina la sensibilidad del escáner a las diferencias de matiz o color. En este caso interesa considerar sólo las diferencias entre blancos y negros (modo &lt;em&gt;Lineart&lt;/em&gt;), la opción común en páginas de libros convencionales.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;--progress&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Presenta en la consola o terminal una barra visual del progreso del proceso físico del escaneo.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Por su parte, la opción de &lt;code&gt;unpaper&lt;/code&gt; es comprensible de suyo:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;--size a4&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Retoca el fichero dado como primer argumento para que se adapte a las dimensiones de un tamaño a4. &lt;code&gt;unpaper&lt;/code&gt; es un programa sofisticado con un buen número de opciones, aquí nos limitamos a un uso muy básico.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Finalmente, en cuanto a &lt;code&gt;convert&lt;/code&gt; tenemos la siguiente opción:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;-compress Group4&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Determina el algoritmo de compresión que se aplicará en la conversión. Con este algoritmo conseguimos, por ejemplo, que el pdf de una página de nuestro libro ronde los 100k sin apenas pérdida de calidad. Dicho sea de paso, &lt;em&gt;Imagemagick&lt;/em&gt;, que es la herramienta general a la que pertenece &lt;code&gt;convert&lt;/code&gt;, es una utilidad tremendamente especializada y eficaz en el tratamiento de imágenes. [Más información en &lt;a href="http://www.imagemagick.org"&gt;http://www.imagemagick.org&lt;/a&gt;].&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Definida la sucesión de instrucciones que constituye el proceso completo de transformación de la página del libro en un fichero pdf, queda construir un guión que pueda aplicarse a cualquier página en general. No es algo distinto de lo que ya hemos hecho en otras ocasiones (ver, en particular, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/mas-variables-para-hal.html"&gt;este artículo&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Por tanto, se trata de añadir lo que sea necesario para poder pedirle a HAL algo como esto:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./escanear-a-pdf Dowland_The-Frog-Galliard_1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;donde &lt;code&gt;Dowland_The-Forg-Galliard-1&lt;/code&gt; es el nombre del fichero (sin la extensión &lt;code&gt;.pdf&lt;/code&gt;) que alojará el pdf de la hoja del libro correspondiente a la primera página de la pieza de Dowland titulada &lt;em&gt;The Frog Galliard&lt;/em&gt;, y donde, por descontado, &lt;code&gt;escanear-a-pdf&lt;/code&gt; es el nombre de la instrucción o guión que vamos a diseñar.&lt;br /&gt;&lt;br /&gt;El artículo citado antes nos da la pista necesaria para que sea cosa de niños la generalización que deseamos. Basta, como se ve, con sustituir la variable escrita anteriormente con el nombre &lt;em&gt;&lt;code&gt;fichero&lt;/code&gt;&lt;/em&gt; por un &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/mas-variables-para-hal.html#parametro-posicional"&gt;parámetro posicional&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scanimage --resolution 600dpi --mode Lineart --progress &gt; "$1"&lt;br /&gt;unpaper --size a4 "$1" "$1".pbm&lt;br /&gt;convert -compress Group4 "$1".pbm "$1".pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Las comillas que rodean al parámetro posicional ---&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/sutilezas-de-hal.html"&gt;se recordará&lt;/a&gt;--- sirven para evitar problemas cuando el nombre de fichero elegido contiene espacios.)&lt;br /&gt;&lt;br /&gt;Podemos, ya que estamos, incluir al final una instrucción de limpieza que elimine los ficheros intermedios:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scanimage --resolution 600dpi --mode Lineart --progress &gt; "$1"&lt;br /&gt;unpaper --size a4 "$1" "$1".pbm&lt;br /&gt;convert -compress Group4 "$1".pbm "$1".pdf&lt;br /&gt;rm "$1" "$1".pbm&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con todo ello estamos en condiciones de producir los pdfs deseados de cuantas páginas del libro vayamos a escanear, por ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./escanear-a-pdf Dowland_The-Frog-Galliard-1&lt;br /&gt;./escanear-a-pdf Dowland_The-Frog-Galliard-2&lt;br /&gt;./escanear-a-pdf Dowland_The-Rrog-Galliard-3&lt;br /&gt;./escanear-a-pdf Dowland_Fantasía-1&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como decíamos, cosa de niños.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-6251536355400676370?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/6251536355400676370/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/10/hal-tambien-escanea-ii.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6251536355400676370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6251536355400676370'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/10/hal-tambien-escanea-ii.html' title='HAL también escanea (II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5868371418528360348</id><published>2009-09-30T16:17:00.009+02:00</published><updated>2009-10-04T18:24:05.999+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL también escanea</title><content type='html'>No hace mucho ;-) dejamos a nuestro HAL entregado a sus tareas rutinarias ---el sueño también forma parte de ellas---, mientras nosotros nos tomábamos unas largas vacaciones. Y es que la inmersión realizada el año pasado fue tan acelerada que había que salir a flote como fuera. Mejor retomar el hilo con algo más de moderación y de iniciar nuevas conversaciones sólo cuando la ocasión lo pida o lo permita, es decir, sin horario ni planificación prefijada.&lt;br /&gt;&lt;br /&gt;Una ocasión de este tipo le ha surgido al autor hace poco, y lo que de ella se sigue será útil para completar lo que ya vimos sobre &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-ix-repeticiones.html"&gt;repeticiones y bucles&lt;/a&gt;, aparte de para seguir demostrando con un caso real la multiplicidad de posibles aplicaciones de la lengua de HAL a nuestras tareas habituales.&lt;br /&gt;&lt;br /&gt;Se recordará que la instrucción &lt;code&gt;for&lt;/code&gt; nos sirvió entonces para ordenar a HAL que recorriese las líneas de un fichero y aplicase un mismo bloque de instrucciones a cada una de ellas. En la siguiente conversación veremos un uso semejante, probablemente más frecuente, de &lt;code&gt;for&lt;/code&gt;, en el que las unidades textuales recorridas no son líneas de ficheros, sino nombres de fichero.&lt;br /&gt;&lt;br /&gt;&lt;span style=text-decoration:line-through&gt;Aunque ésta es probablemente la forma más frecuente de realizar tareas repetitivas en la lengua de HAL, es decir, la de recorrer unidades textuales (sean, por ejemplo, las líneas de un fichero o los nombres de una serie de nombres de fichero), hay situaciones en que es más práctico, más fácil o, simplemente, más del gusto del usuario, repetir una serie de instrucciones &lt;em&gt;un número determinado de veces&lt;/em&gt;. Y esto es justo lo que vamos a tratar de conseguir en la conversación que hoy iniciamos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dedicaremos este primer artículo a especificar la tarea que motivó la conversación y la forma en que puede diseñarse un procedimiento para ejecutarla. De paso, aprenderemos a escanear un documento sin salir de la consola, cosa que quizá muchos, acostumbrados a las aplicaciones gráficas, consideren poco menos que magia negra. Aunque ---todo hay que decirlo--- esta clase de sortilegios, lanzados desde la negra interfaz de la consola, es algo a lo que deberíamos ya estar acostumbrados a estas alturas de nuestras charlas.&lt;br /&gt;&lt;br /&gt;La tarea que nos proponemos realizar es la siguiente. Contamos con un libro voluminoso que contiene la obra completa de obras para laúd solo del gran compositor renacentista John Dowland y necesitamos extraer de él unas cuantas piezas que quepan fácil y livianamente en nuestro atril. Nos interesa, en particular, generar un fichero pdf para cada una de esas piezas.&lt;br /&gt;&lt;br /&gt;Resulta evidente que aquí nos enfrentamos a dos problemas diferentes, en primer lugar, el de escanear las correspondientes páginas del libro y, en segundo lugar, el de generar tantos pdfs como obras queremos extraer. Nótese, en especial, que puede haber obras que consten de una sola página y obras que consten de varias páginas, y que lo que pretendemos es producir un pdf por obra y no por página.&lt;br /&gt;&lt;br /&gt;Además, y puesto que sabemos ---el autor lo sabe, el lector debe asumirlo como presupuesto--- que HAL es capaz generar eficazmente un pdf por obra si cuenta con un pdf por página, el primero de los problemas se bifurca, a su vez, en otros dos, el del escaneo propiamente dicho y el de la conversión en pdf del resultado de dicho escaneo.&lt;br /&gt;&lt;br /&gt;Hay que añadir, además, que, a causa tanto del tamaño del libro como de sus características físicas, será necesario retocar la imagen inicialmente escaneada para que el pdf que resulte de su conversión se adecue mejor a su posterior impresión en papel A4.&lt;br /&gt;&lt;br /&gt;Por tanto, nuestro problema completo constará, al menos, de las siguientes partes:&lt;br /&gt;&lt;ol id="problema"&gt;&lt;br /&gt;&lt;li&gt;Escanear las páginas del libro.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Retocar el resultado como convenga.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Convertir los ficheros resultantes en pdfs.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unir en un único pdf los ficheros de cada página, cuando la obra conste de varias.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Podemos ser todavía más precisos si tenemos en cuenta las especificidades del proceso de escaneo. En concreto, será necesario producir una imagen donde se tengan en cuenta sólo las diferencias entre blanco y negro (lo que se llama modo &lt;em&gt;Lineart&lt;/em&gt;) y no los tonos de grises o las divergencias de colores, que en nuestro libro no existen. Esto producirá un formato de imagen &lt;a href="http://en.wikipedia.org/wiki/Netpbm_format"&gt;pbm&lt;/a&gt;. Este tipo de fichero es que el que tendremos que retocar y convertir a pdf, antes de pasar a la concatenación de los diversos pdfs. Podríamos, pues, plantear un esquema de las operaciones implicadas y los datos que se procesan dentro de ellas [Por cada página se presenta la serie de procesos por la que atravesará y los formatos de ficheros resultantes]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    /-------\ pbm /-------\ pbm /----------\ pdf   &lt;br /&gt;P1-&gt;|escaneo|----&gt;|retoque|----&gt;|conversión|-----\&lt;br /&gt;    \-------/     \-------/     \----------/     |&lt;br /&gt;                                                 |&lt;br /&gt;    /-------\ pbm /-------\ pbm /----------\ pdf |    /-------------\&lt;br /&gt;P2-&gt;|escaneo|----&gt;|retoque|----&gt;|conversión|-----|---&gt;|concatenación|-&gt;pdf&lt;br /&gt;    \-------/     \-------/     \----------/     |    \-------------/&lt;br /&gt;                                                 |&lt;br /&gt;    /-------\ pbm /-------\ pbm /----------\ pdf | &lt;br /&gt;Pn-&gt;|escaneo|----&gt;|retoque|----&gt;|conversión|-----/&lt;br /&gt;    \-------/     \-------/     \----------/     &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una inmersión en las interioridades del sistema de paquetes de HAL  y de las páginas del manual ---cosas, ambas, que ya tratamos en la primera parte de esta serie--- nos permite descubrir de qué posibles herramientas disponemos. En concreto [señaladas bajo cada caja]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    /-------\ pbm /-------\ pbm /----------\ pdf /-------------\&lt;br /&gt;Pn-&gt;|escaneo|----&gt;|retoque|----&gt;|conversión|----&gt;|concatenación|-&gt;pdf&lt;br /&gt;    \-------/     \-------/     \----------/     \-------------/&lt;br /&gt;    scanimage      unpaper        convert            pdftk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Cada una de estas herramientas ---o, si se quiere, de estos ayudantes de HAL--- forma parte de un &lt;em&gt;paquete&lt;/em&gt;. A saber, en sistemas basados en Debian:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;scanimage&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;paquete &lt;code&gt;sane-utils&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;unpaper&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;paquete &lt;code&gt;unpaper&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;convert&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;paquete &lt;code&gt;imagemagick&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;pdftk&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;paquete &lt;code&gt;pdftk&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;En los próximos días nos las apañaremos para construir un par de guiones que generen pdfs a partir de las páginas escaneadas y que procedan, en su caso, a su posterior concatenación. Será con la venia de estos bien predispuestos ayudantes.&lt;br /&gt;&lt;br /&gt;HAL está esperando :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5868371418528360348?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5868371418528360348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/09/hal-tambien-escanea.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5868371418528360348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5868371418528360348'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/09/hal-tambien-escanea.html' title='HAL también escanea'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7388731747198217661</id><published>2009-09-02T00:42:00.005+02:00</published><updated>2009-09-04T00:36:31.926+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reseñas de libros'/><category scheme='http://www.blogger.com/atom/ns#' term='Educación'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones tecnológicas'/><title type='text'>Stroustrup y la enseñanza de la programación ...</title><content type='html'>... o la ciencia de la vida.&lt;br /&gt;&lt;br /&gt;Sí, tal rimbombante extensión del título de esta entrada ha pasado por mi cabeza, aunque la he omitido no tanto por pretenciosa, que lo es, cuanto por evitar una cabecera demasiado larga para Blogger.&lt;br /&gt;&lt;br /&gt;¿A qué viene este embrollo? La cosa es que durante algunos días de este verano y, aprovechando, cómo no, el tan preciado descanso, me ha dado por hincar ligeramente el diente al nuevo libro del maestro Bjarne Stroustrup. Para quien no sepa quién es Stroustrup, baste decir que no sólo es el creador del lenguaje de programación C++, sino seguramente una de las personalidades más valoradas del mundillo de la informática.&lt;br /&gt;&lt;br /&gt;Pues bien, resulta que Stroustrup ha sacado tiempo, entre sus muchas dedicaciones y responsabilidades de experto, para escribir nada menos que una introducción a la programación, un buen tocho de más de 1000 páginas titulado &lt;a href="http://www.research.att.com/~bs/programming.html"&gt;Programming -- Principles and Practices using C++&lt;/a&gt;. No he leído más que la primera parte, algo más de unas 300 páginas espléndidas en más de un sentido.&lt;br /&gt;&lt;br /&gt;No es mi propósito hacer una reseña del libro ---por lo demás, imposible, dado que sólo he leído un fragmento---, ni siquiera una reseña de esta primera parte, que ya de por sí la merecería. Lo que, más bien, me interesa es reflexionar sobre mi experiencia al topar con sus capítulos sexto y séptimo (especialmente, el sexto).&lt;br /&gt;&lt;br /&gt;Téngase en cuenta que mi punto de vista no es sólo el del entusiasta en estos asuntos técnicos, ni siquiera el del propenso a encontrar placer en la didáctica &lt;em&gt;de la programación&lt;/em&gt;, sino más bien el de quien enseña algo, si bien de una índole en apariencia muy diferente. Porque, al cabo, el problema del aprendizaje va mucho más allá del objeto de la enseñanza, o sea, de la materia que se imparte, y se concentra, en particular ---si se me permite el juego de palabras, en su &lt;em&gt;objetivo&lt;/em&gt;; y éste, cuando se entiende en su mayor generalidad, es común probablemente, a todas las formas de aprendizaje.&lt;br /&gt;&lt;br /&gt;Pues bien, los capítulos en cuestión enseñan cosas como:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Diseño de una gramática abstracta para interpretar el input que procesará un programa de cálculo aritmético (una calculadora).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Implementación de esa misma gramática a través de funciones recursivas, mutuamente relacionadas.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Creación de tipos en C++ y manipulación del input a través de un tipo &lt;em&gt;stream&lt;/em&gt; creado por el usuario.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Sorprende, ciertamente, que un libro de introducción ponga sobre la mesa del aprendiz una tarea de esta complejidad a unas pocas páginas de distancia de su presupuesta total ignorancia sobre la programación. Es evidente, sin duda, que Stroustrup trata a sus alumnos como adultos capaces de asumir retos difíciles desde el primer momento.&lt;br /&gt;&lt;br /&gt;Pero lo verdaderamente sorprendente es la forma como Stroustrup plantea el ataque a este problema de programación, el diseño e implementación de una calculadora. Muchos se quedarán en la superficie y verán tan sólo un caso más ---no muy frecuente, por cierto, en textos introductorios--- de la práctica de un diseño e implementación incrementales. Pero la cosa, a mi modo de ver va más allá. &lt;br /&gt;&lt;br /&gt;Hay algo en esas páginas que trasciende la cuestión relativa a conceptos y técnicas de programación. Dicho en pocas palabras, lo que Stroustrup una y otra vez trata de hacernos comprender es que el verdadero meollo de la programación no es otra cosa que el de pensar a fondo sobre un problema, el de acercarse, mientras hacemos el camino, a la naturaleza misma del problema inicial, cuyo sentido y complejidad se va haciendo cada vez más presente ---aunque, quizá, me atrevería a decir, nunca completa y enteramente presente---, gracias a nuestros ingenuos errores iniciales, a nuestros pasos en falso y a toda esa serie de tentativas aparentemente infructuosas y, sin embargo, imprescindibles, de las que consta todo proceso de investigación lanzado hacia lo nuevo, hacia lo desconocido.&lt;br /&gt;&lt;br /&gt;La excelencia del maestro se mide no por la cantidad o, incluso,  calidad de las cosas que enseña ---que también---, sino sobre todo porque nos hace comprender que el aprendizaje no termina nunca y que, nosotros, por muy arriba que estemos en nuestra destreza y conocimientos, somos esencialmente aprendices a la hora de enfrentarnos a nuevos retos ---los únicos que al cabo interesan---, esencialmente falibles, incorrectos, tentativos.&lt;br /&gt;&lt;br /&gt;No es diferente lo que los grandes maestros han venido enseñando desde los albores de nuestra civilización. Piénsese, por ejemplo, en el método platónico-socrático del &lt;em&gt;elenchos&lt;/em&gt; y la dialéctica; piénsese en el proceso de aprendizaje de cualquier artesanía compleja.&lt;br /&gt;&lt;br /&gt;... Y piénsese ---por qué no--- en las propias cuestiones de la vida, las que nos azoran de continuo, desconcertantes, irresueltas y, a un tiempo y por ello mismo, fascinantes.&lt;br /&gt;&lt;br /&gt;Mucho se gana ---diría, incluso, que todo se gana--- cuando se comprende que el experto no es nunca el infalible, sino el que asume con plena conciencia hasta qué punto el camino no es, ni debe ser, rectilíneo, sino más bien sinuoso, espiral incluso; y que, lejos de que ello suspenda el entusiasmo y el juicio, nos ata a la aventura del descubrimiento con la misma poderosa fuerza que el aprendiz siente en sus primeras andaduras.&lt;br /&gt;&lt;br /&gt;Gracias, maestro Stroustrup, por recordarlo, incluso allí donde el lego quizá esperase, basado en peligrosos lugares comunes, justamente lo contrario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7388731747198217661?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7388731747198217661/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/09/stroustrup-y-la-ensenanza-de-la.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7388731747198217661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7388731747198217661'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/09/stroustrup-y-la-ensenanza-de-la.html' title='Stroustrup y la enseñanza de la programación ...'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-711648034001236253</id><published>2009-07-01T01:47:00.002+02:00</published><updated>2009-07-01T02:20:58.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anécdotas'/><title type='text'>Ocultamientos y desvelamientos</title><content type='html'>Hoy he tenido que realizar una estúpida tarea que me ha llevado más tiempo del debido. La causa: la peligrosa simplificación de la realidad en aras de la facilidad y en perjuicio de la difícil sencillez de la verdad.&lt;br /&gt;&lt;br /&gt;El motivo ha sido el siguiente. Una amiga me ha pedido que le eche una mano con su iPod. El problema es que era incapaz de transferir las pistas desde su ordenador (con Linux) al iPod. Un problema no infrecuente a lo que parece, basta echar a vistazo a google.&lt;br /&gt;&lt;br /&gt;He probado con el, por otra parte, estupendo &lt;a href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt;. Amarok se limitaba a informar de que la transferencia no podía realizarse porque el sistema de ficheros del iPod estaba montado en modo de solo lectura. Nada se podía escribir en él. Lo primero, y casi lo único, que se tiende a pensar en una caso como éste es que hay algún problema con los permisos. Pero no había ningún problema ahí.&lt;br /&gt;&lt;br /&gt;Por suerte, se me ocurrió, después de otras investigaciones infructuosas, echar un vistazo a los mensajes del kernel tal como se generaban al montar el dispositivo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;dmesg | tail -f&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La verdad era diáfana y simple:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;hfs: Filesystem was not cleanly unmounted, running fsck.hfsplus is recommended.  mounting read-only.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mi amiga, a buen seguro, había desenchufado el iPod a lo bruto, cosa a la que seguramente ni siquiera había prestado atención. Y, claro, el sistema de ficheros estaba tan sucio que el bueno del kernel se negaba a dar permiso de escritura.&lt;br /&gt;&lt;br /&gt;Nótese hasta qué punto el mensaje del kernel es significativo. No sólo presenta sin ambigüedad posible la razón de su comportamiento, sino que propone una solución: chequear el sistema de ficheros con la herramienta adecuada.&lt;br /&gt;&lt;br /&gt;No necesité otra cosa que instalar esa herramienta:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;aptitude install hfsprogs&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y ejecutar &lt;code&gt;fsck.hfsplus&lt;/code&gt; sobre cada una de las particiones del dispositivo en cuestión (&lt;code&gt;/dev/sde&lt;/code&gt;). La tercera partición &lt;code&gt;/dev/sde3&lt;/code&gt; era la corrupta. En pocos segundos, se resolvió el problema que nos había tenido entretenidos más de la cuenta y pudimos realizar la transferencia de ficheros.&lt;br /&gt;&lt;br /&gt;Moraleja: No hay que fiarse totalmente de las aplicaciones gráficas. En su afán de evitar mensajes crípticos, pueden ocultar datos decisivos de la realidad.&lt;br /&gt;&lt;br /&gt;Moraleja2: Si es necesario el proceso descrito para resolver un problema tan simple y, probablemente, frecuente, ¿no es posible pensar que Linux (o, quizá, todo sistema complejo) no es todavía lo suficientemente amigable como para que lo pueda usar mi tía María?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-711648034001236253?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/711648034001236253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/07/ocultamientos-y-desvelamientos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/711648034001236253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/711648034001236253'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/07/ocultamientos-y-desvelamientos.html' title='Ocultamientos y desvelamientos'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1519551833029802834</id><published>2009-06-06T11:11:00.003+02:00</published><updated>2009-06-06T13:25:54.381+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (XII - limpieza)</title><content type='html'>Los buenos profesionales de la construcción, la fontanería o de cualquier otra actividad que interviene en la infraestructura de nuestra casa no dan por finalizado su trabajo hasta haber borrado completamente la huellas de su actividad reformadora. Hoy en día, urgidos por el afán de amasar dinero fácil o, simplemente, carentes de toda ética profesional, son habituales los chapuceros que nos acaban dejando la casa hecha un zaguán.&lt;br /&gt;&lt;br /&gt;No vayamos a emular esta desagradable actitud y procuremos que tras la ejecución de nuestro guión todo quede limpio y bien dispuesto. &lt;br /&gt;&lt;br /&gt;Por lo general, un guión genera dos tipos de basura: basura permanente, compuesta por ficheros temporales, ya sea creados por nosotros mismos o por las órdenes que lo componen, y basura en pantalla, esto es, mensajes de información que se producen al ejecutar dichas órdenes. Los primeros se eliminan fácilmente con la orden &lt;code&gt;rm&lt;/code&gt;; los segundos, redirigiéndolos al agujero negro de HAL.&lt;br /&gt;&lt;br /&gt;Estas operaciones de limpieza deben efectuarse solamente una vez que se ha comprobado fehacientemente la corrección de nuestro guión. De hecho, los ficheros temporales y los mensajes producidos en su ejecución son información valiosa para descubrir la fuente de errores potenciales. Y ---conviene recordarlo--- no es probable que un guión esté libre de fallos en su primeras redacciones.&lt;br /&gt;&lt;br /&gt;El paso de eliminar los ficheros temporales es, a estas alturas, pan comido. Los ficheros temporales creados por nuestro guión son:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Los ficheros &lt;code&gt;objetivos_tmp.tex&lt;/code&gt;, &lt;code&gt;contenidos_tmp.tex&lt;/code&gt; y &lt;code&gt;trabajo_tmp.tex&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los ficheros producidos por &lt;code&gt;pdflatex&lt;/code&gt;, cuyo nombre es el mismo que el del fichero pdf resultante: &lt;code&gt;$ALUMNO.pdf&lt;/code&gt;, pero con extensiones diferentes: &lt;code&gt;$ALUMNO.tex&lt;/code&gt;, &lt;code&gt;$ALUMNO.aux&lt;/code&gt;, etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;La orden para eliminar los ficheros citados en primer lugar puede ser ésta, que borra todos los ficheros cuyo nombre termina en &lt;code&gt;_tmp.tex&lt;/code&gt;: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;rm *_tmp.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para eliminar los ficheros citados en segundo lugar, podemos utilizar una orden como la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rm $(ls ${ALUMNO}* | grep -v '\.pdf')&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esta orden envía la lista de todos los ficheros cuyo nombre comienza por &lt;code&gt;$ALUMNO&lt;/code&gt; a &lt;code&gt;grep&lt;/code&gt;, que devuelve todos menos el que termina con la extensión pdf ---para eso sirve la opción &lt;code&gt;-v&lt;/code&gt; de &lt;code&gt;grep&lt;/code&gt;---, y lo filtrado por &lt;code&gt;grep&lt;/code&gt; se lo da como argumento a &lt;code&gt;rm&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Para que los mensajes de información emitidos por las órdenes que se ejecutan dentro del guión no aparezcan en pantalla, el recurso habitual es redirigirlos a un fichero especial, llamado &lt;code&gt;/dev/null&lt;/code&gt;, un agujero negro dentro de HAL que succiona todo lo que llega a él y lo hace desaparecer en la nada. De las órdenes incorporadas en nuestro guión, &lt;code&gt;pdflatex&lt;/code&gt; va a producir siempre mensajes informativos, como habrá comprobado el lector que haya puesto a prueba las versiones del guión dadas hasta ahora. Si no queremos molestar al usuario con estos mensajes, podemos añadir la redirección a &lt;code&gt;/dev/null&lt;/code&gt; a dicha orden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pdflatex ${ALUMNO}.tex &gt; /dev/null&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La nueva versión del guión, &lt;code&gt;generar_informes-5&lt;/code&gt;, con estas tres medidas higiénicas incluidas, queda así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;# Fichero sed para limpiar etiquetas LaTeX&lt;br /&gt;NOLATEX=limpiar_tex.sed&lt;br /&gt;&lt;br /&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;br /&gt;  if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]&lt;br /&gt;  then&lt;br /&gt;    # Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;    ALUMNO=$(echo $linea | cut -d':' -f1)&lt;br /&gt;    CURSO=$(echo $linea | cut -d':' -f2)&lt;br /&gt;&lt;br /&gt;    # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;    ALUMNO_OUTPUT=$(echo $ALUMNO | sed -e 's/-/ /g')&lt;br /&gt;    CURSO_OUTPUT=$(echo $CURSO | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                              -e 's/ge/EE/' \&lt;br /&gt;                                              -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;    # Ficheros que contienen los objetivos y contenidos del curso&lt;br /&gt;    # en que el alumno está matriculado&lt;br /&gt;    F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS&lt;br /&gt;    F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS&lt;br /&gt;&lt;br /&gt;    # Los objetivos y contenidos en un formato apto para la plantilla&lt;br /&gt;    # a partir de la que se genera el informe&lt;br /&gt;    sed -f $NOLATEX $F_OBJETIVOS &gt; objetivos_tmp.tex&lt;br /&gt;    sed -f $NOLATEX $F_CONTENIDOS &gt; contenidos_tmp.tex&lt;br /&gt;&lt;br /&gt;    # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;    echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;    cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;    sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;        -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;        -e  's/OBJETIVOS/\\input{objetivos_tmp}/' \&lt;br /&gt;        -e 's/CONTENIDOS/\\input{contenidos_tmp}/' \&lt;br /&gt;        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;br /&gt;    pdflatex ${ALUMNO}.tex &lt;span style="color:red"&gt; &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:red"&gt;# Eliminación del los ficheros temporales creados&lt;br /&gt;    rm *_tmp.tex&lt;br /&gt;    rm $(ls ${ALUMNO}* | grep -v '\.pdf')&lt;/span&gt;&lt;br /&gt;  fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las tres únicas diferencias dignas de mención respecto de la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html#generar-informes"&gt;versión propuesta al principio de esta serie&lt;/a&gt; son:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;El valor de la variable &lt;code&gt;PROGRAMACION&lt;/code&gt;, un valor que lógicamente dependerá del lugar donde el usuario tenga almacenados los ficheros de objetivos y mínimos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La instrucción &lt;code&gt;lp ${ALUMNO}.pdf &gt; /dev/null&lt;/code&gt;, que envía el informe del alumno directamente a la impresora, en caso de que el usuario disponga de un sistema de impresión basado en &lt;a href="http://es.wikipedia.org/wiki/Cups"&gt;CUPS&lt;/a&gt;, lo normal estos días en las distribuciones GNU/Linux.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El enigmático &lt;code&gt;#!/bin/sh&lt;/code&gt;, que nos acompaña desde el pasado de estas conversaciones, que no es estrictamente necesario en la mayoría de los casos, y cuyo sentido tocará explicar en su momento.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Si el lector ha sido capaz de alcanzar esta cota sin desfallecer, puede considerarse un usuario avanzado y, si le apetece verlo de esta otra forma, un programador en ciernes. Enhorabuena, Sancho, te subiremos la nota.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;Cuando la corrección de un guión se ha comprobado suficientemente, es recomendable limpiar el directorio desde el que se ejecuta de todos los ficheros temporales generados y suprimir de la interfaz del usuario los mensajes informativos que las órdenes aplicadas pueden generar.&lt;/li&gt;&lt;br /&gt;&lt;li id="grep-v"&gt;La opción &lt;code&gt;-v&lt;/code&gt; de &lt;code&gt;grep&lt;/code&gt; invierte el sentido de la búsqueda, esto es, devuelve las líneas de la entrada que &lt;em&gt;no&lt;/em&gt; encajan con el patrón suministrado como primer argumento.&lt;/li&gt;&lt;br /&gt;&lt;li id="devnull"&gt;El fichero especial &lt;code&gt;/dev/null&lt;/code&gt; existe para redirigir a él cualquier salida de nuestras órdenes que queremos hacer desaparecer del universo visible.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1519551833029802834?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1519551833029802834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-xii-limpieza.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1519551833029802834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1519551833029802834'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-xii-limpieza.html' title='HAL y la burocracia (XII - limpieza)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-2982155230635130692</id><published>2009-06-05T23:50:00.002+02:00</published><updated>2009-06-06T01:19:09.151+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (XI)</title><content type='html'>Entre el &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html#generar informes"&gt;guión original&lt;/a&gt; y la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-x-redundancia.html#generar-informes"&gt;última versión&lt;/a&gt; obtenida en el proceso de reconstrucción que estamos siguiendo, hay ya muy pocas diferencias, todas ellas relativamente triviales.&lt;br /&gt;&lt;br /&gt;En primer lugar, y con objeto de aliviar la exposición, hemos partido de un presupuesto falso, a saber, que los ficheros reales  de objetivos y mínimos ---los del autor--- contenían sólo la etiqueta de LaTeX &lt;code&gt;\item&lt;/code&gt;. La realidad es un poco más compleja. En tales ficheros aparecían, además, las etiquetas: &lt;code&gt;\section&lt;/code&gt;, &lt;code&gt;\subsection&lt;/code&gt;, &lt;code&gt;\subsubsection&lt;/code&gt;, &lt;code&gt;\paragraph&lt;/code&gt;, \begin{itemize} y \end{itemize}. Ahora bien, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html#informe-plantilla"&gt;la plantilla&lt;/a&gt; a partir de la cual se generan los informes particulares de cada alumno cuenta con que los ficheros incluidos mediante &lt;code&gt;\input&lt;/code&gt; en los entornos &lt;code&gt;Objetivos&lt;/code&gt; y &lt;code&gt;Contenidos&lt;/code&gt; constan de líneas precedidas por la etiqueta &lt;code&gt;\item&lt;/code&gt; y que ninguna otra etiqueta LaTeX está presente. Esto significa que los ficheros originales &lt;code&gt;&lt;em&gt;curso&lt;/em&gt;-objetivos.tex&lt;/code&gt; y &lt;code&gt;&lt;em&gt;curso&lt;/em&gt;-minimos.tex&lt;/code&gt; deben sufrir un proceso de depuración antes de ser incluidos mediante &lt;code&gt;\input&lt;/code&gt;. Una forma sencilla de lograrlo es utilizar una instrucción &lt;code&gt;sed&lt;/code&gt; que elimine todas las etiquetas mencionadas, excepto &lt;code&gt;\item&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e '/\\.*section/d' \&lt;br /&gt;    -e '/\\.itemize/d' \&lt;br /&gt;    -e '/\\paragraph/d' ${CURSO}-objetivos.tex&lt;br /&gt;&lt;br /&gt;sed -e '/\\.*section/d' \&lt;br /&gt;    -e '/\\.itemize/d' \&lt;br /&gt;    -e '/\\paragraph/d' ${CURSO}-minimos.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Puesto que el proceso de depuración debe aplicarse, como acabamos de ver, tanto al fichero de objetivos como al de mínimos, y puesto que, como aprendimos ayer, hay que rehuir de las redundancias, es oportuno utilizar aquí un fichero que contenga las expresiones &lt;code&gt;sed&lt;/code&gt; anteriormente definidas y que se pase como argumento a &lt;code&gt;sed&lt;/code&gt; (mediante su opción &lt;code&gt;-f&lt;/code&gt;) en sendas órdenes de depuración.&lt;br /&gt;&lt;br /&gt;Creamos, pues, el fichero que llamaremos &lt;code&gt;limpiar_tex.sed&lt;/code&gt;, cuyo contenido será:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/\\.*section/d&lt;br /&gt;/\\.*itemize/d&lt;br /&gt;/\\paragraph/d&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y, dado que el fichero en cuestión es un dato de entrada al mismo nivel que el fichero &lt;code&gt;$NOTAS&lt;/code&gt; o el directorio &lt;code&gt;$PROGRAMACION&lt;/code&gt;, una variable inicial que se refiera al nuevo fichero parece lo más indicado:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;# Fichero sed para limpiar etiquetas LaTeX&lt;br /&gt;NOLATEX=limpiar_tex.sed&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora podemos pasar ese fichero como argumento de la opción &lt;code&gt;-f&lt;/code&gt; de &lt;code&gt;sed&lt;/code&gt; para obtener los ficheros de objetivos y mínimos que se incluirán en los ficheros &lt;code&gt;.tex&lt;/code&gt; resultantes de las conversiones realizadas sobre la plantilla:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -f $NOLATEX ${CURSO}-$OBJETIVOS &gt; objetivos_tmp.tex&lt;br /&gt;sed -f $NOLATEX ${CURSO}-$CONTENIDOS &gt; contenidos_tmp.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se habrá notado que el resultado se redirige a un par de ficheros temporales, que serán, en último término, los que se incluirán en el fichero &lt;code&gt;.tex&lt;/code&gt; de cada informe. Es evidente que es esto lo que queremos y no, por ejemplo, sobreescribir los ficheros originales de objetivos y mínimos.&lt;br /&gt;&lt;br /&gt;Para mayor claridad y versatilidad, se pueden definir dos variables puestas al valor del nombre del fichero de objetivos y mínimos de cada caso, variables que pueden a su vez pasarse como argumentos de las órdenes &lt;code&gt;sed&lt;/code&gt; anteriormente citadas en el lugar de los propuestos antes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;# Ficheros que contienen los objetivos y contenidos del curso&lt;br /&gt;# en que el alumno está matriculado&lt;br /&gt;F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS&lt;br /&gt;F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;# Los objetivos y contenidos en un formato apto para la plantilla&lt;br /&gt;# a partir de la que se genera el informe&lt;br /&gt;sed -f $NOLATEX $F_OBJETIVOS &gt; objetivos_tmp.tex&lt;br /&gt;sed -f $NOLATEX $F_CONTENIDOS &gt; contenidos_tmp.tex&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que resta es, simplemente, modificar adecuadamente, las expresiones correspondientes de la última orden &lt;code&gt;sed&lt;/code&gt;, que, claramente, acaba adquiriendo un aspecto mucho más amigable (sin las comillas dobles, sin variables y sin la triple barra invertida): &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Versión previa&lt;br /&gt;sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;    -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;    -e &lt;span style="color:green"&gt;"s/OBJETIVOS/\\\input{${CURSO}-${OBJETIVOS}}/"&lt;/span&gt; \&lt;br /&gt;    -e &lt;span style="color:green"&gt;"s/CONTENIDOS/\\\input{${CURSO}-${CONTENIDOS}}/"&lt;/span&gt; \&lt;br /&gt;    -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;    -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;    -e &lt;span style="color:red"&gt;'s/OBJETIVOS/\\input{objetivos_tmp}/'&lt;/span&gt; \&lt;br /&gt;    -e &lt;span style="color:red"&gt;'s/CONTENIDOS/\\input{contenidos_tmp}/'&lt;/span&gt; \&lt;br /&gt;    -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La nueva versión del guión, &lt;code&gt;generar_informes-4&lt;/code&gt;, con estas incorporaciones de última hora, queda como sigue:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;# Fichero sed para limpiar etiquetas LaTeX&lt;br /&gt;NOLATEX=limpiar_tex.sed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;br /&gt;  if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]&lt;br /&gt;  then&lt;br /&gt;    # Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;    ALUMNO=$(echo $linea | cut -d':' -f1)&lt;br /&gt;    CURSO=$(echo $linea | cut -d':' -f2)&lt;br /&gt;&lt;br /&gt;    # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;    ALUMNO_OUTPUT=$(echo $ALUMNO | sed -e 's/-/ /g')&lt;br /&gt;    CURSO_OUTPUT=$(echo $CURSO | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                              -e 's/ge/EE/' \&lt;br /&gt;                                              -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:red"&gt;# Ficheros que contienen los objetivos y contenidos del curso&lt;br /&gt;    # en que el alumno está matriculado&lt;br /&gt;    F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS&lt;br /&gt;    F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:red"&gt;# Los objetivos y contenidos en un formato apto para la plantilla&lt;br /&gt;    # a partir de la que se genera el informe&lt;br /&gt;    sed -f $NOLATEX $F_OBJETIVOS &gt; objetivos_tmp.tex&lt;br /&gt;    sed -f $NOLATEX $F_CONTENIDOS &gt; contenidos_tmp.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;    echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;    cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;    sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;        -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;        -e  &lt;span style="color:red"&gt;'s/OBJETIVOS/\\input{objetivos_tmp}/'&lt;/span&gt; \&lt;br /&gt;        -e &lt;span style="color:red"&gt;'s/CONTENIDOS/\\input{contenidos_tmp}/'&lt;/span&gt; \&lt;br /&gt;        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;br /&gt;    pdflatex ${ALUMNO}.tex&lt;br /&gt;  fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-2982155230635130692?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/2982155230635130692/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-xi.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2982155230635130692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/2982155230635130692'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-xi.html' title='HAL y la burocracia (XI)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3475253908065967250</id><published>2009-06-05T20:41:00.004+02:00</published><updated>2009-06-05T23:55:00.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (X - redundancia)</title><content type='html'>Si &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-ix-repeticiones.html"&gt;recurríamos a los bucles&lt;/a&gt; para evitar la repetición innecesaria del mismo código sobre los elementos de una lista de datos, carece de sentido mantener en el interior del bucle construcciones redundantes. Y nuestra última redacción posee un grado de redundancia intolerable:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;...&lt;br /&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;br /&gt;  if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]&lt;br /&gt;  then&lt;br /&gt;    # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;    ALUMNO_OUTPUT=&lt;span style="color:green"&gt;$(echo $linea | cut -d':' -f1&lt;/span&gt; | sed -e 's/-/ /g')&lt;br /&gt;    CURSO_OUTPUT=&lt;span style="color:olive"&gt;$(echo $linea | cut -d':' -f2&lt;/span&gt; | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                              -e 's/ge/EE/' \&lt;br /&gt;                                              -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;    # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;    echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;    cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;    sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;        -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;        -e "s/OBJETIVOS/\\\input{&lt;span style="color:olive"&gt;$(echo $linea | cut -d':' -f2)&lt;/span&gt;-${OBJETIVOS}}/" \&lt;br /&gt;        -e "s/CONTENIDOS/\\\input{&lt;span style="color:olive"&gt;$(echo $linea | cut -d':' -f2)&lt;/span&gt;-${CONTENIDOS}}/" \&lt;br /&gt;        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; &lt;span style="color:green"&gt;$(echo $linea | cut -d':' -f1)&lt;/span&gt;.tex&lt;br /&gt;&lt;br /&gt;    pdflatex &lt;span style="color:green"&gt;$(echo $linea | cut -d':' -f1)&lt;/span&gt;.tex&lt;br /&gt;  fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una forma de evitar estas inoperantes y fastidiosas redundancias es convertir el código que se repite en el valor de una variable. Con ello logramos una serie de beneficios claros:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;El código en cuestión se ejecuta una única vez, en lugar de varias, lo que implica un uso más eficiente de los recursos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La complejidad disminuye, porque donde había una larga tubería habrá ahora un simple nombre de variable.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El resultado es más manejable, puesto que si se decide modificar el guión, bastará hacerlo en un solo sitio y no en varios.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El resultado es más legible, pues el nombre de la variable, si está bien elegido, será mucho más fácilmente comprensible que la cadena de órdenes por la que está.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Procedamos a empaquetar el código que extrae el primer y segundo campo de cada línea del fichero &lt;code&gt;$NOTAS&lt;/code&gt;, nombre de alumno y curso, respectivamente, en una variable adecuada:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;&lt;span style="color:red"&gt;ALUMNO=$(echo $linea | cut -d':' -f1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:purple"&gt;CURSO=$(echo $linea | cut -d':' -f2)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El siguiente paso es incorporar las definiciones de estas variables y modificar las líneas del guión que contenían lo que ahora es el valor de tales variables. Recordemos, por otra parte, que cuando el valor de una variable se ha de manipular dentro de una tubería por un filtro que exige como entrada una cadena de caracteres se lo pasamos como argumento a &lt;code&gt;echo&lt;/code&gt;:&lt;br /&gt;&lt;pre id="generar-informes"&gt;&lt;br /&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;br /&gt;  if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]&lt;br /&gt;  then&lt;br /&gt;    # Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;    &lt;span style="color:red"&gt;ALUMNO=$(echo $linea | cut -d':' -f1)&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:purple"&gt;CURSO=$(echo $linea | cut -d':' -f2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;    ALUMNO_OUTPUT=&lt;span style="color:red"&gt;$(echo $ALUMNO&lt;/span&gt; | sed -e 's/-/ /g')&lt;br /&gt;    CURSO_OUTPUT=&lt;span style="color:purple"&gt;$(echo $CURSO&lt;/span&gt; | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                              -e 's/ge/EE/' \&lt;br /&gt;                                              -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;    # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;    echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;    cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;    sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;        -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;        -e "s/OBJETIVOS/\\\input{&lt;span style="color:purple"&gt;${CURSO}&lt;/span&gt;-${OBJETIVOS}}/" \&lt;br /&gt;        -e "s/CONTENIDOS/\\\input{&lt;span style="color:purple"&gt;${CURSO}&lt;/span&gt;-${CONTENIDOS}}/" \&lt;br /&gt;        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; &lt;span style="color:red"&gt;${ALUMNO}&lt;/span&gt;.tex&lt;br /&gt;&lt;br /&gt;    pdflatex &lt;span style="color:red"&gt;${ALUMNO}&lt;/span&gt;.tex&lt;br /&gt;  fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Veamos qué dice &lt;code&gt;diff&lt;/code&gt; si guardamos esta nueva versión con el nombre &lt;code&gt;generar_informes-3&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;diff -Bbi -u generar_informes-2 generar_informes-3&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Su respuesta es la siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;--- generar_informes-2  2009-06-05 15:20:33.000000000 +0200&lt;br /&gt;+++ generar_informes-3  2009-06-05 21:38:40.000000000 +0200&lt;br /&gt;@@ -20,9 +20,13 @@&lt;br /&gt; do&lt;br /&gt;   if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]&lt;br /&gt;   then&lt;br /&gt;+    # Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;+    ALUMNO=$(echo $linea | cut -d':' -f1)&lt;br /&gt;+    CURSO=$(echo $linea | cut -d':' -f2)&lt;br /&gt;+&lt;br /&gt;     # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;-    ALUMNO_OUTPUT=$(echo $linea | cut -d':' -f1 | sed -e 's/-/ /g')&lt;br /&gt;-    CURSO_OUTPUT=$(echo $linea | cut -d':' -f2 | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;+    ALUMNO_OUTPUT=$(echo $ALUMNO | sed -e 's/-/ /g')&lt;br /&gt;+    CURSO_OUTPUT=$(echo $CURSO | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                               -e 's/ge/EE/' \&lt;br /&gt;                                               -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;@@ -32,11 +36,10 @@&lt;br /&gt;&lt;br /&gt;     sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;         -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;-        -e "s/OBJETIVOS/\\\input{$(echo $linea | cut -d':' -f2)-${OBJETIVOS}}/" \&lt;br /&gt;-        -e "s/CONTENIDOS/\\\input{$(echo $linea | cut -d':' -f2)-${CONTENIDOS}}/" \&lt;br /&gt;-        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; $(echo $linea | cut -d':' -f1).tex&lt;br /&gt;+        -e "s/OBJETIVOS/\\\input{${CURSO}-${OBJETIVOS}}/" \&lt;br /&gt;+        -e "s/CONTENIDOS/\\\input{${CURSO}-${CONTENIDOS}}/" \&lt;br /&gt;+        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;br /&gt;-    pdflatex $(echo $linea | cut -d':' -f1).tex&lt;br /&gt;+    pdflatex ${ALUMNO}.tex&lt;br /&gt;   fi&lt;br /&gt; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;Por regla general, las redundancias deben ser evitadas en la escritura de guiones o programas.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3475253908065967250?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3475253908065967250/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-x-redundancia.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3475253908065967250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3475253908065967250'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-x-redundancia.html' title='HAL y la burocracia (X - redundancia)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8757156445623601151</id><published>2009-06-04T16:21:00.006+02:00</published><updated>2009-06-10T00:32:11.921+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (IX - repeticiones)</title><content type='html'>Quizá la ventaja más señalada de un computador respecto del humano es su capacidad de repetir una y otra vez las mismas operaciones sin acusar aburrimiento o cansancio alguno. No hace falta escarbar en las zonas profundas e invisibles de su trastienda para asistir a un aquelarre de incontables repeticiones, incluso la mayoría de las órdenes amigables que hemos aprendido no son sino procesos en los que una misma operación se repite hasta agotar todos los datos de la entrada. Un &lt;code&gt;grep&lt;/code&gt;, por ejemplo, no es otra cosa que la repetición de la misma operación, la de buscar en una línea la presencia de un patrón textual, aplicada a todas las líneas de los ficheros que se le dan como argumentos.&lt;br /&gt;&lt;br /&gt;Aunque nuestros guiones no han aplicado conscientemente hasta ahora esta facultad repetitiva, el guión del que nos ocupamos estos días es un buen pretexto para conocer algunas herramientas lingüísticas nuevas que permitan programar repeticiones o &lt;em&gt;bucles&lt;/em&gt;, como se denominan técnicamente.&lt;br /&gt;&lt;br /&gt;Veamos, para empezar, un ejemplo fácil de bucle. &lt;br /&gt;&lt;br /&gt;Supongamos que queremos que HAL realice una copia de los ficheros que existen en nuestro subdirectorio actual (&lt;code&gt;~/guiones/informe_suspensos&lt;/code&gt;). Nuestro objetivo, en concreto, es que para cada fichero del subdirectorio se obtenga una copia con el nombre &lt;em&gt;&lt;code&gt;fichero.copia&lt;/code&gt;&lt;/em&gt;. Carece de sentido hacerlo a mano:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cp 1-ge-minimos.tex 1-ge-minimos.tex.copia&lt;br /&gt;cp 1-ge-objetivos.tex 1-ge-objetivos.tex.copia&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En lugar de ello, podemos utilizar una orden de este tipo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Para cada 'fichero' en la lista de todos los ficheros del directorio actual, haz una copia con el nombre 'fichero.copia'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O, dispuesta cada expresión en una línea independiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Para cada 'fichero' en la lista de todos los ficheros del directorio actual&lt;br /&gt;haz&lt;br /&gt;una copia con el nombre 'fichero.copia'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podemos traducir, sin más, parte de las expresiones actuales:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Para cada 'fichero' en &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;haz&lt;br /&gt;&lt;span style="color:green"&gt;cp 'fichero' fichero.copia&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La palabra entrecomillada ('fichero') tiene todo el aspecto de ser una variable temporal, pues su valor cambiará según el fichero del caso. Por tanto, podemos confiar en que la siguiente versión es adecuada:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Para &lt;span style="color:purple"&gt;fichero&lt;/span&gt; en &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;haz&lt;br /&gt;&lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero $fichero.copia&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aunque adecuada, la última línea de esta traducción contiene una ambigüedad. ¿Cuál es el nombre de la variable que aparece en último lugar? Para HAL será todo lo que hay después del signo '&lt;code&gt;$&lt;/code&gt;', o sea, &lt;code&gt;fichero.copia&lt;/code&gt;. Sin embargo, lo que pretendemos es que la variable sea &lt;code&gt;fichero&lt;/code&gt; y &lt;code&gt;.copia&lt;/code&gt; un sufijo que se añadirá a cada nombre de fichero concreto. En estos casos, se utilizan llaves para delimitar con precisión absoluta el nombre de la variable: &lt;code&gt;${fichero}.copia&lt;/code&gt;. Mantener la ambigüedad aquí no va a tener efecto negativo, pero conviene irse acostumbrando a estas sutilezas, cuya omisión puede ser letal en otras ocasiones. El fragmento anterior queda, pues, suprimida la ambigüedad, de esta forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Para &lt;span style="color:purple"&gt;fichero&lt;/span&gt; en &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;haz&lt;br /&gt;&lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero ${fichero}&lt;/span&gt;&lt;span style="color:green"&gt;.copia&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo nuevo es poco más que inglés de andar por casa:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for&lt;/span&gt; &lt;span style="color:purple"&gt;fichero&lt;/span&gt; &lt;span style="color:red"&gt;in&lt;/span&gt; &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero ${fichero}&lt;/span&gt;&lt;span style="color:green"&gt;.copia&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;un pequeño elemento ortográfico más, el &lt;code&gt;done&lt;/code&gt; con que se cierra el bucle:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for&lt;/span&gt; &lt;span style="color:purple"&gt;fichero&lt;/span&gt; &lt;span style="color:red"&gt;in&lt;/span&gt; &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero ${fichero}&lt;/span&gt;&lt;span style="color:green"&gt;.copia&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y el, aunque opcional, siempre recomendable, toque de estilo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for&lt;/span&gt; &lt;span style="color:purple"&gt;fichero&lt;/span&gt; &lt;span style="color:red"&gt;in&lt;/span&gt; &lt;span style="color:green"&gt;$(ls *)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;do&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero ${fichero}&lt;/span&gt;&lt;span style="color:green"&gt;.copia&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para el caso concreto del ejemplo, el código se puede abreviar, eliminando la sustitución de comandos y utilizando únicamente el comodín en su lugar, que en un bucle &lt;code&gt;for&lt;/code&gt; tienen el mismo significado [Ver, además, la matización de Vicho en el primer comentario al artículo, si se quiere redondear la sintaxis definitiva]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for&lt;/span&gt; &lt;span style="color:purple"&gt;fichero&lt;/span&gt; &lt;span style="color:red"&gt;in&lt;/span&gt; &lt;span style="color:green"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;do&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:green"&gt;cp&lt;/span&gt; &lt;span style="color:purple"&gt;$fichero ${fichero}&lt;/span&gt;&lt;span style="color:green"&gt;.copia&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Volvamos a nuestro guión provistos de estos nuevos conocimientos.&lt;br /&gt;&lt;br /&gt;Se recordará que el modelo para el caso simple contaba con que el fichero &lt;code&gt;notas&lt;/code&gt; sólo contuviera una única línea. Vamos a eliminar esta última restricción y aceptar cualquier número posible de alumnos registrados. Digamos que nuestro fichero &lt;code&gt;notas&lt;/code&gt; contiene las siguientes líneas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Don-Quijote-de-la-Mancha:6-gm:10&lt;br /&gt;Sancho-Panza:1-ge:3&lt;br /&gt;Sansón-Carrasco:3-gm:4&lt;br /&gt;Dulcinea-del-Toboso:1-gm:5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El objetivo es que para cada línea del fichero, se ejecuten las instrucciones contenidas en el modelo simple. Recordemos que la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-viii-decisiones.html#informe-sancho"&gt;versión final de este modelo simple&lt;/a&gt; realizaba, por este orden, las siguientes operaciones:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Verificar que el campo tercero ---la nota--- de la línea del&lt;br /&gt;# fichero sea menor que la nota mínima.&lt;br /&gt;&lt;span style="color:green"&gt;if [ $(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA ]&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;### ( En el caso de que se cumpla la condición )&lt;br /&gt;# Convertir el campo primero ---el nombre del alumno--- de la línea&lt;br /&gt;# del fichero al formato que tendrá en la salida impresa y&lt;br /&gt;# guardarlo en la variable 'ALUMNO_OUTPUT'.&lt;br /&gt;&lt;span style="color:green"&gt;ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Convertir el campo segundo ---el código del curso--- de la línea&lt;br /&gt;# del fichero al formato que tendrá en la salida impresa y&lt;br /&gt;# guardarlo en la variable 'ALUMNO_OUTPUT'.&lt;br /&gt;&lt;span style="color:green"&gt;CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed ...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Abrir una sesión interactiva para crear el fichero temporal &lt;br /&gt;# 'trabajo_tmp.tex' que contenga las propuestas de actividades.&lt;br /&gt;...&lt;br /&gt;&lt;span style="color:green"&gt;cat &gt; trabajo_tmp.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Realizar las sustituciones necesarias en el fichero '$PLANTILLA'&lt;br /&gt;# y generar como resultado el fichero 'Sancho-Panza.tex'.&lt;br /&gt;&lt;span style="color:green"&gt;sed ... $PLANTILLA &gt; Sancho-Panza.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Procesar el fichero que resulta del paso anterior con pdflatex.&lt;br /&gt;&lt;span style="color:green"&gt;pdflatex Sancho-Panza.tex&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Comencemos, pues, las modificaciones.&lt;br /&gt;&lt;br /&gt;El primer paso es crear el bucle que permita realizar esta serie de procesos para cada línea del fichero &lt;code&gt;$NOTAS&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;/span&gt;&lt;br /&gt;  &lt;em&gt;acciones&lt;/em&gt;&lt;br /&gt;&lt;span style="color:red"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se observará que para que el guión pueda leer cada línea del fichero y actuar sobre cada una de ellas, tenemos primero que darle acceso a su contenido. &lt;code&gt;cat&lt;/code&gt; es una orden que se puede utilizar para este propósito.&lt;br /&gt;&lt;br /&gt;El segundo paso es cambiar adecuadamente las entradas de las órdenes que, en nuestra versión previa, accedían al fichero &lt;code&gt;$NOTAS&lt;/code&gt;. Puesto que ahora deben ejecutarse no para el fichero en cuanto unidad cerrada, sino para cada una de sus líneas, tendremos que cambiar el método de entrada del dato, ya no vale utilizar el nombre del fichero como argumento, sino que se requiere pasar cada línea a la orden correspondiente mediante una tubería. Veamos las órdenes afectadas en su versión original (en verde) y en su versión modificada (en rojo).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;### 1.&lt;br /&gt;# Versión previa&lt;br /&gt;if [ $(&lt;span style="color:green"&gt;cut -d':' -f3 $NOTAS&lt;/span&gt;) -lt $NOTA_MINIMA ]&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;if [ $(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f3&lt;/span&gt;) -lt $NOTA_MINIMA ]&lt;br /&gt;&lt;br /&gt;### 2.&lt;br /&gt;# Versión previa&lt;br /&gt;ALUMNO_OUTPUT=$(&lt;span style="color:green"&gt;cut -d':' -f1 $NOTAS&lt;/span&gt; | sed -e 's/-/ /g')&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;ALUMNO_OUTPUT=$(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f1&lt;/span&gt; | sed -e 's/-/ /g')&lt;br /&gt;&lt;br /&gt;### 3.&lt;br /&gt;# Versión previa&lt;br /&gt;CURSO_OUTPUT=$(&lt;span style="color:green"&gt;cut -d':' -f2 $NOTAS&lt;/span&gt; | sed ...)&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;CURSO_OUTPUT=$(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f2&lt;/span&gt; | sed ...)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una tercera modificación obligatoria en sustituir en las órdenes correspondientes los nombres de ficheros que aludían a Sancho Panza por una expresión que devuelva el nombre del alumno según la línea del fichero que en ese momento de ejecución del bucle se esté procesando:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;### 1.&lt;br /&gt;# Versión previa&lt;br /&gt;sed ... -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; &lt;span style="color:green"&gt;Sancho-Panza.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;sed ... -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; &lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f1).tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;### 2.&lt;br /&gt;# Versión previa&lt;br /&gt;pdflatex &lt;span style="color:green"&gt;Sancho-Panza.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;pdflatex &lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f1).tex&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El último paso para la generalización del guión es procurar un nombre genérico para los ficheros de objetivos y contenidos mínimos, de forma que se acceda al fichero que corresponda al curso del alumno cuya línea se esté procesando en cada momento. Ya, de paso, recurriremos, para construir el nombre genérico de dichos ficheros, a las variables iniciales &lt;code&gt;OBJETIVOS&lt;/code&gt; y &lt;code&gt;CONTENIDOS&lt;/code&gt;, no referidas en el guión hasta ahora:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Versión previa&lt;br /&gt;sed ... -e &lt;span style="color:green"&gt;'&lt;/span&gt;s/OBJETIVOS/\\input{&lt;span style="color:green"&gt;1-ge-objetivos&lt;/span&gt;}/&lt;span style="color:green"&gt;'&lt;/span&gt; \&lt;br /&gt;        -e &lt;span style="color:green"&gt;'&lt;/span&gt;s/CONTENIDOS/\\input{&lt;span style="color:green"&gt;1-ge-minimos}&lt;/span&gt;/&lt;span style="color:green"&gt;'&lt;/span&gt; ...&lt;br /&gt;&lt;br /&gt;# Nueva versión&lt;br /&gt;sed ... -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/OBJETIVOS/&lt;span style="color:red"&gt;\&lt;/span&gt;\\input{&lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f2)-${OBJETIVOS}&lt;/span&gt;}/&lt;span style="color:red"&gt;"&lt;/span&gt; \&lt;br /&gt;        -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/CONTENIDOS/&lt;span style="color:red"&gt;\&lt;/span&gt;\\input{&lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f2)-${CONTENIDOS}&lt;/span&gt;}/&lt;span style="color:red"&gt;"&lt;/span&gt; ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se advertirá que esta modificación en la secuencia de reemplazo de las ordenes &lt;code&gt;sed&lt;/code&gt; nos obliga a &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-v-las-comillas.html"&gt;utilizar comillas dobles&lt;/a&gt;. Además, puesto que el carácter '&lt;code&gt;\&lt;/code&gt;', al igual que '&lt;code&gt;$&lt;/code&gt;', mantiene su significado especial cuando va seguido de '&lt;code&gt;\&lt;/code&gt;' y dentro de comillas dobles, es necesario volver a escaparlo, lo cual produce el triple '&lt;code&gt;\\\&lt;/code&gt;' (!)&lt;br /&gt;&lt;br /&gt;Si unimos todas las modificaciones obtenemos esta versión inicial, realmente abigarrada, de nuestro guión generalizado para un fichero &lt;code&gt;$NOTAS&lt;/code&gt; con un número arbitrario de líneas:&lt;br /&gt;&lt;pre id="generar-informes-1"&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;for linea in $(cat $NOTAS)&lt;br /&gt;do&lt;/span&gt;&lt;br /&gt;  if [ $(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f3&lt;/span&gt;) -lt $NOTA_MINIMA ]&lt;br /&gt;  then&lt;br /&gt;    # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;    ALUMNO_OUTPUT=$(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f1&lt;/span&gt; | sed -e 's/-/ /g')&lt;br /&gt;    CURSO_OUTPUT=$(&lt;span style="color:red"&gt;echo $linea | cut -d':' -f2&lt;/span&gt; | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                              -e 's/ge/EE/' \&lt;br /&gt;                                              -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;    # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;    echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;    cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;    sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;        -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;        -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/OBJETIVOS/&lt;span style="color:red"&gt;\&lt;/span&gt;\\input{&lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f2)-${OBJETIVOS}&lt;/span&gt;}/&lt;span style="color:red"&gt;"&lt;/span&gt; \&lt;br /&gt;        -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/CONTENIDOS/&lt;span style="color:red"&gt;\&lt;/span&gt;\\input{&lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f2)-${CONTENIDOS}&lt;/span&gt;}/&lt;span style="color:red"&gt;"&lt;/span&gt; \&lt;br /&gt;        -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; &lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f1).tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    pdflatex &lt;span style="color:red"&gt;$(echo $linea | cut -d':' -f1).tex&lt;/span&gt;&lt;br /&gt;  fi&lt;br /&gt;&lt;span style="color:red"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El autor advierte que la versión no es definitiva, hay demasiadas repeticiones y demasiadas complejidades como para mantenerla así, por muy sucios y rápidos que pretendamos ser. En realidad, esta versión no es ni siquiera la primera que puede surgir en la mente de quien la crea. Como se verá, ante complejidades evidentes, la mente tiende a simplificar desde las fases iniciales.&lt;br /&gt;&lt;br /&gt;Poner a prueba esta versión pasa, naturalmente, por disponer, en el directorio desde el se ejecuta el guión, de los ficheros de objetivos y mínimos correspondientes a los cursos en que están matriculados los alumnos suspensos. Así, para el quijotesco ejemplo de cuatro personajes que dimos hace un momento serían necesarios los citados ficheros para &lt;code&gt;1-ge&lt;/code&gt;, que ya habíamos redactado en anteriores sesiones, y para &lt;code&gt;3-gm&lt;/code&gt;, cuya redacción es tarea del lector.&lt;br /&gt;&lt;br /&gt;Para finalizar la densa sesión de hoy puede ser interesante introducir una nueva orden de HAL que nos permita observar de un vistazo las modificaciones que vamos realizando en las distintas versiones de nuestros guiones. Una herramienta clásica de HAL para este propósito es &lt;code&gt;diff&lt;/code&gt;. Otra, es &lt;code&gt;colordiff&lt;/code&gt;, que, en sistemas Debian, es seguramente necesario instalar previamente. Si la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-viii-decisiones.html#informe-sancho"&gt;primera versión completa&lt;/a&gt; del guión, la versión para el caso simple, la guardamos como &lt;code&gt;generar_informes-1&lt;/code&gt; y ésta nueva como &lt;code&gt;generar_informes-2&lt;/code&gt;, las diferencias entre ambas versiones se puede mostrar mediante la instrucción [las opciones añadidas son las mismas que las de &lt;code&gt;diff&lt;/code&gt; y se pueden consultar en la página de manual correspondiente]:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;colordiff -u -Bbi generar_informes-1 generar_informes-2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que produce el resultado que aparece en esta imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/SikksdZP9hI/AAAAAAAAADU/81Bf5SdrFYo/s1600-h/generar_informes_diff-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/SikksdZP9hI/AAAAAAAAADU/81Bf5SdrFYo/s400/generar_informes_diff-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5343842779075180050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="bucle-for"&gt;Los procesos repetitivos pueden requerir y muchas veces exigen el uso de construcciones especiales, denominadas &lt;em&gt;bucles&lt;/em&gt;. Un bucle típico es el bucle &lt;code&gt;for&lt;/code&gt;, que se atiene a la siguiente sintáxis:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for &lt;em&gt;variable&lt;/em&gt; in &lt;em&gt;lista&lt;/em&gt;&lt;br /&gt;do&lt;br /&gt;  &lt;em&gt;acciones&lt;/em&gt;&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La orden &lt;code class="orden"&gt;diff&lt;/code&gt; ---o su versión coloreada, &lt;code class="orden"&gt;colordiff&lt;/code&gt;--- permite contemplar las diferencias existentes entre dos ficheros.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8757156445623601151?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8757156445623601151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-ix-repeticiones.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8757156445623601151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8757156445623601151'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-ix-repeticiones.html' title='HAL y la burocracia (IX - repeticiones)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-HIqqxAvoQI/SikksdZP9hI/AAAAAAAAADU/81Bf5SdrFYo/s72-c/generar_informes_diff-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1820684709360794912</id><published>2009-06-04T00:47:00.005+02:00</published><updated>2009-06-04T18:32:43.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (VIII - decisiones)</title><content type='html'>La vida es inconcebible como camino de dirección única. A cada paso se nos abre un sinfín de posibilidades, muchas veces incompatibles, ante las cuales no nos queda más remedio que elegir. Los senderos se bifurcan en el ambiguo jardín de la existencia. Pero nuestras elecciones no son, o no deberían ser, completamente caprichosas. La consideración reflexiva de las opciones presentes en las encrucijadas guían nuestra conducta. Por eso, una lengua que careciese de oraciones condicionales no sería humana o, cuando menos, no sería aplicable más que a un sector insignificante de la realidad vital.&lt;br /&gt;&lt;br /&gt;Tampoco a la lengua de HAL le son ajenas las peripecias de la decisión, pues siempre llega el caso en que, dadas ciertas circunstancias, toca desviarse de la senda principal e iniciar una nueva. Por suerte, los "si es" y "si no es" de HAL son mucho más fáciles de aprender que las normas de la &lt;em&gt;consecutio temporum&lt;/em&gt;, y las ambigüedades en las alternativas que presentan están terminantemente prohibidas, so pena de naufragar en resultados ininteligibles o simplemente abortados. &lt;br /&gt;&lt;br /&gt;Consideremos un ejemplo trivial, para irnos acostumbrando a esta nueva rama de nuestro acervo lingüístico:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Si estoy en casa, di "hola"; si no, di "adiós".&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pongamos cada frase en una línea aparte para más claro entendimiento:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Si estoy en casa&lt;br /&gt;di hola&lt;br /&gt;si no&lt;br /&gt;di adios&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las oraciones imperativas sabemos cómo expresarlas, son el meollo de todo lo que hemos pronunciado hasta ahora:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Si estoy en casa&lt;br /&gt;&lt;span style="color:green"&gt;echo "hola"&lt;/span&gt;&lt;br /&gt;si no&lt;br /&gt;&lt;span style="color:green"&gt;echo "adiós"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;También podemos construir un equivalente en lengua de HAL para la condición estipulada, la de estar en casa. Decir que estamos en casa es, visto desde la perspectiva de HAL, lo mismo que decir que nuestro directorio actual de trabajo es igual que nuestro directorio &lt;code&gt;home&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Si &lt;span style="color:green"&gt;$(pwd) = $HOME&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;echo "hola"&lt;/span&gt;&lt;br /&gt;si no&lt;br /&gt;&lt;span style="color:green"&gt;echo "adiós"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es fundamental advertir que el '&lt;code&gt;=&lt;/code&gt;' en la frase &lt;code&gt;$(pwd) = $HOME&lt;/code&gt; debe estar separado de los términos que compara por un espacio y que es, a pesar de su apariencia, completamente distinto del '&lt;code&gt;=&lt;/code&gt;' de una expresión de asignación de valor a una variable (por ejemplo, ESCUDERO='Sancho Panza') donde los espacios de separación están prohibidos. La primera expresión compara dos cadenas de caracteres por su igualdad, mientras que la segunda asigna un valor a una variable.&lt;br /&gt;&lt;br /&gt;El resto es el inglés corriente y moliente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;if&lt;/span&gt; &lt;span style="color:green"&gt;$(pwd) = $HOME&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;echo "hola"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;echo "adiós"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finalmente, unas pocas normas ortográficas más: la condición va entre corchetes y a un espacio de distancia por delante y por detrás de ellos; tras el "si" (el &lt;code&gt;if&lt;/code&gt;) ha de haber un "entonces" (un &lt;code&gt;then&lt;/code&gt;); para terminar, la frase entera se cierra graciosamente con un &lt;code&gt;if&lt;/code&gt; invertido (&lt;code&gt;fi&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;if&lt;/span&gt; &lt;span style="color:red"&gt;[&lt;/span&gt; &lt;span style="color:green"&gt;$(pwd) = $HOME&lt;/span&gt; &lt;span style="color:red"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;echo "hola"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;echo "adiós"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;fi&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y, como convención de estilo, un bello espaciado que destaque la diferente función de cada ingrediente en la frase:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:red"&gt;if&lt;/span&gt; &lt;span style="color:red"&gt;[&lt;/span&gt; &lt;span style="color:green"&gt;$(pwd) = $HOME&lt;/span&gt; &lt;span style="color:red"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;then&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:green"&gt;echo "hola"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;else&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:green"&gt;echo "adiós"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;fi&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El lector puede copiar este fragmento de código, pegarlo en su línea de órdenes y ejecutarlo. Si su directorio actual es su &lt;code&gt;HOME&lt;/code&gt;, recibirá un caluroso saludo; en caso contrario, un fría despedida.&lt;br /&gt;&lt;br /&gt;La facultad de construir oraciones condicionales abre un campo enorme de nuevas posibilidades para nuestros guiones y para nuestras conversaciones con HAL.&lt;br /&gt;&lt;br /&gt;La primera aplicación es que en &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-vii-interactividad.html#informe-Sancho-Panza"&gt;el guión simplificado&lt;/a&gt; que hemos producido estos días ya no tenemos por qué seguir suponiendo artificialmente que la nota de nuestro alumno es suspenso. Dicho de otra forma, podemos solicitar a HAL que realice las operaciones establecidas ---que en la redacción actual realiza en todo caso posible--- sólo si la calificación del alumno que consta en el fichero &lt;code&gt;notas&lt;/code&gt; es inferior a la nota mínima necesaria para aprobar.&lt;br /&gt;&lt;br /&gt;Construyamos, en primer lugar, la condición:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;el campo tercero de la línea que consta en el fichero 'notas' ---el que almacena la calificación--- es menor que la nota mínima&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En lengua de HAL:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El operador &lt;code&gt;-lt&lt;/code&gt;, abreviatura de &lt;em&gt;less than&lt;/em&gt; (menor que), se utiliza precisamente para este tipo de comparaciones aritméticas.&lt;br /&gt;&lt;br /&gt;La frase condicional entera sería:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if [ $(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA ]&lt;br /&gt;then&lt;br /&gt;    ÓRDENES&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como no necesitamos realizar ninguna operación en el caso de que la nota sea superior a la mínima, no es necesario crear una cláusula &lt;code&gt;else&lt;/code&gt; para nuestra frase.&lt;br /&gt;&lt;br /&gt;El guión completo con la condición añadida quedaría ahora como sigue:&lt;br /&gt;&lt;pre id=informe-sancho&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;if [ $(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA ]&lt;br /&gt;then&lt;/span&gt;&lt;br /&gt;  # El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;  ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;br /&gt;  CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                            -e 's/ge/EE/' \&lt;br /&gt;                                            -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;  # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;  echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;  cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;  sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;      -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;      -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;      -e 's/CONTENIDOS/\\input{1-ge-minimos}/' \&lt;br /&gt;      -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;br /&gt;  pdflatex Sancho-Panza.tex&lt;br /&gt;&lt;span style="color:red"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si lo ponemos a prueba, no habrá ningún cambio en su comportamiento. El informe &lt;code&gt;Sancho-Panza.pdf&lt;/code&gt; se generará idéntico al del día pasado. Pero si cambiamos la nota de Sancho y le damos un aprobado, el guión terminará en silencio sin haber realizado ninguna acción, aparte de la asignación temporal de los valores de las variables, cosa que carece de efectos visibles para nosotros.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="condicionales"&gt;La lengua de HAL dispone de la posibilidad de construir frases condicionales mediante la sintaxis:&lt;br /&gt;&lt;pre&gt;if [ &lt;em&gt;condición&lt;/em&gt; ] &lt;br /&gt;then&lt;br /&gt;  &lt;em&gt;acciones si la condición se cumple&lt;/em&gt;&lt;br /&gt;else &lt;br /&gt;  &lt;em&gt;acciones si la condición no se cumple&lt;/em&gt;&lt;br /&gt;fi&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li id="signo-="&gt;El operador '&lt;code&gt;=&lt;/code&gt;' sirve para asignar valores a variables (ejemplo: &lt;code&gt;VAR=val&lt;/code&gt;) o, inserto en expresiones condicionales, para comparar por su identidad cadenas de caracteres (ejemplo: &lt;code&gt;cadena1 = cadena2&lt;/code&gt;).&lt;/li&gt;&lt;br /&gt;&lt;li id="-lt"&gt;El operador '&lt;code&gt;-lt&lt;/code&gt;' dentro de expresiones condicionales sirve para verificar si un valor aritmético es menor que otro.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1820684709360794912?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1820684709360794912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-viii-decisiones.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1820684709360794912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1820684709360794912'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-viii-decisiones.html' title='HAL y la burocracia (VIII - decisiones)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3514418100850715721</id><published>2009-06-03T10:54:00.006+02:00</published><updated>2009-06-04T12:31:52.688+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (VII - interactividad)</title><content type='html'>En un &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/hal-y-dict-en-el-laboratorio.html"&gt;remoto pasado de nuestras conversaciones&lt;/a&gt;, enredados en las peculiaridades digestivas de HAL, jugábamos a procurar el alimento de órdenes como &lt;code&gt;grep&lt;/code&gt; o &lt;code&gt;cut&lt;/code&gt; por la vía directa de lo que llamamos entonces la cañería principal ---el &lt;em&gt;standard input (STDIN)&lt;/em&gt;, para los redichos--- conectada por defecto con nuestro terminal o consola. En aquel momento se trataba sólo de un curioso experimento preparatorio para comprender el significado y función de las imprescindibles tuberías. El pasatiempo de aquellos primeros contactos con las maravillas de la anatomía de HAL nos vendrá ahora de perlas para añadir interactividad a nuestro guión.&lt;br /&gt;&lt;br /&gt;Volvamos a reproducir el experimento, pero ahora con otra orden capaz igualmente de alimentarse a través de la entrada estándar, la orden &lt;code&gt;cat&lt;/code&gt; (no confundir con &lt;code&gt;cut&lt;/code&gt;). &lt;code&gt;cat&lt;/code&gt; es una abreviatura de &lt;em&gt;concatenate&lt;/em&gt; y su función inicial es la de concatenar los ficheros que se le den como argumentos e imprimirlos línea a línea en pantalla. Si se le da un único fichero lo imprime tal cual. ¿Pero, qué sucede si no le damos ningún fichero como argumento? Probémoslo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cat&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tras pulsar 'Enter', nos encontramos en una situación ya familiar, la de poder emitir líneas de texto en la entrada estándar para que &lt;code&gt;cat&lt;/code&gt; haga lo que habitualmente hace con las entradas que se le proporcionan, devolverlas tal cual a la salida estándar, que por defecto también está conectada con nuestro terminal. El juego continúa sin fin hasta que solicitamos salir de él con &lt;code&gt;Ctrl+D&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hola&lt;br /&gt;hola&lt;br /&gt;cat&lt;br /&gt;cat&lt;br /&gt;Ctrl+D&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hasta aquí nada nuevo. &lt;code&gt;cat&lt;/code&gt; se comporta de una manera bastante estúpida ---pensaría alguno---, se limita a reproducir cada línea introducida, como si se tratase de un &lt;code&gt;echo&lt;/code&gt; interactivo.&lt;br /&gt;&lt;br /&gt;Parece que algo tan tonto no puede dar mucho de sí. Por el contrario, la utilidad de &lt;code&gt;cat&lt;/code&gt; para nuestro propósito se desvela si añadimos a la orden una redirección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cat &gt;conversacion&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo único que hace este añadido es redirigir la salida al fichero &lt;code&gt;conversacion&lt;/code&gt;. Por tanto, si reproducimos la anterior sesión interactiva, donde la salida de &lt;code&gt;cat&lt;/code&gt; ya no la veremos en pantalla ---porque se redirige a ese fichero--- estaremos copiando en él tal cual las líneas que hayamos escrito antes de pulsar &lt;code&gt;Ctrl+D&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Inmediatamente se comprende la utilidad que este comportamiento de &lt;code&gt;cat&lt;/code&gt; puede tener para nuestro guión.&lt;br /&gt;&lt;br /&gt;Habíamos dejado pendiente la sección correspondiente a las propuestas de actividades que el alumno debe realizar para superar los objetivos y contenidos. Puesto que estas propuestas ---vamos a suponer---, no pueden, en principio, establecerse de antemano, sino que tienen que redactarse de modo expreso para cada alumno suspenso, proporcionar al guión por medio de &lt;code&gt;cat&lt;/code&gt; un acceso a la entrada estándar, nos permitirá realizar la redacción de tales propuestas antes de que las sustituciones en la plantilla &lt;code&gt;informe_plantilla.tex&lt;/code&gt; tengan efecto.&lt;br /&gt;&lt;br /&gt;Esto nos lleva a modificar el guión obtenido el día pasado del modo siguiente [en rojo las nuevas líneas]:&lt;br /&gt;&lt;pre id="informe-Sancho-Panza"&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;# El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;br /&gt;CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                          -e 's/ge/EE/' \&lt;br /&gt;                                          -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;# Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;cat &gt; trabajo_tmp.tex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;    -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' \&lt;br /&gt;    &lt;span style="color:red"&gt;-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/'&lt;/span&gt; $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;br /&gt;pdflatex Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La instrucción &lt;code&gt;echo&lt;/code&gt; produce un mensaje para el usuario, mientras que la instrucción &lt;code&gt;cat&lt;/code&gt; abre la entrada estándar para que el usuario introduzca los datos que se almacenarán en el fichero &lt;code&gt;trabajo_tmp.tex&lt;/code&gt;. Este fichero es luego incluido en el fichero &lt;code&gt;Sancho_Panza.tex&lt;/code&gt; por obra de la última expresión del &lt;code&gt;sed&lt;/code&gt; final. &lt;br /&gt;&lt;br /&gt;Se habrá advertido que el usuario debe introducir las propuestas precedidas de '\item', puesto que el entorno LaTeX del que acabarán formando parte es un entorno lista. Esta última complicación se puede evitar fácilmente de forma que al usuario le baste introducir cada propuesta como un línea única (sin el &lt;code&gt;\item&lt;/code&gt;). En tal caso, el &lt;code&gt;\item&lt;/code&gt; debería añadirlo el propio guión, justo después del &lt;code&gt;cat&lt;/code&gt;, con una instrucción como ésta:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed -i 's/^\(.*\)/\\item \1/' trabajo_tmp.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que la versión presentada en el primer capítulo de esta serie no contenga la simplificación aludida aceleró unos segundos la redacción del guión, aunque a expensas de complicar en parte la interfaz del usuario. Es lo que tiene el modo de obrar "rápido y sucio".&lt;br /&gt;&lt;br /&gt;Queda, finalmente, añadir la sección relativa a las propuestas en nuestra plantilla:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;...&lt;br /&gt;\begin{document}&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: ALUMNO &amp; CURSO&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;\begin{Objetivos}&lt;br /&gt;OBJETIVOS&lt;br /&gt;\end{Objetivos}&lt;br /&gt;\begin{Contenidos}&lt;br /&gt;CONTENIDOS&lt;br /&gt;\end{Contenidos}&lt;br /&gt;&lt;span style="color:red"&gt;\begin{Propuestas}&lt;br /&gt;RECUPERACIÓN&lt;br /&gt;\end{Propuestas}&lt;/span&gt;&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A estas alturas, el lector no debería hallar dificultad alguna en realizar por su cuenta las modificaciones que convengan y volver a poner a prueba el guión mejorado.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="cat"&gt;La orden &lt;code class="orden"&gt;cat&lt;/code&gt; concatena los ficheros que se le proporcionan como argumentos y los imprime en la salida estándar, por defecto, la pantalla. Si no recibe argumentos toma su entrada de la entrada estándar.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Una de las aplicaciones comunes de la orden &lt;code&gt;cat&lt;/code&gt; es permitir la creación interactiva de un fichero.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3514418100850715721?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3514418100850715721/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-vii-interactividad.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3514418100850715721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3514418100850715721'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-vii-interactividad.html' title='HAL y la burocracia (VII - interactividad)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7661385001012040968</id><published>2009-06-02T16:41:00.009+02:00</published><updated>2009-06-04T12:32:19.327+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (VI)</title><content type='html'>Antes de dar un paso más en la elaboración de nuestro guión, conviene que el lector lo ponga a prueba, si no lo ha hecho ya por cuenta propia.&lt;br /&gt;&lt;br /&gt;Creamos, para empezar un directorio &lt;code&gt;informe_suspensos&lt;/code&gt; bajo nuestro subdirectorio de guiones:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir ~/guiones/informe_suspensos&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Conviene recordar los ficheros recién creados para nuestra prueba [en caso de que el lector no los haya creado todavía, deberá hacerlo ahora con cualquier editor de texto plano]:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;informe_plantilla.tex&lt;/code&gt; (la plantilla para generar el fichero &lt;code&gt;.tex&lt;/code&gt; por alumno [Añado un preámbulo adecuado, modifico ligeramente la sección correspondiente a los datos del alumno y suprimo la sección correspondiente a las propuestas, que ha quedado pendiente, como se recordará]):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;\usepackage{bera}&lt;br /&gt;\usepackage[usenames,dvipsnames]{color}&lt;br /&gt;\usepackage{framed}&lt;br /&gt;\usepackage{enumitem}&lt;br /&gt;&lt;br /&gt;\newenvironment{datosAlumno}%&lt;br /&gt;  {\begin{framed}%&lt;br /&gt;     \begin{center}%&lt;br /&gt;       \begin{tabular*}{\textwidth}%&lt;br /&gt;         {@{\extracolsep{\fill}}lr}}%&lt;br /&gt;  {\end{tabular*}\end{center}\end{framed}}&lt;br /&gt;&lt;br /&gt;\newenvironment{Objetivos}%&lt;br /&gt;  {\begin{framed}%&lt;br /&gt;     \section*{Objetivos}%&lt;br /&gt;   \end{framed}%&lt;br /&gt;   \begin{framed}%&lt;br /&gt;     \begin{itemize}[label=\fbox{\textcolor{white}{X}}]}%&lt;br /&gt;  {\end{itemize}\end{framed}}&lt;br /&gt;&lt;br /&gt;\newenvironment{Contenidos}%&lt;br /&gt;  {\begin{framed}%&lt;br /&gt;     \section*{Contenidos}%&lt;br /&gt;   \end{framed}%&lt;br /&gt;   \begin{framed}%&lt;br /&gt;     \begin{itemize}[label=\fbox{\textcolor{white}{X}}]}%&lt;br /&gt;  {\end{itemize}\end{framed}}&lt;br /&gt;&lt;br /&gt;\newenvironment{Propuestas}%&lt;br /&gt;  {\begin{framed}%&lt;br /&gt;     \section*{Propuestas}%&lt;br /&gt;   \end{framed}%&lt;br /&gt;   \begin{framed}%&lt;br /&gt;     \begin{itemize}}%&lt;br /&gt;  {\end{itemize}\end{framed}}&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: ALUMNO &amp; CURSO&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;\begin{Objetivos}&lt;br /&gt;OBJETIVOS&lt;br /&gt;\end{Objetivos}&lt;br /&gt;\begin{Contenidos}&lt;br /&gt;CONTENIDOS&lt;br /&gt;\end{Contenidos}&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;1-ge-objetivos.tex&lt;/code&gt; (el fichero con los objetivos del curso &lt;code&gt;1-ge&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\item Reconocer la diferencia entre los refranes y el buen decir.&lt;br /&gt;\item Adquirir el hábito del buen decir.&lt;br /&gt;\item Refrenar el hábito malsano del refraneo sin ton ni son.&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;1-ge-minimos.tex&lt;/code&gt;: (el fichero con los contenidos mínimos del curso &lt;code&gt;1-ge&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\item El refrán y sus muchos peligros.&lt;br /&gt;\item El decir del caballero versus el decir del bufón.&lt;br /&gt;\item Síntomas alarmantes de la verborrea refranil.&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;notas&lt;/code&gt;: (el fichero con las notas):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Sancho-Panza:1-ge:3&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;generar_informes&lt;/code&gt;: (el guión propiamente dicho [Unimos lo que obtuvimos en el &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html"&gt;análisis de datos&lt;/a&gt; y en el esbozo del &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iv.html"&gt;modelo simple&lt;/a&gt;, con las &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-v-las-comillas.html"&gt;comillas corregidas&lt;/a&gt;]):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION="$HOME/guiones/informe_suspensos"&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;# El nombre del alumno y curso con el formato que tendrán en la salida impresa&lt;br /&gt;ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;br /&gt;CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                          -e 's/ge/EE/' \&lt;br /&gt;                                          -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;    -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;br /&gt;pdflatex Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(Nótese que en este último fichero hemos modificado la variable &lt;code&gt;PROGRAMACIÓN&lt;/code&gt; para que tenga en cuenta la nueva ubicación de nuestros ficheros de objetivos y mínimos, aunque no la vayamos a usar en las órdenes que hemos producido hasta ahora. También hemos añadido una línea al final, para que, al ejecutarse el guión, &lt;code&gt;pdflatex&lt;/code&gt; procese el fichero &lt;code&gt;.tex&lt;/code&gt; resultante de la orden &lt;code&gt;sed&lt;/code&gt; que le precede.)&lt;br /&gt;&lt;br /&gt;Todos estos ficheros deben estar ahora bajo el subdirectorio &lt;code&gt;$HOME/guiones/informe_suspensos&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Queda cambiar el modo del guión:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;chmod u+x informe_suspensos&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y ejecutarlo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;./informe_suspensos&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado, aparte de otros ficheros temporales generados por &lt;code&gt;pdflatex&lt;/code&gt;, es el fichero &lt;code&gt;Sancho-Panza.pdf&lt;/code&gt;, que, en un lector de pdfs como &lt;code&gt;okular&lt;/code&gt;, se muestra con el siguiente aspecto:&lt;br /&gt;&lt;br /&gt;&lt;a id="informe-1" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-HIqqxAvoQI/SiWllkAotAI/AAAAAAAAADM/3YFnVJWari0/s1600-h/informe_Sancho-Panza.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 362px; height: 400px;" src="http://2.bp.blogspot.com/_-HIqqxAvoQI/SiWllkAotAI/AAAAAAAAADM/3YFnVJWari0/s400/informe_Sancho-Panza.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5342858597685048322" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7661385001012040968?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7661385001012040968/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-vi.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7661385001012040968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7661385001012040968'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-vi.html' title='HAL y la burocracia (VI)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-HIqqxAvoQI/SiWllkAotAI/AAAAAAAAADM/3YFnVJWari0/s72-c/informe_Sancho-Panza.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-5554943379207597615</id><published>2009-06-02T11:23:00.003+02:00</published><updated>2009-06-02T23:46:56.866+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (V - las comillas)</title><content type='html'>Como advertíamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iv.html"&gt;ayer&lt;/a&gt;, por los pequeños detalles merodea el diabólico encantamiento. Para desenmascararlo, vamos a realizar unos pocos experimentos.&lt;br /&gt;&lt;br /&gt;En primer lugar, crearemos un variable y le daremos como valor una cadena:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ESCUDERO='Sancho Panza'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Nótese que las comillas son aquí necesarias. De no haberlas puesto, el espacio, un carácter especial en la lengua de HAL (el delimitador que sirve, por ejemplo, para determinar donde termina una orden y empiezan sus argumentos) hubiese sido interpretado por HAL como un separador. Más exactamente, si hubiésemos escrito:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ESCUDERO=Sancho Panza&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;HAL hubiese creado la variable &lt;code&gt;ESCUDERO&lt;/code&gt; con el valor &lt;code&gt;Sancho&lt;/code&gt; y hubiese tratado de ejecutar la inexistente orden &lt;code&gt;Panza&lt;/code&gt;, con el consabido resultado de &lt;code&gt;command not found&lt;/code&gt;. Ni siquiera la variable &lt;code&gt;ESCUDERO&lt;/code&gt; hubiese retenido su valor, &lt;code&gt;Sancho&lt;/code&gt;, porque, como sabemos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/el-supermanual-de-hal.html"&gt;desde hace mucho&lt;/a&gt;, la definición de variables en la misma línea y justo delante de una orden sólo afecta a la ejecución de esa orden.&lt;br /&gt;&lt;br /&gt;Por tanto, las comillas en la anterior definición tienen una función importantísima, permitir que el espacio se interprete literalmente y no como un signo con un valor sintáctico especial. Lo que, en ese ejemplo concreto, implica que el valor de la variable &lt;code&gt;ESCUDERO&lt;/code&gt; será &lt;code&gt;Sancho Panza&lt;/code&gt; (espacio incluido), como podemos comprobar con un simple:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo $ESCUDERO&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;que devuelve:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Sancho Panza&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¿Hubiese sido diferente utilizar dobles comillas en lugar de comillas simples?&lt;br /&gt;&lt;br /&gt;Lo probamos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CABALLERO="Don Quijote"&lt;br /&gt;echo $CABALLERO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Que devuelve, de forma semejante:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Don Quijote&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Parece, pues, que no hay ninguna diferencia entre las comillas simples y las dobles comillas, que es cosa más de gusto que de gramática. Pero eso, justamente, es lo que quieren que creamos los pérfidos encantadores. De hecho, nosotros hemos utilizado hasta ahora ambos tipos de comillas sin mayor cuestionamiento. Pero las apariencias engañan. Veámoslo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo 'El compañero de $CABALLERO es $ESCUDERO'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;produce:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;El compañero de $CABALLERO es $ESCUDERO&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Es algo que deberíamos haber esperado. Las comillas preservan también aquí el significado literal del carácter '&lt;code&gt;$&lt;/code&gt;' y evitan que se interprete como un signo sintáctico especial, a saber, el de proporcionar el valor de la variable que le sigue.&lt;br /&gt;&lt;br /&gt;Sin embargo,&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo "El compañero de $CABALLERO es $ESCUDERO"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;devuelve, sorprendentemente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;El compañero de Don Quijote es Sancho Panza&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La conclusión de nuestro experimento parece obvia, las comillas simples son rejas más seguras que las dobles. En general, de las comillas simples ningún carácter se evade de ser interpretado literalmente, mientras que hay caracteres especiales que no se doblegarán a las comillas dobles y seguirán exigiendo ser interpretados como tales signos sintácticos especiales. Entre estos pocos signos que han conseguido la prevalencia de su característica identidad sintáctica está nuestro querido '&lt;code&gt;$&lt;/code&gt;'.&lt;br /&gt;&lt;br /&gt;Lo que tan interesante conocimiento implica para el código propuesto al final del día pasado es que pone a las claras el origen de su error. Recordemos cuál era el código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e &lt;span style="color:red"&gt;'&lt;/span&gt;s/ALUMNO/$ALUMNO_OUTPUT/&lt;span style="color:red"&gt;'&lt;/span&gt; \&lt;br /&gt;    -e &lt;span style="color:red"&gt;'&lt;/span&gt;s/CURSO/$CURSO_OUTPUT/&lt;span style="color:red"&gt;'&lt;/span&gt; \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las dos primeras expresiones de la orden &lt;code&gt;sed&lt;/code&gt; contienen el signo especial '&lt;code&gt;$&lt;/code&gt;'. Ahora bien, la expansión del valor de las variables &lt;code&gt;ALUMNO_OUTPUT&lt;/code&gt; y &lt;code&gt;CURSO_OUTPUT&lt;/code&gt; no se producirá, puesto que '&lt;code&gt;$&lt;/code&gt;' se interpretará literalmente. Acabaremos con un fichero &lt;code&gt;Sancho-Panza.tex&lt;/code&gt; con las líneas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: $ALUMNO_OUTPUT&lt;br /&gt;Curso: $CURSO_OUTPUT&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La solución, tras lo aprendido hoy, es bien simple, utilizar dobles comillas en las líneas díscolas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/ALUMNO/$ALUMNO_OUTPUT/&lt;span style="color:red"&gt;"&lt;/span&gt; \&lt;br /&gt;    -e &lt;span style="color:red"&gt;"&lt;/span&gt;s/CURSO/$CURSO_OUTPUT/&lt;span style="color:red"&gt;"&lt;/span&gt; \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un lector espabilado podría imaginar una solución incluso más sencilla. Ya que las comillas esconden tantas triquiñuelas, ¿por qué no suprimirlas directamente?:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e s/ALUMNO/$ALUMNO_OUTPUT/ \&lt;br /&gt;    -e s/CURSO/$CURSO_OUTPUT/ \&lt;br /&gt;    ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Desgraciadamente, no funcionaría, aunque sí funcionaría la siguiente solución:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e s/ALUMNO/"$ALUMNO_OUTPUT"/ \&lt;br /&gt;    -e s/CURSO/"$CURSO_OUTPUT"/ \&lt;br /&gt;    ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dejamos como ejercicio para el lector la experimentación y comprensión de las causas del fracaso y el éxito de las dos últimas propuestas.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="comillas-simples"&gt;Las comillas simples permiten que todos los caracteres especiales de la lengua de HAL encerrados en ellas se interpreten literalmente.&lt;/li&gt;&lt;br /&gt;&lt;li id="comillas-dobles"&gt;Las comillas dobles hacen que casi todos los caracteres especiales de la lengua de HAL se interpreten literalmente, salvo algunos pocos (en especial, el carácter '&lt;code&gt;$&lt;/code&gt;'), que seguirán manteniendo su peculiar función sintáctica.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-5554943379207597615?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/5554943379207597615/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-v-las-comillas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5554943379207597615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/5554943379207597615'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/06/hal-y-la-burocracia-v-las-comillas.html' title='HAL y la burocracia (V - las comillas)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-300678582250058349</id><published>2009-05-31T18:32:00.007+02:00</published><updated>2009-06-02T23:44:47.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (IV)</title><content type='html'>Nuestro siguiente paso es imaginar un proceso que, indefectiblemente, nos lleve desde los ficheros de entrada &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html"&gt;descritos ayer&lt;/a&gt; a los informes en pdf requeridos. No es nada de orden diferente a lo que hemos venido haciendo desde el principio de estas conversaciones. En realidad, se trata siempre de lo mismo: pensar en las transformaciones que deben sufrir ciertos datos de entrada para que de ello surja una determinada salida y aplicar las herramientas que HAL pone a nuestra disposición para efectuar dichas transformaciones.&lt;br /&gt;&lt;br /&gt;Podemos, pues, como primer acercamiento, aplicar sin miedo el principio explicado &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-awk.html"&gt;hace tiempo&lt;/a&gt;: reducir el problema a un caso muy simple y crear un modelo de solución para ese caso.&lt;br /&gt;&lt;br /&gt;Asumamos que, en lugar de diferentes informes para múltiples alumnos, queremos generar un único informe para un único alumno ---que sabemos suspenso de antemano. Dicho de otra forma, supongamos que nuestro fichero &lt;code&gt;notas&lt;/code&gt; contiene esta única entrada:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Sancho-Panza:1-ge:3&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Supongamos, además, que los únicos ficheros de objetivos y contenidos mínimos con los que contamos son ---¡bendita la suerte!--- los de 1-ge, es decir:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1-ge-objetivos.tex&lt;br /&gt;1-ge-contenidos.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Supongamos, finalmente ---y para hacer más divertido el ejemplo--- que el contenido de tales ficheros es el siguiente:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Contenido de &lt;code&gt;1-ge-objetivos.tex&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\item Reconocer la diferencia entre los refranes y el buen decir.&lt;br /&gt;\item Adquirir el hábito del buen decir.&lt;br /&gt;\item Refrenar el hábito malsano del refraneo sin ton ni son.&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Contenido de &lt;code&gt;1-ge-minimos.tex&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\item El refrán y sus muchos peligros.&lt;br /&gt;\item El decir del caballero versus el decir del bufón.&lt;br /&gt;\item Síntomas alarmantes de la verborrea refranil.&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para generar con &lt;code&gt;pdflatex&lt;/code&gt; un pdf como el que se muestra en la &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html#informe-propuestas"&gt;imagen propuesta&lt;/a&gt; en el primer artículo de esta serie ---actualizado con los objetivos y contenidos que acabamos de presentar---, deberíamos disponer de un fichero &lt;code&gt;.tex&lt;/code&gt;, con un aspecto semejante al siguiente [El preámbulo se omite, y se presupone, sin mayor explicación, que los entornos &lt;code&gt;Objetivos&lt;/code&gt;, &lt;code&gt;Contenidos&lt;/code&gt; y &lt;code&gt;Propuestas&lt;/code&gt; han sido definidos en dicho preámbulo como tipos especiales de listas. (Ver &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-i.html"&gt;este artículo&lt;/a&gt; para refrescar la memoria sobre los entornos y listas en LaTeX)]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: &lt;span style="color:red"&gt;Sancho Panza&lt;/span&gt;&lt;br /&gt;Curso: &lt;span style="color:red"&gt;1.º EE&lt;/span&gt;&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;&lt;br /&gt;\begin{Objetivos}&lt;br /&gt;&lt;span style="color:red"&gt;\input{1-ge-objetivos}&lt;/span&gt;&lt;br /&gt;\end{Objetivos}&lt;br /&gt;&lt;br /&gt;\begin{Contenidos}&lt;br /&gt;&lt;span style="color:red"&gt;\input{1-ge-minimos}&lt;/span&gt;&lt;br /&gt;\end{Contenidos}&lt;br /&gt;&lt;br /&gt;\begin{Propuestas}&lt;br /&gt;&lt;span style="color:purple"&gt;???&lt;/span&gt;&lt;br /&gt;\end{Propuestas}&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Compárese con la plantilla redactada el día pasado:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: &lt;span style="color:red"&gt;ALUMNO&lt;/span&gt;&lt;br /&gt;Curso: &lt;span style="color:red"&gt;CURSO&lt;/span&gt;&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;&lt;br /&gt;\begin{Objetivos}&lt;br /&gt;&lt;span style="color:red"&gt;OBJETIVOS&lt;/span&gt;&lt;br /&gt;\end{Objetivos}&lt;br /&gt;&lt;br /&gt;\begin{Contenidos}&lt;br /&gt;&lt;span style="color:red"&gt;CONTENIDOS&lt;/span&gt;&lt;br /&gt;\end{Contenidos}&lt;br /&gt;&lt;br /&gt;\begin{Propuestas}&lt;br /&gt;&lt;span style="color:purple"&gt;RECUPERACIÓN&lt;/span&gt;&lt;br /&gt;\end{Propuestas}&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Resulta evidente, que salvo para el caso de las propuestas de recuperación [en púrpura], que discutiremos más adelante, nuestro trabajo, esto es, el trabajo que HAL debería realizar para obtener el fichero &lt;code&gt;.tex&lt;/code&gt; del informe de Sancho Panza, digamos, &lt;code&gt;Sancho-Panza.tex&lt;/code&gt;, es simplemente sustituir lo que en la plantilla aparece en rojo por lo que, en el mismo color, debe aparecer en el citado informe.&lt;br /&gt;&lt;br /&gt;Representemos en lengua de HAL las sustituciones deseadas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed 's/ALUMNO/Sancho Panza/' informe_plantilla.tex &gt; Sancho-Panza.tex&lt;br /&gt;sed 's/CURSO/1.º EE/' informe_plantilla.tex &gt; Sancho-Panza.tex&lt;br /&gt;sed 's/OBJETIVOS/\\input{1-ge-objetivos}/' informe_plantilla.tex &gt; Sancho-Panza.tex&lt;br /&gt;sed 's/CONTENIDOS/\\input{1-ge-minimos}/' informe_plantilla.tex &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si utilizamos la opción &lt;code&gt;-e&lt;/code&gt; de &lt;code&gt;sed&lt;/code&gt; podemos enviar varias órdenes, una tras otra, a &lt;code&gt;sed&lt;/code&gt; y reducir la redundancia en las líneas anteriores. Podemos, además, referirnos al fichero que contiene la plantilla a través de la variable &lt;code&gt;PLANTILLA&lt;/code&gt; que con ese propósito creamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html"&gt;el día pasado&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e 's/ALUMNO/Sancho Panza/' \&lt;br /&gt;    -e 's/CURSO/1.º EE/' \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mientras que las dos últimas ordenes de sustitución de la instrucción anterior son válidas tal cual, las dos primeras exigen un tratamiento especial. Las cadenas de caracteres "Sancho Panza" y "1.º EE" no forman parte de nuestros datos de entrada. Debemos, pues, obtenerlas a partir de ellos mediante alguna clase de manipulación. El nombre y curso del alumno, como ya hemos comentado, forman parte del contenido del fichero &lt;code&gt;notas&lt;/code&gt;, concretamente, son su primer y segundo campo, respectivamente, donde cada campo está separado por el carácter '&lt;code&gt;:&lt;/code&gt;'. Para una operación de extracción de este tipo podemos utilizar, como sabemos, una orden como &lt;code&gt;cut&lt;/code&gt;. Así, el campo del nombre se obtendría mediante la orden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cut -d':' -f1 notas&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O, aplicando la variable &lt;code&gt;NOTAS&lt;/code&gt;, tal como hemos hecho con la variable &lt;code&gt;PLANTILLA&lt;/code&gt; en la instrucción &lt;code&gt;sed&lt;/code&gt; anterior:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cut -d':' -f1 $NOTAS&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Mutatis mutandis&lt;/em&gt;, la siguiente orden extrae del fichero &lt;code&gt;notas&lt;/code&gt; el campo relativo al curso:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cut -d':' -f2 $NOTAS&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora bien, el contenido de estos campos no es exactamente el que buscamos. El contenido es, respectivamente, &lt;code&gt;Sancho-Panza&lt;/code&gt; y &lt;code&gt;1-ge&lt;/code&gt;, pero en el informe deseamos que, en lugar del guión, sea un espacio el que separe nombre y apellido del alumno y que, en lugar de &lt;code&gt;1-ge&lt;/code&gt; aparezca la expresión &lt;code&gt;1º. EE&lt;/code&gt; como identificador del curso ('EE' y 'EP' están por enseñanzas elementales y profesionales, nueva denominación oficial de lo que hace pocos años se denominaban grado elemental y medio, para inri del hacedor de guiones).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed&lt;/code&gt; puede ayudarnos de nuevo a la hora de efectuar las conversiones aludidas.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;'s/-/ /g'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;sustituiría los guiones por espacios en la línea de entrada.&lt;br /&gt;&lt;br /&gt;Por su parte la más compleja serie de órdenes&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;'s/\([[:digit:]]*\)-\(.*\)/\1\.º \2/'&lt;br /&gt;'s/ge/EE/'&lt;br /&gt;'s/gm/EP/'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;convertiría &lt;code&gt;1-ge&lt;/code&gt; en &lt;code&gt;1.º EE&lt;/code&gt; [La tercera sustitución, que convierte &lt;code&gt;gm&lt;/code&gt; en &lt;code&gt;EP&lt;/code&gt; no es necesaria en el caso simple actual, pero la incluimos ya desde ahora mismo con el fin de evitar referirnos a un proceso tan elemental de sustitución en explicaciones posteriores].&lt;br /&gt;&lt;br /&gt;Las dos últimas órdenes de esta operación de conversión son obvias, pero la primera puede resultar algo difícil de entender a simple vista. Valga su explicación de repaso de algunas minucias de &lt;code&gt;sed&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Cualquier serie de números que aparezca en la línea de entrada encajará con la expresión '&lt;code&gt;[[:digit:]]*&lt;/code&gt;' y cualquier serie de caracteres con la expresión '&lt;code&gt;.*&lt;/code&gt;'. Por tanto, el molde '&lt;code&gt;[[:digit:]]*-.*&lt;/code&gt;' nos permitirá "cazar" cualquier serie de caracteres constituida por cualquier sucesión de números, seguida de guión y seguido éste último por cualesquiera otros caracteres. En consecuencia, algo como nuestra cadena "&lt;code&gt;1-ge&lt;/code&gt;" encajará con ese molde. Puesto que, en la sustitución, queremos reutilizar, por un lado, el número inicial y, por otro, lo que sigue al guión para su posterior conversión mediante las órdenes de &lt;code&gt;sed&lt;/code&gt; subsiguientes, guardamos lo que encaje con ambas expresiones en registros temporales, esto es, encerramos entre paréntesis convenientemente escapados los correspondientes moldes, y aplicamos, luego, en el patrón de sustitución, las construcciones especiales &lt;code&gt;\1&lt;/code&gt; y &lt;code&gt;\2&lt;/code&gt; para recuperar lo guardado en dichos registros. El resto es también trivial, el guión acaba sustituido por ".º ", donde el punto debe escaparse, al tratarse de una carácter especial de &lt;code&gt;sed&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Si reunimos todas las piezas, los &lt;code&gt;cut&lt;/code&gt; que extraen el nombre y curso del alumno, tal como aparecen en el fichero &lt;code&gt;notas&lt;/code&gt;, y los &lt;code&gt;sed&lt;/code&gt; que convertirían tales datos al formato que tendrán en el fichero &lt;code&gt;Sancho-Panza.tex&lt;/code&gt; de salida, obtenemos estas dos órdenes complejas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cut -d':' -f1 $NOTAS | sed -e 's/-/ /g'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;que devolverá:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Sancho Panza&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y la más engorrosa:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                           -e 's/ge/EE/' \&lt;br /&gt;                           -e 's/gm/EP/'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;que devolverá:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;1.º EE&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El paso final está a un tiro de piedra. El resultado de estas dos órdenes debe aparecer como segundo miembro en las instrucciones &lt;code&gt;sed&lt;/code&gt; de sustitución propuestas al principio. Este resultado se puede obtener mediante el recurso sintáctico de la sustitución de órdenes. O sea, que nuestro esbozo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e 's/ALUMNO/&lt;span style="color:red"&gt;Sancho Panza&lt;/span&gt;/' \&lt;br /&gt;    -e 's/CURSO/&lt;span style="color:red"&gt;1.º EE&lt;/span&gt;/' \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;debe completarse como es debido de la forma siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sed -e 's/ALUMNO/&lt;span style="color:red"&gt;$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;/span&gt;/' \&lt;br /&gt;    -e 's/CURSO/&lt;span style="color:red"&gt;$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                             -e 's/ge/EE/' \&lt;br /&gt;                                             -e 's/gm/EP/')&lt;/span&gt;/' \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CURSO/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;¡Buf! algo difícil de digerir de una tacada. Conviene reducir la complejidad a la vista mediante el uso de variables cuyos valores sean las sustituciones de órdenes que acabamos de encajar con calzador:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')&lt;br /&gt;CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                          -e 's/ge/EE/' \&lt;br /&gt;                                          -e 's/gm/EP/')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que permite obtener esta expresión final algo más digerible:&lt;br /&gt;&lt;pre id="generar-tex"&gt;&lt;br /&gt;sed -e 's/ALUMNO/&lt;span style="color:red"&gt;$ALUMNO_OUTPUT&lt;/span&gt;/' \&lt;br /&gt;    -e 's/CURSO/&lt;span style="color:red"&gt;$CURSO_OUTPUT&lt;/span&gt;/' \&lt;br /&gt;    -e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \&lt;br /&gt;    -e 's/CONTENIDOS/\\input{1-ge-minimos}/' $PLANTILLA &gt; Sancho-Panza.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;No estáría mal para un entremés, Sancho amigo, si no fuera porque &lt;strong&gt;contiene un grave error&lt;/strong&gt;. Y es que no hay que descuidarse de los encantamientos que, agazapados en nuestros más inocuos utensilios de cocina, pueden amargar hasta la olla mejor cocinada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-300678582250058349?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/300678582250058349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iv.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/300678582250058349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/300678582250058349'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iv.html' title='HAL y la burocracia (IV)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8419777893210394747</id><published>2009-05-30T21:11:00.005+02:00</published><updated>2009-05-31T19:27:02.518+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (III - los datos)</title><content type='html'>Una de las primerísimas cosas que hacemos cuando escribimos un guión para HAL es el análisis de los datos que queremos procesar y de los datos resultantes. En guiones sumamente simples, como los escritos hasta ahora, este análisis se suele realizar de una manera inconsciente. Cuando el guión es algo menos simple resulta casi siempre necesario y, en general, más que recomendable, plantearse conscientemente con qué clase de cosas nos vamos a ensuciar las manos. En guiones complejos, un análisis precipitado conduce, en el mejor de los casos, a un diseño ineficaz y, en el peor, a un resultado infumable.&lt;br /&gt;&lt;br /&gt;El guión que nos ocupa es simple y no hace falta demorarse demasiado en esta fase inicial. Por otra parte, hay que buscar un equilibrio entre lo que deseamos hacer y el tiempo que deseamos dedicar a hacerlo. Para un asunto engorroso e impremeditado, como el que seguramente supondría para cualquiera la escritura del actual guión, puede ser suficiente una solución relativamente &lt;a href="http://es.wikipedia.org/wiki/Rápido_y_sucio"&gt;rápida y sucia&lt;/a&gt;. De hecho, el guión propuesto es realmente rápido y sucio. Se puede (¿se debe?) mejorar en muchos sentidos. Pero el tiempo apremia y las ganas son pocas. No obstante, e incluso desde estas premisas, no conviene infringir de entrada absolutamente todas las normas de buen comportamiento. Al menos, veamos por el rabillo del ojo qué cosas están presentes y cuáles aparecerán en nuestra caótica mesa.&lt;br /&gt;&lt;br /&gt;Empecemos por lo que queremos obtener. Se recordará de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-ii.html"&gt;la anterior entrada&lt;/a&gt; que lo que se nos pide es un informe por alumno (por cada alumno suspenso). Un fichero pdf por alumno es lo más aconsejable en este caso para obtener una copia impresa, y si además lo generamos vía &lt;code&gt;pdflatex&lt;/code&gt;, mejor que mejor.&lt;br /&gt;&lt;br /&gt;¿Con qué contamos para poder generar esta serie de ficheros? &lt;br /&gt;&lt;br /&gt;Contamos, naturalmente, con la programación de la asignatura. Por suerte, esta programación ---un escrito tan largo como aburrido, plagado de repeticiones internas---, ha sido preparado con LaTeX y está dividido en ficheros independientes que luego se componen en un fichero único. Esta técnica de escribir documentos largos, que tantos quebraderos de cabeza supone para los usuarios de procesadores de textos, es pan comido en el mundo de TeX con una instrucción LaTeX como &lt;code&gt;\input{fichero}&lt;/code&gt; o &lt;code&gt;\include{fichero}&lt;/code&gt;, que permite incluir el contenido de un fichero dentro de otro. Por tanto, disponemos, para empezar, de ficheros &lt;code&gt;.tex&lt;/code&gt; adecuadamente nombrados. Así, por ejemplo, los ficheros que definen los contenidos mínimos por curso, poseen la denominación genérica: &lt;code&gt;&lt;em&gt;curso&lt;/em&gt;-&lt;em&gt;nivel&lt;/em&gt;-mínimos.tex&lt;/code&gt;, donde &lt;code&gt;&lt;em&gt;curso&lt;/em&gt;&lt;/code&gt; está por &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;, etc, y &lt;code&gt;&lt;em&gt;nivel&lt;/code&gt;&lt;/em&gt; está por &lt;code&gt;ge&lt;/code&gt; o &lt;code&gt;gm&lt;/code&gt;, abreviaturas de la denominación oficial, en el momento en que se redactó la programación, del grado o nivel de los cursos correspondientes ("grado elemental" y "grado medio", respectivamente).&lt;br /&gt;La sintaxis interna de cada uno de estos ficheros es la que cabe esperar de un fichero LaTeX para listas, en concreto, un texto etiquetado con las siguientes etiquetas, como mínimo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\begin{itemize}&lt;br /&gt;\item Texto del primer item&lt;br /&gt;...&lt;br /&gt;\end{itemize}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo segundo con lo que contamos es con un fichero de texto plano que contiene las notas de los alumnos, el fichero &lt;code&gt;notas&lt;/code&gt;. Dicho fichero está compuesto por líneas, cada de una de las cuales es un registro por alumno de la forma:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;alumno:curso:nota&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y donde, a su vez, el nombre del alumno, primer campo del fichero, responde a la convención sintáctica&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Nombre-Apellido1-Apellido2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En concreto, nuestro fichero &lt;code&gt;notas&lt;/code&gt; es el siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Don-Quijote-de-la-Mancha:6-gm:10&lt;br /&gt;Sancho-Panza:1-ge:3&lt;br /&gt;Sansón-Carrasco:3-gm:4&lt;br /&gt;Dulcinea-del-Toboso:1-gm:5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Casi sobra insistir en la decisiva importancia que tiene seguir convenciones sintácticas uniformes en ficheros de texto procesables por HAL, como el descrito.&lt;br /&gt;&lt;br /&gt;¿Son estos ficheros suficientes para producir la deseada salida en pdf? Evidentemente, no. Puesto que necesitamos un fichero distinto para cada alumno, debemos crear una plantilla común para todos ellos que se llene con los datos específicos de cada alumno en particular. Puesto que, además, deseamos recurrir a &lt;code&gt;pdflatex&lt;/code&gt; para obtener el pdf de cada alumno, este plantilla tiene que ser, ella misma, un fichero &lt;code&gt;.tex&lt;/code&gt;. Podremos, entonces, utilizar la instrucción &lt;code&gt;\input&lt;/code&gt; para añadir los ficheros de contenidos u objetivos deseados dentro de esa plantilla y utilizar fragmentos de textos apropiados para designar los campos variables en ella. Una plantilla con estas características, que se amolda al documento de salida requerido tendría la forma siguiente:&lt;br /&gt;&lt;pre id="informe-plantilla"&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\begin{datosAlumno}&lt;br /&gt;Alumno: ALUMNO&lt;br /&gt;Curso: CURSO&lt;br /&gt;\end{datosAlumno}&lt;br /&gt;&lt;br /&gt;\begin{Objetivos}&lt;br /&gt;OBJETIVOS&lt;br /&gt;\end{Objetivos}&lt;br /&gt;&lt;br /&gt;\begin{Contenidos}&lt;br /&gt;CONTENIDOS&lt;br /&gt;\end{Contenidos}&lt;br /&gt;&lt;br /&gt;\begin{Propuestas}&lt;br /&gt;RECUPERACIÓN&lt;br /&gt;\end{Propuestas}&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se habrá observado que hemos omitido, para abreviar, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iii.html"&gt;el preámbulo del documento LaTeX&lt;/a&gt;, donde, además, se tendrían que incluir las definiciones apropiadas de los &lt;em&gt;entornos&lt;/em&gt; &lt;code&gt;datosAlumno&lt;/code&gt;, &lt;code&gt;Objetivos&lt;/code&gt;, &lt;code&gt;Contenidos&lt;/code&gt; y &lt;code&gt;Propuestas&lt;/code&gt;, definiciones que se establecen mediante la instrucción &lt;code&gt;\newenvironment&lt;/code&gt;, que hace las veces de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v-borrador.html"&gt;&lt;code&gt;\newcommand&lt;/code&gt;&lt;/a&gt;, pero en la definición de entornos personalizados, y que no vamos a comentar ahora por tratarse de cuestiones específicas de LaTeX que nos desviarían de nuestro objetivo actual.&lt;br /&gt;&lt;br /&gt;En resumen, los datos de entrada imprescindibles de nuestro guión, lo que HAL utilizará para obtener los pdfs, son los siguientes ficheros:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Ficheros &lt;code&gt;.tex&lt;/code&gt; de los objetivos y mínimos por cursos, ubicados en el directorio que contiene la programación (&lt;code&gt;/home/luis/conservatorio/programacion-loe&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1-ge-objetivos.tex&lt;br /&gt;2-ge-objetivos.tex&lt;br /&gt;...&lt;br /&gt;1-gm-objetivos.tex&lt;br /&gt;2-gm-objetivos.tex&lt;br /&gt;...&lt;br /&gt;1-ge-minimos.tex&lt;br /&gt;2-ge-minimos.tex&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El fichero &lt;code&gt;informe_plantilla.tex&lt;/code&gt; que contiene la plantilla para generar los informes por alumno y que reside en el mismo directorio que contiene el guion.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El fichero de texto &lt;code&gt;notas&lt;/code&gt; que contiene registros por alumno con el formato &lt;code&gt;alumno:curso:nota&lt;/code&gt;, ubicado también en el directorio donde reside el guión.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Tras el análisis de los datos de entrada, podemos proceder a indicárselos a HAL:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION=/home/luis/conservatorio/programacion-loe&lt;br /&gt;&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A éstas variables podemos añadir la que corresponde a la nota mínima que debe obtener el alumno para aprobar el curso, un valor que, sin lugar a dudas, tendremos que utilizar en algún momento:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hemos puesto los cimientos. Se observará que estas líneas reproducen tal cual las líneas iniciales del guión completo presentado &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html#generar-informes"&gt;el día pasado&lt;/a&gt;, con la excepción de la variable &lt;code&gt;NOLATEX&lt;/code&gt;, cuyo sentido se explicará a su debido tiempo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;El análisis de los datos de entrada de un guión es un requisito previo imprescindible en la elaboración de guiones o programas.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los nombres de ficheros de entrada y de los directorios donde residen son candidatos ideales a aparecer como valores de las variables iniciales de un guión.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8419777893210394747?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8419777893210394747/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8419777893210394747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8419777893210394747'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-iii-los-datos.html' title='HAL y la burocracia (III - los datos)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-6346488151789310008</id><published>2009-05-30T19:45:00.003+02:00</published><updated>2009-05-30T21:01:14.432+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (II)</title><content type='html'>El porqué y el para qué del guión propuesto &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html"&gt;el día pasado&lt;/a&gt; es bien simple. A HAL, por descontado, no le interesa lo más mínimo, porque él opera en un nivel de abstracción de orden radicalmente distinto al nuestro, un nivel en el que es totalmente indiferente el asunto sobre el que va a girar nuestro guión del caso. Pero a nosotros, los que leemos o escribimos el guión, nos resulta indispensable, como a cualquier buen novelista, tener algo más que una noción ligera de la materia sobre la que vamos a tratar. En terminología técnica, el asunto sobre el versa en general un programa ---y un guión es un miniprograma, como ya hemos visto--- se suele denominar su &lt;em&gt;dominio&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;El dominio de nuestro guión, como resulta fácil de deducir por el nombre dado a algunas de sus variables, tiene que ver con la enseñanza y, en concreto, con el proceso que los pedagogos llaman evaluación. Hasta ahí todos tenemos idea de qué va: un alumno tiene una nota, resultado de su evaluación. El alumno puede aprobar o suspender. En nuestro país la nota mínima suele ser el 5, aunque sobre eso hay discusiones, a veces enconadas ---particularmente, entre alumnos o padres, de un lado, y profesores, del otro---, en las que no vamos a entrar.&lt;br /&gt;&lt;br /&gt;Hasta aquí nada nuevo bajo el cielo, ha sido así toda la vida. Pero lo que quizá algunos lectores no sepan es que, una vez que los psicopedagogos y otros teóricos decidieron tomar cartas en el asunto educativo ---con los resultados que todos conocen y que tampoco vamos a comentar en este momento---, se ha producido una proliferación imparable de tecnicismos y de sus correspondientes encarnaciones escritas, que incluyen toda clase de informes, documentos y estadísticas con nombres de significado difuso o simplemente ininteligible y funciones imposibles de describir por una mente como la del autor. En este abigarrado universo lingüístico-burocrático se desenvuelven cotidianamente una parte de las actividades de la comunidad educativa, y cómo no, el procedimiento de evaluación, o séase, el acto de poner el aprobado o el suspenso al alumno.&lt;br /&gt;&lt;br /&gt;Como no merece la pena extenderse en el asunto más de lo debido, basten unas mínimas aclaraciones, las suficientes para poder comprender el &lt;em&gt;dominio&lt;/em&gt; de nuestro guión. &lt;br /&gt;&lt;br /&gt;Las legislaciones educativas del tiempo presente establecen que el contenido de la enseñanza sea programado ---y que se redacte la correspondiente "programación"--- de acuerdo a unos apartados generales definidos por defecto, entre los cuales se encuentran los "objetivos" y los "contenidos", que vienen a ser algo así como la cuenta al detalle en forma de elementos de una lista, de lo que se va a enseñar ---como si esto fuera posible. Dentro de los contenidos, están los "mínimos", que definen, dicho en castizo, lo que el alumno debe saber si no quiere romperse los codos en verano.&lt;br /&gt;&lt;br /&gt;Desentrañar la diferencia existente entre "objetivos" y "contenidos" rebasa la competencia lingüística y probablemente mental de la mayoría, incluido el autor, que da por inútil e improcedente el intento de acometer tal empresa.&lt;br /&gt;&lt;br /&gt;Pues bien, resulta que de un tiempo a esta parte, cuando un alumno suspende, el profesor está obligado a confeccionar un informe en el que consten, por este orden:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Los "objetivos" que no ha superado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los "contenidos" (mínimos) que tampoco ha superado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lo que, en concreto, tiene que hacer para superar o "recuperar" dichos "objetivos"-"contenidos" ---y no cuela lo de "estudia, amigo, más te vale".&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Si con este conocimiento del dominio volvemos a mirar el código de nuestro guión, veremos que las variables ya tienen todas un significado claro. Del contenido de esas variables, en otras palabras, de los datos concretos ---el papeleo existente y consiguiente--- que vamos a manejar, trataremos en la próxima conversación. Por cierto, que entre tanta pedagogía de nuevo cuño, HAL ha quedado mudo en ésta :-(&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;El conocimiento del &lt;em&gt;dominio&lt;/em&gt; sobre el que versa un programa o un guión es un requisito fundamental, previo a cualquier intento de escritura.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-6346488151789310008?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/6346488151789310008/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6346488151789310008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/6346488151789310008'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-ii.html' title='HAL y la burocracia (II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1513683196841540423</id><published>2009-05-24T23:35:00.013+02:00</published><updated>2009-06-05T12:27:11.370+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y la burocracia (I)</title><content type='html'>Entre los muchos impedimentos que han hecho imposible al autor de estos artículos mantener el frenético ritmo de escritura de meses pasados se cuentan las obligaciones laborales, algunas de las cuales han resultado, sin embargo, menos onerosas gracias a la ayuda impagable del propio HAL.&lt;br /&gt;&lt;br /&gt;¿Por qué no regresar, al menos provisionalmente, al recuento de estas amigables conversaciones justo para demostrar la utilidad de HAL en esos menesteres tan potencialmente aburridos como inevitables de las tareas burocráticas, ésas de las que echamos pestes, pero que, sin arreglo posible, consumen nuestro precioso tiempo creativo en lo que parece un irrefrenable y pantagruélico festín del papeleo por todos los ámbitos profesionales?&lt;br /&gt;&lt;br /&gt;Sí, abandonamos el terreno de las aplicaciones, lo dejamos pendiente hasta mejor ver, para adentrarnos un poco más en el de la conversación compleja, esto es, la escritura de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/guiones-para-hal.html"&gt;guiones&lt;/a&gt;, cuyo colofón aconteció en &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-awk-el-entorno-y-otras.html"&gt;esta conversación&lt;/a&gt; y en las que la precedieron.&lt;br /&gt;&lt;br /&gt;Sin mayor explicación y, sin duda, con brutalidad excesiva, veamos el guión que vamos a obtener a lo largo de los próximos días y su efecto inmediato. &lt;br /&gt;&lt;br /&gt;Paciencia. El porqué, el para qué y el cómo se explicarán a su debido tiempo (muy pronto). Pero por un sitio hay que empezar y hacerlo de esta forma tan brusca e inopinada es un manera de comprometer al autor y de evitar que siga enmudecido por tiempo indeterminado.&lt;br /&gt;&lt;br /&gt;El guion:&lt;br /&gt;&lt;pre id="generar-informes"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;#### Directorios y ficheros&lt;br /&gt;# Directorio que contiene la programación del curso&lt;br /&gt;PROGRAMACION=/home/luis/conservatorio/programacion-loe&lt;br /&gt;# Fichero que contiene la plantilla LaTeX del informe&lt;br /&gt;PLANTILLA=informe_plantilla.tex&lt;br /&gt;# Fichero que contiene las notas de los alumnos&lt;br /&gt;NOTAS=notas&lt;br /&gt;# Fichero sed para limpiar etiquetas LaTeX&lt;br /&gt;NOLATEX=limpiar_tex.sed&lt;br /&gt;&lt;br /&gt;#### Datos estáticos (constantes)&lt;br /&gt;# Sufijo de los ficheros de objetivos por cursos&lt;br /&gt;OBJETIVOS=objetivos.tex&lt;br /&gt;# Sufijo de los ficheros de contenidos por cursos&lt;br /&gt;CONTENIDOS=minimos.tex&lt;br /&gt;# La nota mínima para aprobar el curso&lt;br /&gt;NOTA_MINIMA=5&lt;br /&gt;&lt;br /&gt;for linea in $(cat $NOTAS)&lt;br /&gt;  do&lt;br /&gt;    if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ] &lt;br /&gt;    then&lt;br /&gt;      # Nombre y curso del alumno tal como constan en el fichero $NOTAS&lt;br /&gt;      ALUMNO=$(echo $linea | cut -d':' -f1)&lt;br /&gt;      CURSO=$(echo $linea | cut -d':' -f2)&lt;br /&gt;&lt;br /&gt;      # Nombre y curso con el formato que tendrán en la salida impresa&lt;br /&gt;      ALUMNO_OUTPUT=$(echo $ALUMNO | sed -e 's/-/ /g')&lt;br /&gt;      CURSO_OUTPUT=$(echo $CURSO | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \&lt;br /&gt;                                       -e 's/ge/EE/' \&lt;br /&gt;                                       -e 's/gm/EP/')&lt;br /&gt;&lt;br /&gt;      # Ficheros que contienen los objetivos y contenidos del curso&lt;br /&gt;      # en que el alumno está matriculado&lt;br /&gt;      F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS&lt;br /&gt;      F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS&lt;br /&gt;&lt;br /&gt;      # Los objetivos y contenidos en un formato apto para la plantilla&lt;br /&gt;      # a partir de la que se genera el informe&lt;br /&gt;      sed -f $NOLATEX $F_OBJETIVOS &gt; objetivos_tmp.tex&lt;br /&gt;      sed -f $NOLATEX $F_CONTENIDOS &gt; contenidos_tmp.tex&lt;br /&gt;&lt;br /&gt;      # Las propuestas de trabajo se deben introducir interactivamente&lt;br /&gt;      echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "&lt;br /&gt;      cat &gt; trabajo_tmp.tex&lt;br /&gt;&lt;br /&gt;      # Construcción del fichero .tex del informe a partir de la plantilla&lt;br /&gt;      sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \&lt;br /&gt;          -e "s/CURSO/$CURSO_OUTPUT/" \&lt;br /&gt;          -e 's/OBJETIVOS/\\input{objetivos_tmp}/' \&lt;br /&gt;          -e 's/CONTENIDOS/\\input{contenidos_tmp}/' \&lt;br /&gt;          -e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA &gt; ${ALUMNO}.tex&lt;br /&gt;&lt;br /&gt;      # Generación del pdf del informe e impresión&lt;br /&gt;      pdflatex ${ALUMNO}.tex &gt; /dev/null&lt;br /&gt;      # okular ${ALUMNO}.pdf 2&gt; /dev/null &amp;&lt;br /&gt;      lp ${ALUMNO}.pdf &gt; /dev/null&lt;br /&gt;    &lt;br /&gt;      # Eliminación del los ficheros temporales creados&lt;br /&gt;      rm *_tmp.tex&lt;br /&gt;      rm $(ls ${ALUMNO}* | grep -v '\.pdf')&lt;br /&gt;    fi&lt;br /&gt;  done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un fragmento del resultado:&lt;br /&gt;&lt;br /&gt;&lt;a id="informe-propuestas" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-HIqqxAvoQI/ShnErQCKTlI/AAAAAAAAADE/nMC7JUFnGVk/s1600-h/generar_informes.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_-HIqqxAvoQI/ShnErQCKTlI/AAAAAAAAADE/nMC7JUFnGVk/s400/generar_informes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5339515080541883986" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1513683196841540423?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1513683196841540423/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1513683196841540423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1513683196841540423'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/05/hal-y-la-burocracia-i.html' title='HAL y la burocracia (I)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-HIqqxAvoQI/ShnErQCKTlI/AAAAAAAAADE/nMC7JUFnGVk/s72-c/generar_informes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7921112403875543912</id><published>2009-04-18T12:14:00.002+02:00</published><updated>2009-04-18T12:25:20.685+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL no está mudo</title><content type='html'>Sé que tengo (o tenía ;-) ) algunos buenos lectores de las 'Conversaciones con HAL'. Como habrán observado, desde hace más de dos semanas no envío nada, lo que contrasta con el ritmo casi frenético de los meses anteriores.&lt;br /&gt;&lt;br /&gt;Bien, la verdad es que ahora dispongo de menos tiempo libre para esto. Lo cual no significa que abandone el proyecto. Seguiré en él, si nada fortuito se opone, pero, por lo pronto, a un ritmo mucho más pausado. Espero, al menos, poder escribir algo antes de que termine este mes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7921112403875543912?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7921112403875543912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-no-esta-mudo.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7921112403875543912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7921112403875543912'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-no-esta-mudo.html' title='HAL no está mudo'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4866580271092817817</id><published>2009-04-02T21:30:00.009+02:00</published><updated>2009-04-03T23:32:54.973+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y crip (II)</title><content type='html'>Después de la información sobre el proceso de instalación, el &lt;code&gt;README&lt;/code&gt; de &lt;code&gt;crip&lt;/code&gt; nos proporciona unas muy breves instrucciones de uso que se completan con un tutorial en la Web al que se remite. No dice nada de las opciones en la línea de órdenes ni de las variables del fichero de configuración. &lt;br /&gt;&lt;br /&gt;Las opciones de la orden &lt;code&gt;crip&lt;/code&gt; se obtienen, a falta de una página de manual, que sí incluye Debian, ejecutando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;crip --help&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;lo que da la siguiente lista:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Options:&lt;br /&gt;  -h, --help        Print this help then exit&lt;br /&gt;  -i, --info        Print crip variable information then exit&lt;br /&gt;  -v, --version     Print version of crip then exit&lt;br /&gt;  -e codec          Encode to vorbis or flac (default = vorbis)&lt;br /&gt;  -s media          Specify the source media (default = CD)&lt;br /&gt;  -g genre          Specify the music genre (default = classical)&lt;br /&gt;  -q [on/off]       Classical-style questioning (default = off)&lt;br /&gt;  -m [on/off]       Map European to American-only chars (default = off)&lt;br /&gt;  -t [on/off]       Trim leading/trailing silence (default = off)&lt;br /&gt;  -n [on/off]       Normalize the audio (default = off)&lt;br /&gt;  -V volthresh      Volume threshold for normalizing (default = 1.078)&lt;br /&gt;                       (only used when normalizing is enabled)&lt;br /&gt;  -r [on/off]       Remove files after encoding (default = on)&lt;br /&gt;  -E editor         Editor to use (default = vim)&lt;br /&gt;  -u [on/off/both]  Use editor to name the files (default = on)&lt;br /&gt;                       (as opposed to the command-line)&lt;br /&gt;  -o " flags"       Flags to pass to oggenc (default = '-q 5')&lt;br /&gt;  -f " flags"       Flags to pass to flac (default = '--best --replay-gain')&lt;br /&gt;  -c " flags"       Flags to pass to cdparanoia (default = '-v -z')&lt;br /&gt;  -d device         CDrom device to read from (default = /dev/cdrom)&lt;br /&gt;  -w [on/off]       Skip the ripping (makes empty .wav files) (default = off)&lt;br /&gt;                       (useful if you already have the .wav files to encode)&lt;br /&gt;  -p [on/off]       Prompt to continue after ripping (default = off)&lt;br /&gt;                       (useful pause to edit .wav files before encoding)&lt;br /&gt;  -x [on/off]       Eject CD when done ripping (default = off)&lt;br /&gt;  -P proxyserver    Pass an http proxy to CDDB_get if necessary&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las más interesantes para nosotros ahora son estas dos:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Determina el formato del fichero de audio que vamos a generar. Recibe como argumento &lt;code&gt;vorbis&lt;/code&gt;, que producirá un fichero OGG (opción activada por defecto) o &lt;code&gt;flac&lt;/code&gt;, que producirá un fichero FLAC)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;-m&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Convierte los caracteres europeos (letras acentuadas, letras con diéresis, etc) en caracteres sin acentos, diéresis, etc.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;En cuanto a las opciones de configuración, el fichero de ejemplo que viene con las fuentes y que copiamos como nuestro &lt;code&gt;.criprc&lt;/code&gt; contiene comentarios que describen cada una de ellas con suficiente precisión.&lt;br /&gt;&lt;br /&gt;A partir de ahora, solo queda probar el funcionamiento de &lt;code&gt;crip&lt;/code&gt;. El tutorial al que se refiere el &lt;code&gt;README&lt;/code&gt; no es otra cosa que un ejemplo de un caso de uso. Pero conviene referir aquí un par de ejemplos más y comprobar con explicaciones en castellano el proceder de &lt;code&gt;crip&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;El CD elegido contiene dos piezas del compositor contemporáneo Helmut Lachenmann, una para cuarteto de cuerda, interpretada por el Berner Streichquartett y un dúo de guitarras, interpretado por Wilhelm Bruck y Theodor Ross.&lt;br /&gt;&lt;br /&gt;En el primer ejemplo, el formato de salida será OGG y utilizaremos la opción &lt;code&gt;-m&lt;/code&gt; para convertir los caracteres con &lt;em&gt;umlaut&lt;/em&gt; (el mismo signo de nuestro diéresis, que en alemán tiene otra función) en vocales sin &lt;em&gt;umlaut&lt;/em&gt;. Ello parece, en principio, necesario, habida cuenta de que el fichero que contiene el nombre de las pistas aparecerá codificado en latin-1 por &lt;code&gt;crip&lt;/code&gt; y no en utf-8, con el consiguiente problema que implica en casi todos los sistemas operativos modernos, que están preparados para utf-8, donde tales caracteres aparecerán deformados. Precisamente, la opción &lt;code&gt;-m&lt;/code&gt; es la que no funciona en la versión empaquetada con Debian, pero sí en la versión actual. Recuérdese que éste fue el pretexto por el que instalamos &lt;code&gt;crip&lt;/code&gt; desde las fuentes.&lt;br /&gt;&lt;br /&gt;El primer paso es moverse al directorio donde queremos que se produzca la generación de los ficheros temporales y los ficheros finales de audio. Como disponemos de espacio suficiente en nuestro &lt;code&gt;home&lt;/code&gt;, nos desplazaremos al sitio donde acabarán residiendo los ficheros resultantes del proceso:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd ~/musica/CDs&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ahora, tras introducir el CD en el lector de CDs, conversaremos con &lt;code&gt;crip&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;crip -m&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que hace &lt;code&gt;crip&lt;/code&gt; es devolvernos un mensaje inicial y una información general sobre nuestras actuales opciones de configuración:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;crip v3.9 (http://bach.dynet.com/crip)    &lt;br /&gt;&lt;br /&gt;   Please report all bugs, feature requests, or&lt;br /&gt;   general difficulties to charlton@dynet.com. &lt;br /&gt;&lt;br /&gt;Options currently set to:&lt;br /&gt;   contact =             &lt;br /&gt;   sourcemedia = CD      &lt;br /&gt;   encodeto = vorbis     &lt;br /&gt;   cddevice = /dev/cdrom &lt;br /&gt;   settitle = filename   &lt;br /&gt;   editnames = on        &lt;br /&gt;   editor = vim          &lt;br /&gt;   askclassical (default) = off&lt;br /&gt;   skipalbumabv set only for:  classical&lt;br /&gt;   mapeurochars = on&lt;br /&gt;   normalize = off&lt;br /&gt;   trimsilence = off&lt;br /&gt;   delfiles = on&lt;br /&gt;   skiprip = off&lt;br /&gt;   stopgap = off&lt;br /&gt;   ejectcd = off&lt;br /&gt;&lt;br /&gt;Ripper: cdparanoia III release 10.2 (September 11, 2008) -v -z&lt;br /&gt;Encoder: oggenc from vorbis-tools 1.2.0  -q 5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Inmediatamente a continuación, y si ya hay ficheros de audio en este directorio, &lt;code&gt;crip&lt;/code&gt; nos avisará de ello y nos exigirá que confirmemos el proceso, para evitar sobrescribir ficheros existentes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;You currently have *.wav, *.ogg, *.flac, or *.tag files in the current&lt;br /&gt;working directory.  These are subject to being overwritten.&lt;br /&gt;&lt;br /&gt;Press &amp;lt;enter&amp;gt; to proceed (or ctrl-C to abort):&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tras pulsar 'Enter', &lt;code&gt;crip&lt;/code&gt; devuelve el resultado de buscar en FreeDB [Nótense los carácteres con &lt;em&gt;umlaut&lt;/em&gt; que no han sido correctamente convertidos]:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DiscID:   100b1802&lt;br /&gt;cddbID:   100b1802&lt;br /&gt;artist:   Helmut Lachenmann&lt;br /&gt;title:    Gran Torso - Salut f�r Caudwell&lt;br /&gt;category: classical&lt;br /&gt;&lt;br /&gt;total number of tracks: 2&lt;br /&gt;track  1:      182 -    96276  [21:21.25]: Gran Torso (Musik f�r Streichquartett - 1971)&lt;br /&gt;track  2:    96277 -   213184  [25:58.76]: Salut f�r Caudwell (Musik f�r 2 Gitarristen - 1977)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación, &lt;code&gt;crip&lt;/code&gt; solicita que introduzcamos, si queremos, los números de pista para cada grupo. Distinguir grupos de pistas hace posible etiquetar cada uno de ellos de forma distinta y aplicarles, uno a uno, ciertas operaciones de manipulación del audio. Esta función es evidentemente interesante en CDs como el nuestro, donde cada obra será ejecutada por intérpretes diferentes. Si no queremos grupos y queremos ripear todas las pistas, respondemos &lt;code&gt;all&lt;/code&gt;. Si queremos que cada pista constituya un grupo, respondemos &lt;code&gt;each&lt;/code&gt;, pero no podremos etiquetar ciertos campos de cada grupo de forma separada, como el de los intérpretes. En los casos no genéricos, definimos el primer grupo por el número de las pistas que lo constituirán, separados por espacios; el segundo, pulsando 'Enter' y añadiendo en él, de la misma forma, las pistas que le correspondan, etc. Para terminar la generación de grupos se escribe &lt;code&gt;end&lt;/code&gt;. Éste es también el camino que se ha de seguir cuando se desea extraer sólo un cierto número de pistas en un solo grupo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Enter the track numbers for each group (each group will be&lt;br /&gt;replaygained/vorbisgained/normalized,  trimmed,  and tagged&lt;br /&gt;as if it were one piece of music).&lt;br /&gt;&lt;br /&gt;Delimit the track numbers on each line by a space.&lt;br /&gt;Type "end" to go on to the next section.&lt;br /&gt;&lt;br /&gt;Note that only the tracks you specify will be ripped.&lt;br /&gt;Also note that if you list a track more than once, it will be&lt;br /&gt;unnecessarily ripped more than once (so don't do it).&lt;br /&gt;You can also enter "all" or "each" for grouping all tracks as&lt;br /&gt;one group, or each track as a separate group respectively.&lt;br /&gt;If input is "all" or "each" then the entire CD is ripped.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En nuestro caso, vamos a crear dos grupos, uno por cada pista [Nuestras respuestas a &lt;code&gt;crip&lt;/code&gt; se muestran en azul en lo que sigue]:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; &lt;span style="color:blue"&gt;1&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; &lt;span style="color:blue"&gt;2&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; &lt;span style="color:blue"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;crip&lt;/code&gt; nos pida ahora que introduzcamos el género del CD:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Please enter the genre for this album.&lt;br /&gt;Recommended genres are (from freedb.org):&lt;br /&gt;    blues       (self explanatory)&lt;br /&gt;    classical   (self explanatory)&lt;br /&gt;    country     (self explanatory)&lt;br /&gt;    folk        (self explanatory)&lt;br /&gt;    jazz        (self explanatory)&lt;br /&gt;    newage      (self explanatory)&lt;br /&gt;    reggae      (self explanatory)&lt;br /&gt;    rock        (including funk, soul, rap, pop, industrial, metal, etc.)&lt;br /&gt;    soundtrack  (movies, shows)&lt;br /&gt;    data        (ISO9660 and other data CDs)&lt;br /&gt;    misc        (others that do not fit in the above categories)&lt;br /&gt;Enter the genre for this album (single space = null): [classical]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pulsamos 'Enter', lo que significa que el género será 'classical'. Téngase en cuenta que se podría poner cualquier género aparte de los sugeridos, aunque no conviene en el caso de que el resultado se vaya a enviar a FreeDB.&lt;br /&gt;&lt;br /&gt;La siguiente pregunta es relativa al compositor de la obra:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Since this is classical, there should be a composer.&lt;br /&gt;If the composer is different for each group/list, just set the&lt;br /&gt;value to null and add the composer tag manually with each list.&lt;br /&gt;Enter composer (single space = null): [Helmut Lachenmann]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El compositor es el mismo para los dos grupos, luego pulsamos 'Enter' y dejamos el que &lt;code&gt;crip&lt;/code&gt; ha deducido por nosotros.&lt;br /&gt;&lt;br /&gt;A partir de este momento podemos etiquetar por separado cada grupo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Would you like to set the artist and miscellaneous labeling info for&lt;br /&gt;the whole CD right now, or would you prefer to set it for each list?&lt;br /&gt;(list/cd) [list]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pulsamos 'Enter', de forma que la opción &lt;code&gt;list&lt;/code&gt; se aplique.&lt;br /&gt;&lt;br /&gt;El título del album lo modificaremos para evitar el &lt;em&gt;umlaut&lt;/em&gt; no reconocido:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Enter album name (single space = null): [Gran Torso - Salut f�r Caudwell ]: &lt;span style="color:blue"&gt;Gran Torso - Salut für Caudwell&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sí interesa consignar el sello discográfico:&lt;br /&gt;&lt;pre&gt;Enter label name (single space = null): []: &lt;span style="color:blue"&gt;Aurophon&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;También podemos anotar el número de catálogo del disco. Nosotros lo dejaremos vacío. Esto es pulsaremos 'Enter' a esta pregunta:&lt;br /&gt;&lt;pre&gt;Enter label catalog number (single space = null): []:&lt;/pre&gt;&lt;br /&gt;Con toda esta información básica, &lt;code&gt;crip&lt;/code&gt; construye un fichero que contiene los títulos de las dos pistas. Nótese cómo aquí la opción &lt;code&gt;-m&lt;/code&gt; ha hecho su efecto y las letras con &lt;em&gt;umlaut&lt;/em&gt; han sido sustituidas por letras sin &lt;em&gt;umlaut&lt;/em&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Track/filename labeling section...&lt;br /&gt;Here are the computer-chosen filenames for the tracks that you've picked:&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;Lachenmann_-_Gran_Torso_(Musik_fur_Streichquartett_-_1971)&lt;br /&gt;&lt;br /&gt;Lachenmann_-_Salut_fur_Caudwell_(Musik_fur_2_Gitarristen_-_1977)&lt;br /&gt;&lt;br /&gt;Edit the above filenames? [yes]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Adviértase también que &lt;code&gt;crip&lt;/code&gt; nos obliga a editar el fichero, aunque no vayamos a cambiar nada. Pulsamos 'Enter', que abrirá &lt;em&gt;vim&lt;/em&gt; y en &lt;em&gt;vim&lt;/em&gt; tecleamos &lt;code&gt;:q&lt;/code&gt; para salir, y, de nuevo 'Enter' a esta nueva pregunta de confirmación:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Edit the above filenames? [no]:&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La siguiente pregunta se refiere al director del primer grupo de pistas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Enter conductor.  If there isn't one, enter null.&lt;br /&gt; (single space = null): [Helmut Lachenmann]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Puesto que el CD es de música de cámara, no tiene director. Luego debemos pulsar espacio seguido de 'Enter'.&lt;br /&gt;&lt;br /&gt;En la pregunta sobre los intérpretes sí tenemos que intervenir:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Since there is no conductor,  there's probably a (main) performer.&lt;br /&gt;Enter this performer (single space = null): [Helmut Lachenmann]:&lt;span style="color:blue"&gt;Berner Streichquartett&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;También anotaremos la fecha de producción del CD:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Enter the date of recording (single space = null): [don't put one]: &lt;span style="color:blue"&gt;(P) 1991&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora, &lt;code&gt;crip&lt;/code&gt; nos ofrece la posibilidad de seguir añadiendo etiquetas. Nosotros pulsaremos 'Enter' y seguiremos adelante:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Type the name of a field tag that you'd like to add to&lt;br /&gt; all these music files (or make up your own field tag name).&lt;br /&gt;You can enter the fieldname then enter the data for that fieldname,&lt;br /&gt;or you can enter fieldname=data all on one line.&lt;br /&gt;&lt;br /&gt;Possible tag recommendations:&lt;br /&gt;  conductor  ensemble  opus&lt;br /&gt;  location  performer  copyright  license&lt;br /&gt;&lt;br /&gt;Just press &amp;lt;enter&amp;gt; (with nothing on the line) to finish:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación, &lt;code&gt;crip&lt;/code&gt; nos vuelve a repetir las mismas preguntas sobre director e intérpretes del grupo siguiente. Pulsamos 'Enter' en la primera y cumplimentamos adecuadamente la segunda:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Enter conductor.  If there isn't one, enter null.&lt;br /&gt; (single space = null): []:&lt;br /&gt;Since there is no conductor,  there's probably a (main) performer.&lt;br /&gt;If this is true,  enter this performer (single space = null): [Berner Streichquartett]: &lt;span style="color:blue"&gt;W. Bruck - Th. Ross&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las preguntas subsiguientes sobre fecha de producción y creación de más etiquetas se responden como antes.&lt;br /&gt;&lt;br /&gt;Por fin, llegamos al final:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Just press &amp;lt;enter&amp;gt; (with nothing on the line) to finish:&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tras pulsar 'Enter', &lt;code&gt;crip&lt;/code&gt; nos da un sumario del resultado y nos pregunta si queremos reeditar lo ya anotado para alguna de las pistas, enviar la información cumplimentada a FreeDB o comenzar a ripear:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;01: Lachenmann_-_Gran_Torso_(Musik_fur_Streichquartett_-_1971)&lt;br /&gt;title=Gran Torso (Musik fur Streichquartett - 1971)&lt;br /&gt;artist=Berner Streichquartett&lt;br /&gt;composer=Helmut Lachenmann&lt;br /&gt;performer=Berner Streichquartett&lt;br /&gt;date=(P) 1991&lt;br /&gt;album=Gran Torso - Salut für Caudwell&lt;br /&gt;tracknumber=01&lt;br /&gt;genre=classical&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;02: Lachenmann_-_Salut_fur_Caudwell_(Musik_fur_2_Gitarristen_-_1977)&lt;br /&gt;title=Salut fur Caudwell (Musik fur 2 Gitarristen - 1977)&lt;br /&gt;artist=W. Bruck - Th. Ross&lt;br /&gt;composer=Helmut Lachenmann&lt;br /&gt;performer=W. Bruck - Th. Ross&lt;br /&gt;date=(P) 1991&lt;br /&gt;album=Gran Torso - Salut für Caudwell&lt;br /&gt;tracknumber=02&lt;br /&gt;genre=classical&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Look at the above tags and make sure they are all okay.&lt;br /&gt;You can edit any of these tag files by entering the track number.&lt;br /&gt;You can also enter "submit" to submit this data to the freedb&lt;br /&gt;CDDB database or just press &amp;lt;enter&amp;gt; by itself to go directly to&lt;br /&gt;the ripping process!  (or press ctrl-C to abort everything).&lt;br /&gt;Enter track number, submit, or just press &lt;enter&gt; to Rip! :&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aquí pulsaremos 'Enter', nos tomamos un café y esperamos a que &lt;code&gt;crip&lt;/code&gt; realice la extracción y codificación del los ficheros de audio.&lt;br /&gt;&lt;br /&gt;El siguiente ejemplo sobre el mismo disco no conlleva ninguna novedad, salvo por el hecho de que los ficheros resultantes se codificarán como FLAC y que nos la jugaremos con los caracteres europeos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;crip -e flac&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¿Cómo evitar el problema de &lt;code&gt;crip&lt;/code&gt; con utf-8? Existe un truco. A la hora editar el fichero de los nombres de pistas con &lt;em&gt;vim&lt;/em&gt;, ejecutamos desde dentro de &lt;em&gt;vim&lt;/em&gt; la orden &lt;code&gt;:set fileencoding=utf-8&lt;/code&gt; y luego guardamos el fichero y salimos con &lt;code&gt;:wq&lt;/code&gt;. Sí, es un hack rápido, pero es el único medio que hemos descubierto para salvar las apariencias, preservando los carácteres europeos y sin tratar de tocar el código de &lt;code&gt;crip&lt;/code&gt;. Este truco funciona también con la versión empaquetada en Debian. Luego, quien no quiera pasar por la instalación desde las fuentes, podrá usar &lt;code&gt;crip&lt;/code&gt;, y sin el problema de los caracteres europeos, instalando el paquete de Debian del mismo nombre.&lt;br /&gt;&lt;br /&gt;Tengan feliz escucha.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4866580271092817817?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4866580271092817817/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-y-crip-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4866580271092817817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4866580271092817817'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-y-crip-ii.html' title='HAL y crip (II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-7346898991415905212</id><published>2009-04-01T16:26:00.008+02:00</published><updated>2009-04-13T21:55:12.211+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y crip (I - Instalar las fuentes)</title><content type='html'>&lt;code&gt;abcde&lt;/code&gt; es más que suficiente para la mayoría de los usuarios y la mayoría de las funciones. No obstante, los acérrimos de la música clásica pueden preferir etiquetar sus CDs de un modo más flexible, pero de forma sencilla y sin necesidad de recurrir a herramientas externas, aunque tengan que consumir para ello algo más de tiempo en la línea de órdenes. &lt;code&gt;crip&lt;/code&gt; quiere cubrir esa laguna. Se trata de un guión escrito en el lenguaje &lt;a href="http://es.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt;, menos elaborado, quizá, y con menos opciones globales que &lt;code&gt;abcde&lt;/code&gt;, pero especialmente indicado para el caso que comentamos.&lt;br /&gt;&lt;br /&gt;Nos va a servir además para enfrentarnos por primera vez ---si bien en un ejemplo muy simple--- a la instalación de un programa desde las fuentes, es decir, para acometer la instalación del código tal cual ha sido distribuido por el programador, sin acudir al paquete que nuestra distribución ha creado para ese código. Que escojamos este procedimiento tiene, claro está, fines didácticos &lt;span style="text-decoration:line-through"&gt;, pero también obedece al hecho de que la versión de &lt;code&gt;crip&lt;/code&gt; empaquetada a día de hoy por Debian (la 3.7) contiene un error que ya ha sido resuelto en la versión original más reciente&lt;/span&gt;. Lo normal es que nunca acudamos a esta vía. Es más, lo normal es que cuando la instalación directa a partir del código fuente es la única vía posible ---no es el caso aquí, como veremos más tarde---, nos decidamos por otro programa alternativo. En este momento, como de lo que se trata es de aprender, seguiremos la "senda escarpada".&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer para instalar un programa desde la fuente es, obviamente, conseguir el código fuente y guardarlo en nuestro ordenador. La última versión de &lt;code&gt;crip&lt;/code&gt; se puede obtener visitando la página siguiente:&lt;br /&gt;&lt;br /&gt;http://bach.dynet.com/crip/download.html&lt;br /&gt;&lt;br /&gt;La versión más reciente a día de hoy es la 3.9. Podemos descargarla directamente acudiendo a HAL, por ejemplo, dentro de un directorio, &lt;code&gt;src&lt;/code&gt; (de &lt;em&gt;source&lt;/em&gt;, fuente) que crearemos expresamente para guardar todos los archivos fuentes de los programas que instalemos a mano. Construiremos ese directorio, ingresaremos en él y descargaremos ahí el archivo que contiene el código fuente, las tres operaciones en un solo paso:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir src ; cd src ; wget http://bach.dynet.com/crip/src/crip-3.9.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los puntos y comas (&lt;code&gt;;&lt;/code&gt;) entre cada orden indican a HAL que las procese una tras otra. El resultado es el mismo que ejecutarlas por separado.&lt;br /&gt;&lt;br /&gt;El fichero guardado, &lt;code&gt;crip-3.9.tar.gz&lt;/code&gt; es un &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/hal-y-dict.html#fichero-comprimido"&gt;fichero comprimido&lt;/a&gt;. Pero no es un fichero cualquiera. Se trata de un &lt;em&gt;archivo&lt;/em&gt; que engloba un directorio completo con sus correspondientes ficheros. Un fichero &lt;em&gt;tar&lt;/em&gt; es uno de los más frecuentes tipos de ficheros de esta clase, comunes para archivar y distribuir fácilmente directorios completos. Para crear ficheros &lt;em&gt;tar&lt;/em&gt; o para &lt;em&gt;desarchivarlos&lt;/em&gt; (extraer su contenido) se utiliza la orden del mismo nombre &lt;code&gt;tar&lt;/code&gt;. Por ejemplo, podemos pedirle a HAL que extraiga (&lt;code&gt;--extract&lt;/code&gt;) y a la vez descomprima con &lt;code&gt;gunzip&lt;/code&gt; (&lt;code&gt;--gunzip&lt;/code&gt;) el fichero (&lt;code&gt;--file&lt;/code&gt;) &lt;code&gt;crip-3.9.tar.gz&lt;/code&gt;, y que se explaye sin miedo para informarnos de cómo transcurre la operación (&lt;code&gt;--verbose&lt;/code&gt;):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tar --extract --gunzip --verbose --file crip-3.9.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pero nunca se ha visto a nadie dirigirse tan ceremoniosamente a HAL. En lugar de ello, se utilizan las respectivas opciones abreviadas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tar -x -z -v -f crip-3.9.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ni siquiera eso, porque cuando hay varias opciones abreviadas, se prefiere unirlas en un solo taco:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tar -xzvf crip-3.9.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;HAL nos informa como hemos solicitado:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;crip-3.9/&lt;br /&gt;crip-3.9/TODO&lt;br /&gt;crip-3.9/crip&lt;br /&gt;crip-3.9/LICENSE&lt;br /&gt;crip-3.9/README&lt;br /&gt;crip-3.9/editcomment&lt;br /&gt;crip-3.9/CDDB_get.pm&lt;br /&gt;crip-3.9/criprc_example&lt;br /&gt;crip-3.9/editfilenames&lt;br /&gt;crip-3.9/Changelog&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;¿Qué son todos estos ficheros contenidos en el archivo que el desarrollador de &lt;code&gt;crip&lt;/code&gt; tiene la amabilidad de poner a nuestra disposición? El primero es, evidentemente, el propio directorio &lt;code&gt;crip-3.9&lt;/code&gt;. ¿Y los ficheros de los que consta? Nada más fácil que preguntárselo a HAL:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;file crip-3.9/*&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;que devuelve la información que buscamos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;crip-3.9/CDDB_get.pm:    Perl5 module source text&lt;br /&gt;crip-3.9/Changelog:      UTF-8 Unicode English text&lt;br /&gt;crip-3.9/crip:           a /usr/bin/perl script text executable&lt;br /&gt;crip-3.9/criprc_example: ASCII English text&lt;br /&gt;crip-3.9/editcomment:    a /usr/bin/perl script text executable&lt;br /&gt;crip-3.9/editfilenames:  a /usr/bin/perl script text executable&lt;br /&gt;crip-3.9/LICENSE:        ASCII English text&lt;br /&gt;crip-3.9/README:         ASCII English text&lt;br /&gt;crip-3.9/TODO:           ASCII English text&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El asterisco (&lt;code&gt;*&lt;/code&gt;) tras el nombre del directorio en la orden &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/codigos-para-hal.html#file"&gt;&lt;code&gt;file&lt;/code&gt;&lt;/a&gt; es un comodín que vale por todos y cada una de los ficheros contenidos en &lt;code&gt;crip-3.9&lt;/code&gt;. Probablemente empecemos a usarlo más veces a partir de ahora.&lt;br /&gt;&lt;br /&gt;Bien, tenemos unos cuantos ficheros que contienen texto en ingles (en codificación ASCII o UTF-8, eso es secundario aquí) y cuatro más escritos en Perl. Estos últimos son el código fuente propiamente dicho y veremos qué hacer con ellos dentro de un momento. Los ficheros en inglés son documentos informativos sobre el programa. Aun sin leer su contenido, cualquiera que esté familiarizado con archivos de fuentes de programas sabe de qué van, porque sus nombres son convencionalmente usados por los programadores para documentar el código que distribuyen:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;README&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Proporciona informaciones básicas para manejar el programa. Es el fichero que hay que leer en primer lugar.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Describe la licencia bajo la que se distribuye el código. En este caso es GPL. Lo que significa que el código puede modificarse libremente y distribuirse si se mantiene la misma licencia.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;TODO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Una lista de las tareas que el programador considera pendientes y que tal vez cumpla en futuras revisiones del código o espera que cumplan posibles colaboradores.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;Changelog&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Una lista de las características implementadas en cada versión del código hasta ahora realizada y de los errores (&lt;em&gt;bugs&lt;/em&gt;) corregidos&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;criprc-example&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Un ejemplo de fichero de configuración para el programa. Recuérdese que nos hemos encontrado ya con varios ficheros de configuración y que el nombre de muchos de ellos se construye con el sufijo &lt;code&gt;rc&lt;/code&gt; (de &lt;em&gt;resource&lt;/em&gt;) añadido al nombre del programa.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Leamos el fichero &lt;code&gt;README&lt;/code&gt; ---se presupone que el lector hace ahora un &lt;code&gt;less crip-3.9/README&lt;/code&gt;--- para conocer de qué va la historia. Vemos que contiene instrucciones de instalación y de uso.&lt;br /&gt;&lt;br /&gt;Empecemos por la instalación. Lo primero que se nos indica es el software con el que nuestro sistema debe contar para que &lt;code&gt;crip&lt;/code&gt; funcione. Casi todas los programas requeridos son conocidos nuestros, los artesanos del sonido que comentamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-mis-cds.html"&gt;hace unos días&lt;/a&gt; (&lt;code&gt;cdparanoia&lt;/code&gt;, &lt;code&gt;oggenc&lt;/code&gt;, &lt;code&gt;flac&lt;/code&gt;, &lt;code&gt;vorbiscomment&lt;/code&gt; y &lt;code&gt;vorbisgain&lt;/code&gt;), de &lt;code&gt;sox&lt;/code&gt;, otro experto en sonido, podemos prescindir ahora. &lt;code&gt;perl&lt;/code&gt; está instalado a buen seguro. Si instalamos &lt;code&gt;abcde&lt;/code&gt;, se instalaron muchos de los programas anteriores. Pero no vamos a dar nada por hecho. Trataremos de ver qué paquetes de Debian contienen el software necesario e instalaremos dichos paquetes ---sí, no procederemos a instalarlos desde las fuentes, el lector puede respirar tranquilo.&lt;br /&gt;&lt;br /&gt;Como sabemos, &lt;code&gt;aptitude&lt;/code&gt; nos permite buscar paquetes que cumplan ciertas funciones, pero lo que ahora necesitamos es algo sustancialmente distinto, queremos conocer en qué paquete de Debian está contenido un determinado programa. Para ello existe la herramienta &lt;code&gt;apt-file&lt;/code&gt;, incluida en el paquete del mismo nombre, que se puede instalar como cualquier otro paquete:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;aptitude install apt-file&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El funcionamiento básico de &lt;code&gt;apt-file&lt;/code&gt; es muy sencillo. Los almacenes de paquetes Debian incluyen un fichero comprimido donde se describe el contenido de todos los paquetes allí almacenados. Éste es el fichero que &lt;code&gt;apt-file&lt;/code&gt; procesará. Lo primero, por tanto, es tener en nuestro ordenador una copia actualizada suya. Para ello debemos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/ohayo-hal.html"&gt;disfrazarnos de &lt;em&gt;root&lt;/em&gt;&lt;/a&gt;, es decir que previamente hay que hacer &lt;code&gt;su&lt;/code&gt; o prefijar la orden siguiente con &lt;code&gt;sudo&lt;/code&gt;, dependiendo de nuestro sistema:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;apt-file update&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Una vez descargado el fichero de contenidos de los paquetes, podemos buscar en él qué paquete o paquetes contiene cada programa u orden que &lt;code&gt;crip&lt;/code&gt; define como requisito previo. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;apt-file cdparanoia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;que devuelve:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cdparanoia: /usr/bin/cdparanoia&lt;br /&gt;cdparanoia: /usr/share/doc/cdparanoia/README.gz&lt;br /&gt;cdparanoia: /usr/share/doc/cdparanoia/changelog.Debian.gz&lt;br /&gt;cdparanoia: /usr/share/doc/cdparanoia/copyright&lt;br /&gt;cdparanoia: /usr/share/man/ja/man1/cdparanoia.1.gz&lt;br /&gt;cdparanoia: /usr/share/man/man1/cdparanoia.1.gz&lt;br /&gt;cdparanoia-dbg: /usr/lib/debug/usr/bin/cdparanoia&lt;br /&gt;cdparanoia-dbg: /usr/share/doc/cdparanoia-dbg/changelog.Debian.gz&lt;br /&gt;cdparanoia-dbg: /usr/share/doc/cdparanoia-dbg/copyright&lt;br /&gt;gstreamer0.10-plugins-base: /usr/lib/gstreamer-0.10/libgstcdparanoia.so&lt;br /&gt;gstreamer0.10-plugins-base-dbg: /usr/lib/debug/usr/lib/gstreamer-0.10/libgstcdparanoia.so&lt;br /&gt;gstreamer0.10-plugins-base-doc: /usr/share/gtk-doc/html/gst-plugins-base-plugins-0.10/gst-plugins-base-plugins-cdparanoiasrc.html&lt;br /&gt;gstreamer0.10-plugins-base-doc: /usr/share/gtk-doc/html/gst-plugins-base-plugins-0.10/gst-plugins-base-plugins-plugin-cdparanoia.html&lt;br /&gt;libcdparanoia-dev: /usr/share/doc/libcdparanoia-dev/changelog.Debian.gz&lt;br /&gt;libcdparanoia-dev: /usr/share/doc/libcdparanoia-dev/copyright&lt;br /&gt;libcdparanoia0: /usr/share/doc/libcdparanoia0/README.gz&lt;br /&gt;libcdparanoia0: /usr/share/doc/libcdparanoia0/changelog.Debian.gz&lt;br /&gt;libcdparanoia0: /usr/share/doc/libcdparanoia0/copyright&lt;br /&gt;libcdparanoia0: /usr/share/lintian/overrides/libcdparanoia0&lt;br /&gt;libk3b-dev: /usr/include/kde/k3bcdparanoialib.h&lt;br /&gt;libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so&lt;br /&gt;libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so.1&lt;br /&gt;libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so.1.0&lt;br /&gt;manpages-ko: /usr/share/man/ko/man1/cdparanoia.1.gz&lt;br /&gt;ripperx: /usr/lib/ripperx/ripperX_plugin-cdparanoia&lt;br /&gt;soundkonverter: /usr/share/apps/soundkonverter/plugins/320.cdparanoia.soundkonverter.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Demasiada información. Es preciso filtrarla. Como ya indicamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/codigos-para-hal.html"&gt;hace bastante&lt;/a&gt;, los programas u órdenes no son sino ficheros ejecutables, lo que significa que se instalarán en un directorio de ejecutables como &lt;code&gt;bin&lt;/code&gt; o &lt;code&gt;sbin&lt;/code&gt;. Para los artesanos del sonido, podemos descartar la última opción (&lt;code&gt;sbin&lt;/code&gt;), dado que, a todas luces, se trata de órdenes o programas de usuario. Y, puesto que son ficheros que no contienen programas para administrar el sistema, debemos suponer que, a buen seguro, formarán parte del directorio &lt;code&gt;/usr/bin&lt;/code&gt;. En la descripción del contenido de los paquetes que suministra &lt;code&gt;apt-file&lt;/code&gt; aparece, como acabamos de comprobar, el nombre del paquete como primer campo y la ruta del fichero como segundo campo, separados ambos campos por dos puntos y espacio. En consecuencia, podemos realizar una búsqueda con &lt;code&gt;apt-file search&lt;/code&gt; y filtrar el resultado con &lt;code&gt;grep&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;apt-file search cdparanoia | grep -E ':[[:space:]]+/usr/bin'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La respuesta ahora es unívoca y suficiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cdparanoia: /usr/bin/cdparanoia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si ejecutamos dicha búsqueda para todos las órdenes o programas que requiere &lt;code&gt;crip&lt;/code&gt; obtendríamos la siguiente información:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cdparanoia: /usr/bin/cdparanoia&lt;br /&gt;vorbis-tools: /usr/bin/oggenc&lt;br /&gt;flac: /usr/bin/flac&lt;br /&gt;flac: /usr/bin/metaflac&lt;br /&gt;vorbis-tools: /usr/bin/vorbiscomment&lt;br /&gt;vorbisgain: /usr/bin/vorbisgain&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Por cierto, no es necesario ejecutar &lt;code&gt;apt-file search &lt;em&gt;nombre_programa&lt;/em&gt;&lt;/code&gt; para cada uno de los programas en los que estamos interesados, se puede hacer de una sola vez con una orden algo compleja, cuyo sentido no se ha explicado todavía, pero que deberemos considerar despacio en algún otro momento:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \&lt;br /&gt;do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podríamos incluso filtrar el resultado de esta orden para que nos devolviese únicamente el primer campo (el nombre del paquete) y suprimiese las repeticiones:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \&lt;br /&gt;do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \&lt;br /&gt;done \&lt;br /&gt;| cut -d':' -f1 | uniq&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y ya que estamos, podemos enviar el resultado final como lista de argumentos para &lt;code&gt;aptitude&lt;/code&gt;, de forma &lt;code&gt;aptitude&lt;/code&gt; proceda automáticamente a la instalación de los paquetes correspondientes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;aptitude -s install \&lt;br /&gt;$(for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \&lt;br /&gt;do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \&lt;br /&gt;done \&lt;br /&gt;| cut -d':' -f1 | uniq)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;¡Eh! ¿qué tal este inopinado reencuentro con nuestros cachivaches de fontanería?&lt;br /&gt;&lt;br /&gt;El lector atento habrá notado en la anterior orden una opción extraña para &lt;code&gt;aptitude&lt;/code&gt;, la opción &lt;code&gt;-s&lt;/code&gt;. Esta opción hace que &lt;code&gt;aptitude&lt;/code&gt; simule su comportamiento habitual, sin provocar ningún cambio en nuestro sistema de paquetes. La puede ejecutar cualquier usuario, no hace falta ser &lt;em&gt;root&lt;/em&gt;. Es muy recomendable aplicarla antes de proceder a una instalación real, especialmente en casos como el anterior, donde los paquetes que se instalarán son la salida de una orden compleja.&lt;br /&gt;&lt;br /&gt;Si ejecutamos como &lt;em&gt;root&lt;/em&gt;, y sin la opción &lt;code&gt;-s&lt;/code&gt;, la orden citada, se instalarán todos los programas que &lt;code&gt;crip&lt;/code&gt; exige para funcionar y que no existen ya en nuestro sistema.&lt;br /&gt;&lt;br /&gt;Preparada la infraestructura para &lt;code&gt;crip&lt;/code&gt;, continuamos nuestra lectura de su fichero &lt;code&gt;README&lt;/code&gt;. Ahí se nos informa del siguiente paso: copiar &lt;code&gt;CDDB_get.pm&lt;/code&gt; a algún sitio donde nuestro intérprete del lenguaje Perl pueda encontrarlo. Se nos propone, como opción, copiarlo bajo &lt;code&gt;/usr/lib/perl5/&lt;/code&gt;. No vamos a seguir, sin embargo, esta recomendación. La razón es que no es conveniente mezclar ficheros instalados a mano en los directorios que nuestra distribución utiliza para instalar el contenido de los paquetes. Los directorios &lt;code&gt;/usr/bin&lt;/code&gt;, &lt;code&gt;/usr/lib&lt;/code&gt;, etc. son directorios que debe manejar exclusivamente nuestra distribución. Todas las distribuciones de Linux ofrecen la posibilidad de directorios semejantes a los anteriores para un caso como el nuestro, es decir, para cuando instalamos software desde las fuentes. El directorio típico que existe con este fin es &lt;code&gt;/usr/local&lt;/code&gt;. Es ahí donde debemos ubicar el software instalado a mano. &lt;br /&gt;&lt;br /&gt;&lt;code&gt;CDDB_get.pm&lt;/code&gt; es, como nos notificó &lt;code&gt;file&lt;/code&gt; anteriormente, un módulo de Perl, es decir, un conjunto de funcionalidades que pueden usar distintos programas escritos en Perl. Se almacenan normalmente en el directorio &lt;code&gt;/lib/perl/&lt;em&gt;versión&lt;/em&gt;&lt;/code&gt;, donde &lt;em&gt;versión&lt;/em&gt; es el número de versión de nuestra infraestructura Perl. En mi sistema es el &lt;code&gt;5.10.0&lt;/code&gt;. Por tanto, debemos crear como &lt;em&gt;root&lt;/em&gt; ese subdirectorio en nuestro &lt;code&gt;/usr/local&lt;/code&gt; y copiar allí el fichero &lt;code&gt;CDDB_get.pm&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir -p /usr/local/lib/perl/5.10.0/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La opción &lt;code&gt;-p&lt;/code&gt; de &lt;code&gt;mkdir&lt;/code&gt; permite crear no sólo el directorio &lt;code&gt;5.10.0&lt;/code&gt;, sino todos los directorios &lt;em&gt;padre&lt;/em&gt; bajo &lt;code&gt;/usr/local&lt;/code&gt; que todavía no existan. En nuestro caso, tiene el mismo efecto que estas dos órdenes:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mkdir /usr/local/lib/perl&lt;br /&gt;mkdir /usr/local/lib/perl/5.10.0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ahora copiamos, también como &lt;em&gt;root&lt;/em&gt; el fichero &lt;code&gt;CDDB_get.pm&lt;/code&gt; en el directorio recién creado:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cp crip-3.9/CDDB_get.pm /usr/local/lib/perl/5.10.0&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, y si seguimos las instrucciones del &lt;code&gt;README&lt;/code&gt;, sólo falta copiar el fichero de configuración &lt;code&gt;criprc_example&lt;/code&gt; como nuestro &lt;code&gt;~/.criprc&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cp crip-3.9/criprc_example ~/.criprc&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con esto sería suficiente para hacer funcionar &lt;code&gt;crip&lt;/code&gt;. Sin embargo, tendríamos que llamar con su ruta completa a &lt;code&gt;crip&lt;/code&gt; (&lt;code&gt;~/tmp/crip-3.9/crip&lt;/code&gt;) cada vez que quisiéramos ejecutarlo. Como esto es incomodo, es mejor disponer los ficheros ejecutables de las fuentes en un ruta que esté en nuestro &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-la-senda.html"&gt;&lt;code&gt;PATH&lt;/code&gt;&lt;/a&gt;. Qué mejor que en &lt;code&gt;/usr/local/bin&lt;/code&gt;. Las fuentes constan de varios ejecutables, como nos informó &lt;code&gt;file&lt;/code&gt;. Tales ficheros no son sino órdenes escritas en lenguaje Perl y son, para el caso que nos ocupa los siguientes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;crip&lt;br /&gt;editcomment&lt;br /&gt;editfilenames&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Copiémoslos en &lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd crip-3.9 ; cp crip editcomment editfilenames /usr/local/bin&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tarea finalizada. Cabe añadir que, en el caso de que se quiera en el futuro recurrir al paquete &lt;code&gt;crip&lt;/code&gt; de Debian, habría que asegurarse de que no queda rastro de los ficheros instalados en &lt;code&gt;/usr/local&lt;/code&gt;. Es decir, habría que disfrazarse de &lt;em&gt;root&lt;/em&gt; y ejecutar las siguientes órdenes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rm /usr/local/lib/perl/5.10.0/CDDB_get.pm&lt;br /&gt;rm /usr/local/bin/crip&lt;br /&gt;rm /usr/local/bin/editcomment&lt;br /&gt;rm /usr/local/bin/editfilenames&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;¿Alguien se atreve a escribir el mini guión &lt;code&gt;desinstalar_crip_local&lt;/code&gt; para realizar esta operación de desinstalación? Fácil, ¿no?&lt;br /&gt;&lt;br /&gt;Si el lector ha llegado hasta aquí sin tropiezos se puede considerar afortunado. Acaba de ingresar en el reducido grupo de usuarios de a pie que todavía tiene el coraje de instalar un programa desde la fuente misma. En los gloriosos y aguerridos días en que las distribuciones de GNU/Linux no eran tantas ni tan bien pertrechadas, era una práctica habitual. Hoy en día sólo los usuarios avanzados y, por supuesto, los programadores, se atreven con estos retos, que, por lo que se ha visto, no son tan duros como los pintan, al menos para casos tan simples como el de &lt;code&gt;crip&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="shell-;"&gt;Los puntos y coma (&lt;code&gt;;&lt;/code&gt;) como separadores de órdenes en la línea de órdenes, permiten ejecutar secuencialmente las órdenes separadas por ellos.&lt;/li&gt;&lt;br /&gt;&lt;li id="shell-*"&gt;El asterisco (&lt;code&gt;*&lt;/code&gt;), cuando está fuera de una expresión regular, funciona como un comodín que está por cualquier cadena de caracteres. Es frecuente su uso como abreviatura de nombres de ficheros.&lt;/li&gt;&lt;br /&gt;&lt;li id="tar"&gt;Un fichero &lt;em&gt;tar&lt;/em&gt; es un tipo de fichero que sirve para archivar varios ficheros, incluidos subdirectorios. La orden &lt;code class="orden"&gt;tar&lt;/code&gt; permite crear tales clases de ficheros o extraer el contenido de dichos ficheros.&lt;/li&gt;&lt;br /&gt;&lt;li id="bloques-opciones"&gt;Cuando una orden recibe varias opciones es frecuente agruparlas en un único bloque. Por ejemplo, &lt;code&gt;tar -x -z -v -f &lt;em&gt;fichero&lt;/em&gt;&lt;/code&gt; se abrevia habitualmente con &lt;code&gt;tar -xzvf &lt;em&gt;fichero&lt;/em&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las fuentes de un programa suelen incluir ficheros de documentación con nombres convencionales: &lt;code&gt;README&lt;/code&gt;, que proporciona información importante que hay que leer en primer lugar; &lt;code&gt;LICENSE&lt;/code&gt;, que indica la licencia bajo la que se distribuye; &lt;code&gt;TODO&lt;/code&gt;, que lista las tareas pendientes; &lt;code&gt;Changelog&lt;/code&gt;, que informa de los cambios realizados en cada versión.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los ficheros de configuración de un programa suelen terminar con el sufijo &lt;code&gt;rc&lt;/code&gt; añadido al nombre del programa. Por ejemplo, &lt;code&gt;bashrc&lt;/code&gt;, &lt;code&gt;vimrc&lt;/code&gt;, &lt;code&gt;criprc&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li id="apt-file"&gt;La orden &lt;code class="orden"&gt;apt-file&lt;/code&gt; permite buscar ficheros en el contenido de los paquetes Debian.&lt;/li&gt;&lt;br /&gt;&lt;li id="uniq"&gt;Por defecto, la orden &lt;code class="orden"&gt;uniq&lt;/code&gt; devuelve su entrada omitiendo las líneas repetidas.&lt;/li&gt;&lt;br /&gt;&lt;li id="aptitude-s"&gt;La opción &lt;code&gt;-s&lt;/code&gt; de &lt;code&gt;aptitude&lt;/code&gt; permite simular el comportamiento de &lt;code&gt;aptitude&lt;/code&gt; sin producir ninguna modificación en el sistema.&lt;/li&gt;&lt;br /&gt;&lt;li id="/usr/local"&gt;&lt;code&gt;/usr/local&lt;/code&gt; es el directorio recomendado para ubicar software instalado manualmente por el usuario.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-7346898991415905212?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/7346898991415905212/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-y-crip-i-instalar-las-fuentes.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7346898991415905212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/7346898991415905212'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/04/hal-y-crip-i-instalar-las-fuentes.html' title='HAL y crip (I - Instalar las fuentes)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1735296639645269792</id><published>2009-03-31T01:15:00.004+02:00</published><updated>2009-04-03T22:37:30.230+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y abcde</title><content type='html'>&lt;code&gt;abcde&lt;/code&gt; no es otra cosa que un guión escrito en lengua de HAL para establecer comunicación con los expertos del estilo de los citados &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-mis-cds.html"&gt;el día pasado&lt;/a&gt;, sin necesidad de que nosotros mismos tengamos que tratar personalmente con cada uno de ellos.&lt;br /&gt;&lt;br /&gt;El uso básico de &lt;code&gt;abcde&lt;/code&gt; es tan simple que da casi apuro referirlo:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Instalar &lt;code&gt;abcde&lt;/code&gt;, que instalará de paso todos los expertos a los va a recurrir y que no estén ya integrados en nuestro sistema: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    aptitude install abcde&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Introducir el CD de audio en el lector de CDs.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Teclear en el terminal simplemente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    abcde&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Por defecto, &lt;code&gt;abcde&lt;/code&gt; se ejecutará en modo interactivo. Es decir, nos hará ciertas preguntas sobre el contenido del CD. Veamos cómo funciona sobre un disco del célebre saxofonista Ben Webster. &lt;br /&gt;&lt;br /&gt;Tras introducir el CD en el lector de CDs y ejecutar &lt;code&gt;abcde&lt;/code&gt; veremos el siguiente mensaje, en el que se muestra información sobre el número de pistas del CD que se grabarán:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Grabbing entire CD - tracks: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Inmediatamente después, &lt;code&gt;abcde&lt;/code&gt; realiza una búsqueda sobre la base de datos de FreeDB y devuelve la información allí contenida sobre nuestro CD:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Retrieving 1 CDDB match...done.                                                   &lt;br /&gt;---- Ben Webster / Jazz &amp; Blues 26 ----                                           &lt;br /&gt;1: Randle's Island                                                                &lt;br /&gt;2: Old Folks                                                                      &lt;br /&gt;3: King's Riff                                                                    &lt;br /&gt;4: You're my Thrill                                                               &lt;br /&gt;5: Jive at Six                                                                    &lt;br /&gt;6: Tenderly                                                                       &lt;br /&gt;7: Don't get around much any more                                                 &lt;br /&gt;8: Pennies from heaven                                                            &lt;br /&gt;9: That's all                                                                     &lt;br /&gt;10: Cotton tail                                                                   &lt;br /&gt;11: Danny boy                                                                     &lt;br /&gt;12: Bouce blues                                                                   &lt;br /&gt;13: Hoot                                                                          &lt;br /&gt;14: Pouting                                                                                   &lt;br /&gt;15: The iron Man                                                                              &lt;br /&gt;16: Honeysuckle rose                                                                          &lt;br /&gt;17: Blue skies                                                                                &lt;br /&gt;18: Kat's fur                                                                                                                                                                               &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tras ello nos pregunta si queremos editar dicha información o nos basta con la que FreeDB proporciona:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Edit selected CDDB data? [y/n] (n):&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Como no hace falta editar nada, respondemos "no", esto es, pulsamos 'Enter' o 'n' y seguimos adelante.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;abcde&lt;/code&gt; nos pregunta a continuación si son varios los artistas (en este caso, intérpretes) de la música grabada:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Is the CD multi-artist? [y/n] (n):&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El artista principal es Ben Webster y así lo dejaremos, luego seguimos adelante, pulsando 'Enter' o 'n'.&lt;br /&gt;&lt;br /&gt;A partir de este momento comienza el proceso de extracción de las pistas por medio de &lt;code&gt;cdparanoia&lt;/code&gt;. Para cada pista extraída &lt;code&gt;abcde&lt;/code&gt; nos devuelve un mensaje de este tipo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Grabbing track 01: Randle's Island...                                                         &lt;br /&gt;cdparanoia III release 10.2 (September 11, 2008)                                              &lt;br /&gt;                                                                                              &lt;br /&gt;Ripping from sector       0 (track  1 [0:00.00])                                              &lt;br /&gt;          to sector   14534 (track  1 [3:13.59])                                              &lt;br /&gt;                                                                                              &lt;br /&gt;outputting to /home/luis/abcde.170dd912/track01.wav                                           &lt;br /&gt;                                                                                              &lt;br /&gt; (== PROGRESS == [                      | 014534 00 ] == :^D * ==)                    &lt;br /&gt;                                                                                              &lt;br /&gt;Done.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aquí, simplemente, &lt;code&gt;abcde&lt;/code&gt; nos notifica la extracción de la primera pista que se guardará temporalmente en disco en formato WAV en el directorio &lt;code&gt;/home/luis/abcde.170dd912&lt;/code&gt;. Este directorio se crea bajo nuestro &lt;code&gt;home&lt;/code&gt; y será eliminado al terminar el proceso. Para la operación de extracción, &lt;code&gt;abcde&lt;/code&gt; recurre a &lt;code&gt;cdparanoia&lt;/code&gt;. De hecho, los mensajes relativos a la extracción los produce &lt;code&gt;cdparanoia&lt;/code&gt;. Especialmente interesante es el mensaje de progreso. A la derecha de dicho mensaje van apareciendo indicaciones semejantes a los &lt;a href="http://es.wikipedia.org/wiki/Smiley"&gt;smileys&lt;/a&gt; o emoticones que se usan en comunicaciones electrónicas. La lista de los &lt;em&gt;smylies&lt;/em&gt; que utiliza &lt;code&gt;cdparanoia&lt;/code&gt; y de sus significados se puede consultar en la sección 'Output Smilies' de la página de manual de &lt;code&gt;cdparanoia&lt;/code&gt;. Puede ser necesario acudir a ella en el caso infrecuente de que surjan problemas en el proceso.&lt;br /&gt;&lt;br /&gt;Simultáneamente y para cada pista, &lt;code&gt;abcde&lt;/code&gt; codifica, por defecto en formato OGG vía &lt;code&gt;oggenc&lt;/code&gt;, los ficheros WAV extraídos, los etiqueta y los guarda en un directorio con un nombre adecuado, en el caso presente &lt;code&gt;Ben_Webster-Jazz_&amp;_Blues_26&lt;/code&gt;. El nombre de los ficheros OGG coincide con el nombre de cada pista en la información obtenida por FreeDB. Por ejemplo, el primer fichero, que corresponde a la primera pista del CD de Ben Webster, quedó guardado con el nombre &lt;code&gt;01.Randles_Island.ogg&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;El mensaje final es el informe que devuelve &lt;code&gt;oggenc&lt;/code&gt; sobre el proceso de codificación, encubierto hasta ese momento por los mensajes devueltos por &lt;code&gt;cdparanoia&lt;/code&gt;, donde consta la calidad, por defecto &lt;code&gt;3.00&lt;/code&gt; ---a mayor número, mayor calidad y menor compresión---, del fichero OGG resultante y algunos datos estadísticos sobre el proceso de codificación. A ello se añade la notificación de la operación de etiquetado:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Encoding track 18 of 18: Kat's fur...&lt;br /&gt;Opening with wav module: WAV file reader&lt;br /&gt;Encoding "/home/luis/abcde.170dd912/track18.wav" to &lt;br /&gt;         "/home/luis/abcde.170dd912/track18.ogg"    &lt;br /&gt;at quality 3,00                                     &lt;br /&gt;        [ 99,8%] [ 0m00s remaining] -               &lt;br /&gt;&lt;br /&gt;Done encoding file "/home/luis/abcde.170dd912/track18.ogg"&lt;br /&gt;&lt;br /&gt;        File length:  2m 59,0s&lt;br /&gt;        Elapsed time: 0m 09,6s&lt;br /&gt;        Rate:         18,7143 &lt;br /&gt;        Average bitrate: 97,3 kb/s&lt;br /&gt;&lt;br /&gt;Tagging track 18 of 18: Kat's fur...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La ventaja de una sesión interactiva como la descrita es que podemos intervenir en la edición de las etiquetas del CD y sus pistas. Si queremos lo contrario, es decir, que &lt;code&gt;abcde&lt;/code&gt; acepte las respuestas por defecto (los "no" anteriores) y actúe sin nuestra intervención, basta añadir la opción &lt;code&gt;-N&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;abcde -N&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si en lugar de un fichero OGG, deseamos un fichero FLAC como resultado del proceso, se utiliza la opción &lt;code&gt;-o&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;abcde -o flac&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si queremos grabar sólo algunas pistas y no todas, por ejemplo las tres primeras y la última:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;abcde 1-3,18&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En general, &lt;code&gt;abcde&lt;/code&gt;, como casi toda orden de HAL, permite modificar su comportamiento por defecto o especificar más claramente nuestros intereses del momento a través de una amplia gama de opciones. Cuando estas opciones van a ser siempre las mismas, también permite definir variables de configuración a nivel de todo el sistema o para cada usuario en particular. En el primer caso el valor de las variables afectadas se especifica en el fichero de configuración &lt;code&gt;/etc/abcde.conf&lt;/code&gt;; en el segundo, en el fichero de configuración de usuario &lt;code&gt;~/.abcde.conf&lt;/code&gt;. Tanto las opciones de línea de órdenes como las variables de configuración vienen suficientemente explicadas en la página de manual de &lt;code&gt;abcde&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;Pongamos, para terminar, un ejemplo de fichero de configuración de usuario (&lt;code&gt;~/.abcde.conf&lt;/code&gt;), donde consten unas pocas de esas variables. El lector puede indagar y experimentar por su cuenta con otras.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# El formato de recuperación de la información de FreeDB sera UTF-8&lt;br /&gt;CDDBPROTO=6&lt;br /&gt;&lt;br /&gt;# Los números de las pistas serán 01, 02, ..., en lugar de 1, 2, ...&lt;br /&gt;PADTRACKS="y"&lt;br /&gt;&lt;br /&gt;# La calidad del fichero ogg resultante será de 4 (ver man oggenc)&lt;br /&gt;OGGENCOPTS="-q 4"&lt;br /&gt;&lt;br /&gt;# La compresión del fichero flac será la máxima posible (ver man flac)&lt;br /&gt;FLACOPTS="--best"&lt;br /&gt;&lt;br /&gt;# El resultado de la extracción se guardará en mi directorio de musica de CDs&lt;br /&gt;# [Cada usuario debe poner aquí su nombre de usuario después de home]&lt;br /&gt;OUTPUTDIR="/home/luis/musica/CDs/abcde"&lt;br /&gt;&lt;br /&gt;# El CD se expulsará automáticamente cuando el proceso termine&lt;br /&gt;EJECTCD="y"&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1735296639645269792?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1735296639645269792/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-abcde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1735296639645269792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1735296639645269792'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-abcde.html' title='HAL y abcde'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8823891603989242118</id><published>2009-03-30T13:14:00.005+02:00</published><updated>2009-03-31T16:20:34.139+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y mis CDs</title><content type='html'>Si tuviéramos que citar los ámbitos donde el uso de los ordenadores ha transformado nuestro paisaje cotidiano, no podríamos dejar de mencionar el de las aplicaciones de audio y, en concreto, la disponibilidad en formatos de tamaño reducido de la información que anteriormente se distribuía en CDs y que ha permitido la eclosión de los reproductores portátiles de audio, ésos que el lego conoce con el equívoco nombre de "Mp3".&lt;br /&gt;&lt;br /&gt;HAL cuenta con un vasto equipo de colaboradores dispuestos a devorar nuestros CDs y convertir la información musical allí guardada en otra más manejable y transportable, así como para reproducirla a nuestro antojo. Durante unos días vamos a dedicarnos a descubrir alguno de ellos. No vaya a ser que luego nos recriminen que HAL está bien para las cosas de la Edad de Piedra, pero no para las innovaciones que el pegadizo ritmo del presente impone. De hecho, alguno de tales colaboradores, en particular, los que bregan en la zona más profunda e ingrata de la fábrica musical, son los auténticos responsables de que nuestras aplicaciones, también las del entorno gráfico, funcionen como lo hacen.&lt;br /&gt;&lt;br /&gt;¿Por dónde empezar? Quizá lo primero de todo es aclararse con algunos términos y algunos conceptos en boga, que están en boca de todos y que no pocas veces se utilizan sin saber lo que significan, aunque sea aproximadamente. Los procesos implicados en el procesamiento del audio digital son complejos y es absurdo tratar de comprenderlos sin poseer un bagaje técnico y científico importante. Pero sí es posible, al menos, descender hasta un nivel de abstracción suficientemente alto como para no tener que detenerse en las minucias.&lt;br /&gt;&lt;br /&gt;Las típicas aplicaciones para guardar el contenido de un CD de audio en la zona de almacenamiento de un dispositivo como un ordenador personal o un reproductor de audio portátil se denominan aplicaciones de &lt;em&gt;ripping&lt;/em&gt;, palabra inglesa que popularmente se ha españolizado como "ripeo". En este proceso están implicadas normalmente varias operaciones diferentes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;La &lt;em&gt;extracción&lt;/em&gt; del contenido del CD (el "ripeo" en sentido estricto).&lt;br /&gt;&lt;br /&gt;Este contenido, que en el CD se distribuye en bloques de datos, las conocidas "pistas" (&lt;em&gt;tracks&lt;/em&gt;), se convierte en un formato lo más fiel posible al del propio CD, esto es, sin pérdida de datos y sin compresión. El formato habitual en la actualidad es &lt;a href="http://es.wikipedia.org/wiki/Waveform_Audio_Format"&gt;WAV&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La &lt;em&gt;codificación&lt;/em&gt; de la información extraída.&lt;br /&gt;&lt;br /&gt;Puesto que WAV o similares ocupan mucho espacio, se han creado sistemas (algoritmos) para comprimir la información contenida en ellos. La reducción del tamaño puede o no implicar pérdida de datos respecto del original. Cuando no hay pérdida, la reconstrucción de la información original es exacta; cuando la hay, es sólo aproximada, lo suficientemente aproximada como para que el oyente no profesional apenas perciba diferencia. Los formatos que suponen pérdida tienen la ventaja de ocupar menos espacio y por eso se han impuesto a gran escala con la llegada de los reproductores de audio portátiles. &lt;a href="http://es.wikipedia.org/wiki/MP3"&gt;MP3&lt;/a&gt; es uno de estos formatos comprimidos con pérdida de datos, pero no es ni el único ni el mejor. En el universo de HAL se deberían usar formatos abiertos y libres de patentes, como Ogg Vorbis (&lt;a href="http://es.wikipedia.org/wiki/Vorbis"&gt;OGG&lt;/a&gt;, para abreviar), que, además y en general, se considera, de mayor calidad que MP3. En el mundo profesional, o cuando el oyente es muy exigente y goza de espacio suficiente en disco, se suelen preferir formatos comprimidos sin pérdida de datos, como &lt;a href="http://es.wikipedia.org/wiki/FLAC"&gt;FLAC&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El &lt;em&gt;etiquetado&lt;/em&gt; de la información extraída y codificada.&lt;br /&gt;&lt;br /&gt;Sería muy pesado reconstruir la información del CD al transferir su contenido al ordenador, es decir, restablecer los títulos de las pistas, el intérprete, etc. Con ese fin se han desarrollado, entre otras opciones, bases de datos que contienen esa información y que son accesibles por Internet. Cuando la información no está disponible, el usuario puede rellenarla y enviarla al sitio web que aloja la base de datos para su recuperación posterior por parte de otros usuarios. Hoy en día, las bases de datos que utilizan los usuarios de GNU/Linux ---y deben utilizar, por razones de libertad de la licencia--- son &lt;a href="http://es.wikipedia.org/wiki/Freedb"&gt;FreeDB&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/MusicBrainz"&gt;MusicBrainz&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Dando por sentado que el lector va a codificar sus CDs con OGG o FLAC podemos referir algunos de los más conocidos colaboradores de HAL responsables en la actualidad de realizar las tareas antes descritas:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;cdparanoia&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Extracción de audio&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;oggenc&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Codificación a formato OGG&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;flac&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Codificación a formato FLAC&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;vorbiscomment&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Etiquetado de ficheros OGG&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;metaflac&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Etiquetado de ficheros FLAC&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code class="orden"&gt;sox&lt;/code&gt;, &lt;code class="orden"&gt;vorbisgain&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Otras herramientas para manipulación especializada de ficheros de audio.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;No vamos a pararnos a dialogar con estos esforzados expertos, y no por falta de interés ---el autor se ha tenido que morder los labios para no hacerlo---, sino por falta de tiempo, del tiempo del lector que, seguramente, querrá entrar en materia cuanto antes de la mano de interfaces menos austeras o, si se quiere, de mecanismos de comunicación que nos permitan enviar una solicitud única para que los artesanos del sonido intervengan por turnos cuando corresponda. Estas interfaces son lo que popularmente se tiene en mente cuando se habla de aplicaciones de extracción o "ripeo" de CDs.&lt;br /&gt;&lt;br /&gt;Tras esta introducción inicial podremos empezar a hablar con alguna de ellas. Comenzaremos por &lt;code&gt;abcde&lt;/code&gt; (&lt;em&gt;a better CD encoder&lt;/em&gt; = un mejor codificador de CDs) y seguiremos con &lt;code&gt;crip&lt;/code&gt;. Eso será el próximo día.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8823891603989242118?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8823891603989242118/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-mis-cds.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8823891603989242118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8823891603989242118'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-mis-cds.html' title='HAL y mis CDs'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1920424851268527101</id><published>2009-03-24T17:26:00.006+01:00</published><updated>2009-03-26T00:51:00.144+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (Markdown y Pandoc)</title><content type='html'>No es improbable que el lector impaciente se canse de tanta marca y decida seguir trabajando con los medios que ya conoce, que no son otros que los omnipresentes procesadores de textos. Dirá que ya le costó lo suyo desenvolverse en los complejos menús del procesador como para ponerse ahora a cambiar toda su forma de escritura por unos enigmáticos "códigos" más que difíciles de teclear y peores de aprender. Insistirá en que para la Web le bastan los formularios de su plataforma de &lt;em&gt;blogging&lt;/em&gt;, con sus perfectas barras de herramientas, tan estupendamente semejantes a las de los procesadores de texto. Concederá, finalmente, con inconfesada ironía, que el resultado con LaTeX es sorprendentemente bonito, pero total, para la cuatro cosas que va a escribir...&lt;br /&gt;&lt;br /&gt;Estos son los argumentos habituales que esgrimen los usuarios que podríamos calificar propiamente y sin intención ofensiva alguna como usuarios "esclavos", pues es esclavo quien permanece completamente atado a la tecnología que, de un modo un otro, le es impuesta, ya porque constituye la corriente dominante, ya porque es la primera que aprendió o, tal vez con mayor probabilidad, por ambas cosas juntas. Tales argumentos no son, en el fondo, más que racionalizaciones pergeñadas con el único fin de continuar encastillado en una posición inamovible.&lt;br /&gt;&lt;br /&gt;Ni HTML ni LaTeX son más difíciles de aprender que las innumerables opciones de menú de los procesadores de textos. En realidad, es mucho más natural plantear la tarea de escribir un documento electrónico cuando se establece de antemano una separación clara entre la estructura de su contenido y su forma de presentación.&lt;br /&gt;&lt;br /&gt;Podríamos llegar a aceptar que la introducción de las marcas, particularmente en el caso de HTML, mucho más prolijo en esto que LaTeX, puede llegar a ser bastante pesada, si no se dispone de las herramientas que para esta tarea proporcionan editores como &lt;em&gt;Vim&lt;/em&gt; o &lt;em&gt;Emacs&lt;/em&gt;. Pero, como vamos a ver hoy, hasta este último baluarte de la recalcitrante defensa del procesador de textos, cae ante la presencia de los lenguajes de marcas "ligeros" como &lt;em&gt;Markdown&lt;/em&gt;, que es el representante que hemos escogido de entre los muchos existentes.&lt;br /&gt;&lt;br /&gt;No hay forma de sostener racionalmente la indiferencia displicente ante los lenguajes de marcas cuando nos hallamos ante caso tan natural como el siguiente:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;% Un ejemplo de Markdown&lt;br /&gt;% átopos&lt;br /&gt;% 25 de Marzo de 2009&lt;br /&gt;&lt;br /&gt;# Navegación gráfica&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;1. Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;2. Crear en _Vim_ una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden `:new ruta_fichero`.&lt;br /&gt;&lt;br /&gt;# Navegación desde consola&lt;br /&gt;Si navegamos con _w3m_, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio _Vim_, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con _w3m_ el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción `-dump`. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Esto ya parece dar gato por libre. ¿Dónde están las marcas? ¿No es éste el texto tal cual lo hubiéramos escrito, de no existir el maravilloso procesador de textos? ¡Menudo avance! ¡Un regreso a las cavernas!&lt;br /&gt;&lt;br /&gt;Fíjese bien el lector incrédulo, porque las marcas siguen estando, pero reducidas a su más mínima expresión [El signo &lt;code&gt;&amp;para;&lt;/code&gt; indica un espacio]:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:red"&gt;%&lt;/span&gt; Un ejemplo de Markdown&lt;br /&gt;&lt;span style="color:red"&gt;%&lt;/span&gt; átopos&lt;br /&gt;&lt;span style="color:red"&gt;%&lt;/span&gt; 25 de Marzo de 2009&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;#&lt;/span&gt; Navegación gráfica &lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;1.&amp;para;&lt;/span&gt;Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;2.&amp;para;&lt;/span&gt;Crear en &lt;span style="color:red"&gt;_&lt;/span&gt;Vim&lt;span style="color:red"&gt;_&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:red"&gt;`&lt;/span&gt;:new ruta&lt;span style="color:red"&gt;_&lt;/span&gt;fichero&lt;span style="color:red"&gt;`&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;#&lt;/span&gt; Navegación desde consola&lt;br /&gt;Si navegamos con &lt;span style="color:red"&gt;_&lt;/span&gt;w3m&lt;span style="color:red"&gt;_&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;_&lt;/span&gt;Vim&lt;span style="color:red"&gt;_&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;_&lt;/span&gt;w3m&lt;span style="color:red"&gt;_&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;`&lt;/span&gt;-dump&lt;span style="color:red"&gt;`&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;para;&amp;para;&amp;para;&amp;para;&lt;/span&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Las equivalencias con nuestras &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;marcas informales&lt;/a&gt;, (incluidos los añadidos de los últimos días), que frente a tal simplicidad resultan terriblemente embarazosas, son transparentes como la luz de un día radiante. Hagásmolas explícitas, por si alguien sigue todavía encerrado entre cuatro paredes:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;TÍTULO, AUTOR y FECHA:&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;%&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO TÍTULO SECCIÓN:&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN TÍTULO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;Línea en blanco&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;1.&amp;para;&lt;/strong&gt; [y 2. , etc, para los siguientes elementos]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;_&lt;/strong&gt; [guión bajo]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;_&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;`&lt;/strong&gt; [acento grave]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;`&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;`&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;`&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO BLOQUE ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;para;&amp;para;&amp;para;&amp;para;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN BLOQUE ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Estas marcas, excepto la primera, pertenecen al lenguaje de marcas ligero conocido como &lt;a href="http://es.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt;. Su sintaxis completa se explica &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;aquí&lt;/a&gt;. La única precaución que hay que tomar es, como cabe esperar, la de escapar las marcas de &lt;em&gt;Markdown&lt;/em&gt; cuando se van a introducir como caracteres literales en el texto corriente. Por ejemplo, para introducir literalmente un asterisco (&lt;code&gt;*&lt;/code&gt;) tendremos que escribir &lt;code&gt;\*&lt;/code&gt;. Quedan excluidos los casos en que esos signos aparecen dentro de un fragmento de código (entre acentos graves) o en los bloques de código (que se identifican, como hemos visto, por su sangría de cuatro espacios). A las marcas de &lt;em&gt;Markdown&lt;/em&gt; se pueden añadir algunas otras, por ejemplo, la barra (&lt;code&gt;|&lt;/code&gt;) para señalar una celda de una tabla. Este conjunto de extensiones se conoce como &lt;a href="http://michelf.com/projects/php-markdown/extra/#table"&gt;Markdown Extra&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bien, las marcas fáciles, facilísimas, están ahí. ¿Qué podemos hacer con ellas? Los enterados saben que son la base, por ejemplo, de muchos sistemas de &lt;a href="http://es.wikipedia.org/wiki/Wiki"&gt;wikis&lt;/a&gt;. Pero nosotros no tenemos un wiki, todavía. No hace falta pensar, sin embargo, en aplicaciones especializadas. Los lenguajes de marcas ligeros pueden servir para escribir nuestros documentos y para que ayudantes especiales de HAL nos los devuelvan en un formato apto para su presentación, ya sea en la web o, incluso, en bella versión imprimible.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://johnmacfarlane.net/pandoc/"&gt;Pandoc&lt;/a&gt; es uno de estos eficientes colaboradores de HAL. Se trata de un conversor universal de un lenguaje de marcas a otro. Emplea las mismas marcas de &lt;em&gt;Markdown&lt;/em&gt; y &lt;em&gt;Markdown Extra&lt;/em&gt; con algunas extensiones y mejoras, como la marca &lt;code&gt;%&lt;/code&gt; para elementos del encabezado. Las variantes de &lt;em&gt;Pandoc&lt;/em&gt; en relación con &lt;em&gt;Markdown / Markdown Extra&lt;/em&gt; se pueden consultar &lt;a href="http://johnmacfarlane.net/pandoc/README.html#pandocs-markdown-vsstandard-markdown"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Pandoc&lt;/em&gt; está disponible en Debian y se puede instalar como cualquier paquete:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;aptitude install pandoc&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con &lt;em&gt;Pandoc&lt;/em&gt; la conversión de nuestro texto a HTML, LaTeX y otros muchos lenguajes de marcas es cosa de niños, basta con pedírselo a HAL. &lt;br /&gt;&lt;br /&gt;Supongamos que el texto anterior lo guardamos en el fichero &lt;code&gt;texto_etiquetado-pandoc.mdml&lt;/code&gt; (la extensión &lt;code&gt;mdml&lt;/code&gt;, que es opcional, es una abreviatura de &lt;em&gt;MarkDown Markup Language&lt;/em&gt;). En tal caso, podríamos solicitar a HAL lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;HAL, llama a tu ayudante en conversión de marcas para que convierta 'texto_etiquetado-pandoc.mdml' de [&lt;em&gt;from&lt;/em&gt;] Markdown a [&lt;em&gt;to&lt;/em&gt;] HTML.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que se puede expresar así:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -f markdown -t html texto_etiquetado-pandoc.mdml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;HAL nos devolverá el texto marcado con HTML, un HTML muy parecido al que obtuvimos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-i.html#marcas_html"&gt;hace unos días&lt;/a&gt;, aunque con un formato distinto, que en ningún caso afecta a la interpretación que un navegador hará de él. De hecho, la salida de &lt;code&gt;pandoc&lt;/code&gt; se puede enviar directamente a &lt;em&gt;w3m&lt;/em&gt; mediante una tubería:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se advertirá que en el HTML resultante no hay rastro de lo marcado con &lt;code&gt;%&lt;/code&gt;, esto es, título, autor y fecha. Esta información se debería integrar en la cabecera de HTML (la etiqueta &lt;code&gt;HEAD&lt;/code&gt;), pero &lt;code&gt;pandoc&lt;/code&gt; la descarta por defecto, a menos que le indiquemos lo contrario con la opción &lt;code&gt;--standalone&lt;/code&gt; (= autónomo), o &lt;code&gt;-s&lt;/code&gt;, en versión abreviada. Con esta opción activada, &lt;code&gt;pandoc&lt;/code&gt; crea un documento autónomo, un HTML completo con su declaración de documento y su oportuna cabecera. Podemos volver a ejecutar la orden, redirigir el resultado a &lt;em&gt;w3m&lt;/em&gt; y, por medio de la  &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-w3m-ii.html"&gt;orden &lt;code&gt;v&lt;/code&gt;&lt;/a&gt; de &lt;em&gt;w3m&lt;/em&gt;, inspeccionar el HTML.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -s -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La conversión a LaTeX sigue los mismos derroteros:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -f markdown -t latex texto_etiquetado-pandoc.mdml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y la versión autónoma se obtiene mediante el mismo procedimiento:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -s -f markdown -t latex texto_etiquetado-pandoc.mdml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado es prácticamente idéntico a &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v.html#latex_marcas_verbatim"&gt;uno de los nuestros&lt;/a&gt;. La única diferencia reseñable está en el preámbulo del documento, una diferencia que sí afectaría al resultado final del procesamiento con &lt;code&gt;pdflatex&lt;/code&gt;. La razón es que &lt;code&gt;pandoc&lt;/code&gt; no tiene en cuenta, porque no puede saberlo de antemano, que nuestro texto está escrito en castellano. Tenemos que decírselo explícitamente. La forma de hacerlo es bien simple. Creamos, para empezar, un fichero, llamémoslo &lt;code&gt;preambulo-latex&lt;/code&gt;, que contenga nuestro preámbulo, por ejemplo, éste:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;\documentclass[a4paper]{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;\usepackage{bera}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Después, se informa a &lt;code&gt;pandoc&lt;/code&gt; de nuestro preámbulo para que lo aplique en lugar del que él utliza por defecto. Para ello recurrimos a la opción &lt;code&gt;--custom-header&lt;/code&gt; (= cabecera personalizada) o, su versión abreviada, &lt;code&gt;-C&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pandoc -s -C preamulo_latex -f markdown -t latex texto_etiquetado-pandoc.mdml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado se podría redirigir a un fichero para procesarlo más tarde con &lt;code&gt;pdflatex&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Con el fin de evitarnos los pasos intermedios en la generación del PDF, &lt;em&gt;Pandoc&lt;/em&gt; proporciona como alternativa rápida el guión &lt;code&gt;markdown2pdf&lt;/code&gt;, que generaría un fichero con extensión &lt;code&gt;pdf&lt;/code&gt; y el mismo nombre de nuestro fichero original:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;markdown2pdf -C preambulo_latex texto_etiquetado-pandoc.mdml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Pandoc&lt;/em&gt;, aparte de su facultad para convertir a otros muchos formatos, permite usos más sofisticados, como, por ejemplo, introducir directamente marcas LaTeX en el documento marcado con &lt;em&gt;Markdown&lt;/em&gt; que se mantendrán literalmente en el documento resultante, lo que facilita la construcción de documentos LaTeX más elaborados. Todo esta documentado en la página web citada y en el fichero &lt;code&gt;README&lt;/code&gt;, que se encuentra en la documentación del paquete Debian: &lt;code&gt;/usr/share/doc/pandoc/README.gz&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Con &lt;em&gt;Markdown&lt;/em&gt; y &lt;em&gt;Pandoc&lt;/em&gt; finalizamos, de momento, este primer contacto con los lenguajes de marcas. Mucho queda en el tintero. Es casi vergonzoso no haber presentado, en particular, el metalenguaje &lt;a href="http://es.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; y algunos de los lenguajes de marcas construidos a partir de él. Otra vez será.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;Los lenguajes de marcas ligeros facilitan el tecleado de las marcas y pueden aprenderse en pocos minutos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Markdown&lt;/em&gt; es un lenguaje ligero de marcas.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Pandoc&lt;/em&gt; es un sistema de conversión de lenguajes de marcas, especialmente apropiado para producir documentos LaTeX sencillos a partir de lenguajes de marcas ligeros. Ofrece una interfaz de línea de comandos a través de la orden &lt;code class="orden"&gt;pandoc&lt;/code&gt; y de algún guión, como &lt;code class="orden"&gt;markdown2pdf&lt;/code&gt;, para facilitar la generación de documentos típicos.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1920424851268527101?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1920424851268527101/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-markdown-y-pandoc.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1920424851268527101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1920424851268527101'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-markdown-y-pandoc.html' title='HAL y las marcas (Markdown y Pandoc)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4221612909215170225</id><published>2009-03-23T23:21:00.004+01:00</published><updated>2009-03-24T01:42:29.839+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - anexo)</title><content type='html'>Recurrir al paquete &lt;em&gt;listing&lt;/em&gt; para un tarea tan elemental como la que requiere nuestro simplísimo texto de ejemplo es como hablar con HAL únicamente para preguntarle su nombre. No es de recibo dejar ese fleco abierto. Un texto más complejo permitirá apreciar por qué &lt;em&gt;listing&lt;/em&gt; es un paquete ampliamente recomendado para la presentación de código.&lt;br /&gt;&lt;br /&gt;Vamos a producir un documento que incluya directamente el código de una orden de las primerísimas que vimos en estas conversaciones con HAL. Se trata del código, escrito en C, de la orden &lt;code&gt;hostname&lt;/code&gt;. El código mismo no puede distribuirse sino mediante la licencia GPL, como se especifica en su primer comentario. Aquí sólo mostramos el fichero LaTeX para producir el documento y la primera página que resulta de su procesamiento. Las marcas que no se han explicado se señalan en rojo. El lector interesado puede encontrar ayuda completa sobre estas marcas y sobre &lt;em&gt;listings&lt;/em&gt; en &lt;code&gt;/usr/share/doc/texlive-doc/latex/listings/listings.pdf&lt;/code&gt;, si su distribución está basada en Debian.&lt;br /&gt;&lt;br /&gt;El breve fichero LaTeX a partir del que generaremos la versión coloreada del código es éste:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\documentclass[a4paper]{article}&lt;br /&gt;\usepackage{bera}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;\usepackage{xcolor}&lt;br /&gt;\usepackage{listings}&lt;br /&gt;\lstset{%&lt;br /&gt;&lt;span style="color:red"&gt;  numbers=left,&lt;/span&gt;&lt;br /&gt;  basicstyle=&lt;span style="color:red"&gt;\footnotesize&lt;/span&gt;\ttfamily,&lt;br /&gt;&lt;span style="color:red"&gt;  commentstyle=\color{violet},&lt;br /&gt;  stringstyle=\color{magenta},&lt;br /&gt;  keywordstyle=\color{purple},&lt;br /&gt;  identifierstyle=\color{teal},&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;&lt;span style="color:red"&gt;\lstinputlisting[language=C]{hostname.c}&lt;/span&gt;&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y ésta es una imagen con la primera página del documento generado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/Scgq95oGO5I/AAAAAAAAAC8/OOJYXBEM6hg/s1600-h/latex_file-pdf3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 343px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/Scgq95oGO5I/AAAAAAAAAC8/OOJYXBEM6hg/s400/latex_file-pdf3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316546603040258962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¡&lt;em&gt;Happy Latexing&lt;/em&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4221612909215170225?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4221612909215170225/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-anexo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4221612909215170225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4221612909215170225'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-anexo.html' title='HAL y las marcas (LaTeX - anexo)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-HIqqxAvoQI/Scgq95oGO5I/AAAAAAAAAC8/OOJYXBEM6hg/s72-c/latex_file-pdf3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1507887925743518310</id><published>2009-03-23T17:17:00.000+01:00</published><updated>2009-03-23T17:17:29.491+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - VI)</title><content type='html'>El &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v.html"&gt;día pasado&lt;/a&gt; acudimos excepcionalmente a una orden de estilo para poder integrar los resultados habituales del paquete &lt;em&gt;listings&lt;/em&gt; en nuestro texto. Ya puestos, y como la veda se ha levantado parcialmente, vamos a tolerar otra excepción y sustituir la marca que establecimos para nombres de programas.&lt;br /&gt;&lt;br /&gt;Es una convención frecuente presentar estos nombres con una familia de fuente diferente. Puesto que la familia por defecto en LaTeX es &lt;em&gt;Serif&lt;/em&gt; y, puesto que la familia &lt;em&gt;Typewritter&lt;/em&gt; (&lt;em&gt;Monospace&lt;/em&gt;) es la elegida para el código, la opción recomendable es reservar la familia restante de la típica triada, &lt;em&gt;Sans Serif&lt;/em&gt;, para nuestros nombres de programas.&lt;br /&gt;&lt;br /&gt;Podríamos etiquetarlos directamente con la marca que define justo esa familia:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\textsf{&lt;em&gt;nombre_programa&lt;/em&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pero, dado que esta marca no dice nada sobre la función estructural del texto marcado y ante la posibilidad, además, de que cambiemos en el futuro de idea al definir las características de presentación de los nombres de programas, es mucho mejor crear una marca propia, llamémosla &lt;code&gt;\Prog&lt;/code&gt;, que permita envolver la citada definición de fuente u otras definiciones futuras.&lt;br /&gt;&lt;br /&gt;Para crear marcas propias, lo que en terminología de LaTeX se llamarían &lt;em&gt;órdenes&lt;/em&gt; propias, se usa la orden de LaTeX &lt;code&gt;\newcommand&lt;/code&gt;. Esta orden tendría, en el caso que nos ocupa el siguiente aspecto:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\newcommand{\Prog}[1]{\textsf{#1}}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La sintaxis indica que, en el lugar en el que nosotros pongamos la marca &lt;code&gt;\Prog{&lt;em&gt;texto&lt;/em&gt;}&lt;/code&gt;, donde &lt;code&gt;&lt;em&gt;texto&lt;/em&gt;&lt;/code&gt; es el argumento único (argumento &lt;code&gt;1&lt;/code&gt; de &lt;code&gt;\Prog&lt;/code&gt;), el sistema de procesamiento del documento pondrá &lt;code&gt;\textsf{&lt;em&gt;texto&lt;/em&gt;}&lt;/code&gt;. El &lt;code&gt;&lt;em&gt;texto&lt;/em&gt;&lt;/code&gt; en &lt;code&gt;\textsf&lt;/code&gt; es el mismo &lt;code&gt;&lt;em&gt;texto&lt;/em&gt;&lt;/code&gt; de &lt;code&gt;\Prog&lt;/code&gt;, que se pasa como valor al primer y único contenedor, &lt;code&gt;#1&lt;/code&gt;, que nuestra orden &lt;code&gt;\newcommand&lt;/code&gt; ha establecido para &lt;code&gt;\textsf&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Lo único que hay que tener en cuenta a la hora de crear estas marcas propias es que el nombre de la marca elegida no exista ya entre las marcas de LaTeX o entre las de sus paquetes. Si albergamos dudas al respecto, podemos utilizar, en lugar de &lt;code&gt;\newcommand&lt;/code&gt;, la orden &lt;code&gt;\providecommand&lt;/code&gt;, que tendrá el mismo resultado que &lt;code&gt;\newcommand&lt;/code&gt; cuando &lt;code&gt;\Prog&lt;/code&gt; no sea una marca de LaTeX o sus paquetes y que no producirá efecto alguno, cuando la marca ya exista:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\providecommand{\Prog}[1]{\textsf{#1}}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, para que las órdenes &lt;code&gt;\newcommand&lt;/code&gt; o &lt;code&gt;\providecommand&lt;/code&gt; sean tenidas en cuenta, se deben incluir en el preámbulo del documento después de las solicitudes de carga de paquetes.&lt;br /&gt;&lt;br /&gt;Con este último refinamiento podríamos considerar acabado nuestro trabajo con las marcas de LaTeX, pero aún podemos introducir unas pocas mejoras más.&lt;br /&gt;&lt;br /&gt;En primer lugar, vamos a utilizar un tipo de fuente distinta de la que por defecto utiliza LaTeX. La razón es que, aunque la fuente por defecto de LaTeX (&lt;em&gt;Computer Modern&lt;/em&gt;) es estupenda para texto impreso, cabe la posibilidad de que nuestro documento se visualice más frecuentemente en pantalla. Una fuente más legible en pantalla puede ser beneficiosa. Seleccionaremos la fuente &lt;em&gt;Bera&lt;/em&gt;, que viene incluida en &lt;em&gt;TeX Live&lt;/em&gt; y que se activa mediante la carga de un paquete:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\usepackage{bera}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya que asumimos que nuestro documento se verá en pantalla, podríamos también beneficiarnos del uso de colores, especialmente para resaltar los fragmentos de código.&lt;br /&gt;&lt;br /&gt;Para disponer de soporte de colores en un documento LaTeX podemos usar el paquete &lt;em&gt;xcolor&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\usepackage{xcolor}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El color para todo el código se puede establecer con la etiqueta &lt;code&gt;\color{&lt;em&gt;nombre_color&lt;/em&gt;}&lt;/code&gt; en la configuración inicial de &lt;em&gt;listings&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\lstset{basicstyle=&lt;span style="color:red;"&gt;\color{teal}&lt;/span&gt;\small\ttfamily}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;También añadiremos una sección previa con el título del documento, el autor y la fecha (la fecha la introduce por defecto LaTeX). Se debe solicitar explícitamente la generación del título mediante la orden &lt;code&gt;\maketitle&lt;/code&gt;. El grupo de marcas adecuadas puede ir todo él justo después de &lt;code&gt;\begin{document}&lt;/code&gt;, aunque hay quien prefiere situar &lt;code&gt;\title&lt;/code&gt; y &lt;code&gt;\author&lt;/code&gt; en el preámbulo.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;\title{Un ejemplo juguete de \LaTeX}&lt;br /&gt;\author{átopos}&lt;br /&gt;\maketitle&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(Cuando la palabra 'LaTeX' aparece precedida por la barra invertida, tal como acabamos de hacer, el tipógrafo producirá un versión embellecida de esa palabra. Es el ejemplo típico que se espeta a los usuarios de sistemas de preparación de documentos no profesionales: "¡Aficionados, a ver cómo os las apañáis para producir estos nuestros hermosos tipos!".)&lt;br /&gt;&lt;br /&gt;Finalmente, estableceremos el tamaño de la página a A4, que es el modelo de página habitual en Europa. Basta para ello una opción en la declaración inicial de la clase de documento:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\documentclass[&lt;span style="color:red;"&gt;a4paper&lt;/span&gt;]{article}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hemos terminado de etiquetar con LaTeX nuestro documento. Proponemos como ejercicio para el lector la modificación de los ficheros &lt;code&gt;txt2latex.sed&lt;/code&gt; y &lt;code&gt;generar_latex&lt;/code&gt; que corresponda a las transformaciones y añadidos que hemos introducido en estos dos últimos capítulos. El fichero &lt;code&gt;txt2latex.tex&lt;/code&gt; resultante debería ser el siguiente:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:green"&gt; \documentclass[a4paper]{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;\usepackage{bera}&lt;br /&gt;\usepackage{xcolor}&lt;br /&gt;\usepackage{listings}&lt;br /&gt;\lstset{basicstyle=\color{teal}\small\ttfamily}&lt;br /&gt;&lt;br /&gt;\newcommand{\Prog}[1]{\textsf{#1}}&lt;br /&gt;&lt;br /&gt;\title{Un ejemplo juguete de \LaTeX}&lt;br /&gt;\author{átopos}&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\maketitle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación gráfica&lt;span style="color:red"&gt;}&lt;br /&gt;&lt;/span&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\begin{enumerate}&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Ir al menú &amp;lt;&amp;lt;Archivo&amp;gt;&amp;gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Crear en &lt;span style="color:red"&gt;\Prog{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:red"&gt;\lstinline!&lt;/span&gt;:new ruta_fichero&lt;span style="color:red"&gt;!&lt;/span&gt;.&lt;br /&gt;&lt;span style="color:red"&gt;\end{enumerate}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación desde consola&lt;span style="color:red"&gt;}&lt;br /&gt;&lt;/span&gt;Si navegamos con &lt;span style="color:red"&gt;\Prog{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;\Prog{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;\Prog{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;\lstinline!&lt;/span&gt;-dump&lt;span style="color:red"&gt;!&lt;/span&gt;. Por ejemplo:&lt;span style="color:red"&gt;&lt;br /&gt;\begin{lstlisting}&lt;br /&gt;&lt;/span&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;span style="color:red"&gt;&lt;br /&gt;\end{lstlisting}&lt;br /&gt;&lt;/span&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:green"&gt;\end{document}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Tras procesar este fichero con &lt;code&gt;pdflatex&lt;/code&gt;, se obtiene &lt;code&gt;texto_etiquetado.pdf&lt;/code&gt;, que podrá verse con cualquier lector de PDFs:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-HIqqxAvoQI/Sce1iF68myI/AAAAAAAAAC0/wXa4Spw5o5Y/s1600-h/latex_file-pdf2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 367px;" src="http://2.bp.blogspot.com/_-HIqqxAvoQI/Sce1iF68myI/AAAAAAAAAC0/wXa4Spw5o5Y/s400/latex_file-pdf2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316417482443758370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;LaTeX permite crear marcas personalizadas con la orden &lt;code&gt;\newcommand&lt;/code&gt; o con la orden &lt;code&gt;\providecommand&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El paquete &lt;code&gt;xcolor&lt;/code&gt; proporciona soporte de colores en documentos LaTeX.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La creación de una sección previa con el título del documento y de su autor o fecha de escritura es trivial con LaTeX.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1507887925743518310?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1507887925743518310/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v-borrador.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1507887925743518310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1507887925743518310'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v-borrador.html' title='HAL y las marcas (LaTeX - VI)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-HIqqxAvoQI/Sce1iF68myI/AAAAAAAAAC0/wXa4Spw5o5Y/s72-c/latex_file-pdf2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-8925695723171083345</id><published>2009-03-23T00:00:00.004+01:00</published><updated>2009-03-23T01:38:17.624+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - V)</title><content type='html'>Nuestro &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iii.html#marcas_latex"&gt;fichero marcado con LaTeX&lt;/a&gt; no es una traducción perfecta de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;nuestro fichero marcado con marcas informales&lt;/a&gt;. Ante el desconocimiento de marcas LaTeX apropiadas para los elementos peculiares y, en principio, exclusivos de nuestro texto original (nombre de programa, opción y orden), llegamos al compromiso provisional de suprimir tales marcas.&lt;br /&gt;&lt;br /&gt;No hay nada en LaTeX que obligue a una concesión tan poco justa. De hecho, LaTeX proporciona dos marcas, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-i.html"&gt;equivalentes al &lt;code&gt;&amp;lt;EM&amp;gt;&lt;/code&gt; y al &lt;code&gt;&amp;lt;CODE&amp;gt;&lt;/code&gt; de HMTL&lt;/a&gt;, que pueden desempeñar perfectamente el mismo papel:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\emph{&lt;em&gt;texto&lt;/em&gt;}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Marca el &lt;em&gt;texto&lt;/em&gt; como texto enfatizado.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\verb &lt;em&gt;CAR&lt;/em&gt; &lt;em&gt;texto&lt;/em&gt; &lt;em&gt;CAR&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Marca el &lt;em&gt;texto&lt;/em&gt; como código de computador. &lt;code&gt;&lt;em&gt;CAR&lt;/em&gt;&lt;/code&gt; funciona aquí como delimitador y puede ser cualquier carácter que no forme parte del texto que marca. (Los espacios no deben incluirse y se han escrito sólo para facilitar su comprensión). Así, por ejemplo, el fragmento de texto '&lt;code&gt;-dump&lt;/code&gt;' se podría marcar de esta forma: &lt;code&gt;\verb!-dump!&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Por si fuera poco, LaTeX dispone también de un entorno semejante a &lt;code&gt;\verb&lt;/code&gt; para marcar bloques independientes de código, como el que constituye la penúltima línea de nuestro texto original. Lo que implica que deberíamos haber utilizado una marca diferente para el bloque de código que constituye esa línea. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:red"&gt;INICIO BLOQUE ORDEN&lt;/span&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;span style="color:red"&gt;FIN BLOQUE ORDEN&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si, además, concebimos dicha línea como un bloque de código, resulta innecesario situarla ahora como un párrafo aparte y pensar la línea subsiguiente como otro párrafo más. En realidad, esa forma de escribir no sería estructuralmente correcta, si es que tenemos en cuenta el sentido mismo del texto. La multiplicación de párrafos es una consecuencia indeseable de no haber comprendido que la línea en cuestión debe formar parte del mismo párrafo, lo que en ningún caso significa que no pueda tener un valor estructuralmente especial dentro de él, como bloque de código lógicamente independiente. Es notable como LaTeX nos fuerza, pues, a ser más finos a la hora de estructurar nuestra escritura, gracias a la disponibilidad de marcas distintas para unidades lógicas diferentes. &lt;br /&gt;&lt;br /&gt;En consecuencia, la parte afectada de nuestro texto con marcas informales se puede reescribir ahora de una forma más precisa:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:red"&gt;INICIO PÁRRAFO&lt;/span&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;INICIO NOMBRE PROGRAMA&lt;/span&gt;w3m&lt;span style="color:red"&gt;FIN NOMBRE PROGRAMA&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;INICIO OPCIÓN&lt;/span&gt;-dump&lt;span style="color:red"&gt;FIN OPCIÓN&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;span style="color:red"&gt;INICIO BLOQUE ORDEN&lt;/span&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;span style="color:red"&gt;FIN BLOQUE ORDEN&lt;/span&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:red"&gt;FIN PÁRRAFO&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Con estas nuevas marcas de LaTeX es casi trivial modificar el fichero &lt;code&gt;txt2latex.sed&lt;/code&gt; para que procese estas tres líneas como debe:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;s/INICIO NOMBRE FICHERO/\\emph{/g&lt;br /&gt;s/FIN NOMBRE FICHERO/}/g&lt;br /&gt;s/INICIO ORDEN/\\verb!/g&lt;br /&gt;s/FIN ORDEN/\!/g&lt;br /&gt;s/INICIO BLOQUE ORDEN/\n\\begin{verbatim}\n/g&lt;br /&gt;s/FIN BLOQUE ORDEN/\n\\end{verbatim}\n/g&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Por otra parte, habría que suprimir, además, la línea de &lt;code&gt;txt2latex.sed&lt;/code&gt; que añadía el carácter de escape al guión bajo, puesto que ya no es necesaria: en un fragmento de texto con las marcas LaTeX mentadas los caracteres especiales de LaTeX se interpretan literalmente sin que haya necesidad de escaparlos.&lt;br /&gt;&lt;br /&gt;Tras ejecutar el guión &lt;code&gt;generar_latex fichero_etiquetado.txt&lt;/code&gt; ---&lt;code&gt;fichero_etiquetado.txt&lt;/code&gt; se ha de modificar previamente como acabamos de explicar---, el fichero resultante, &lt;code&gt;fichero_etiquetado.tex&lt;/code&gt; tendría el siguiente aspecto:&lt;br /&gt;&lt;code id="latex_marcas_verbatim"&gt;&lt;br /&gt;&lt;span style="color:green"&gt;\documentclass{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación gráfica&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\begin{enumerate}&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Ir al menú &amp;lt;&amp;lt;Archivo&amp;gt;&amp;gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Crear en &lt;span style="color:red"&gt;\emph{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:red"&gt;\verb!&lt;/span&gt;:new ruta_fichero&lt;span style="color:red"&gt;!&lt;/span&gt;.&lt;br /&gt;&lt;span style="color:red"&gt;\end{enumerate}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación desde consola&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si navegamos con &lt;span style="color:red"&gt;\emph{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;\emph{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;\emph{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;\verb!&lt;/span&gt;-dump&lt;span style="color:red"&gt;!&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;span style="color:red"&gt;\begin{verbatim}&lt;/span&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;span style="color:red"&gt;\end{verbatim}&lt;/span&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:green"&gt;\end{document}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Si el LaTeX básico dispone de marcas suficientes para etiquetar todo nuestro texto original, ¿por que no las comentamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-i.html"&gt;a su debido tiempo&lt;/a&gt;? ¿Por qué hemos diferido su explicación hasta ahora?&lt;br /&gt;&lt;br /&gt;La razón es que no vamos a utilizar las marcas descritas, sino otras, más elaboradas, que obligan a recurrir a algún paquete que extienda las funcionalidades básicas de LaTeX. Y no las vamos a utilizar, porque, aunque son perfectamente válidas para un texto tan simple como el de nuestro ejemplo, conviene tener noticia de mecanismos más sofisticados y aptos para situaciones más complejas. De paso, veremos tomaremos contacto con el tipo de mecanismos habituales en el uso de paquetes.&lt;br /&gt;&lt;br /&gt;Un paquete especialmente indicado para casos en los que hay que introducir código es el paquete &lt;em&gt;listings&lt;/em&gt;, que vendrá instalado en cualquier distribución de LaTeX y, por supuesto, en &lt;em&gt;TeX Live&lt;/em&gt;. El paquete &lt;em&gt;listings&lt;/em&gt; suministra dos marcas parejas al &lt;code&gt;\verb&lt;/code&gt; y al entorno &lt;em&gt;verbatim&lt;/em&gt; comentados anteriormente. Son las siguientes:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\lstlisting &lt;em&gt;CAR&lt;/em&gt; &lt;em&gt;código&lt;/em&gt; &lt;em&gt;CAR&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Permite marcar fragmentos de código.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\begin{lstlisting}&lt;em&gt;código&lt;/em&gt;\end{lstlisting}&lt;/code&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;Permite marcar bloques de código.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;em&gt;listings&lt;/em&gt;, como cualquier paquete, debe cargarse en el preámbulo del documento con la orden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\usepackage{listings}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tras ella suele aparecer una orden de configuración de las opciones del paquete. En nuestro caso, es imprescindible, al menos, una opción, la que defina la fuente básica con que se mostrará el código para que se diferencie del texto corriente. &lt;code&gt;\verb&lt;/code&gt; y &lt;code&gt;verbatim&lt;/code&gt; lo hacían por nosotros, establecían la fuente como perteneciente a la familia &lt;em&gt;Typewriter&lt;/em&gt;, pero &lt;em&gt;listings&lt;/em&gt; no lo hace por defecto, y no lo hace, porque no presupone por adelantado que nuestro documento pueda contener algo más que código. Debemos pues, excepcionalmente, tocar este aspecto del estilo. La orden que permite refinar la configuración de &lt;em&gt;listings&lt;/em&gt; es &lt;code&gt;\lstset{&lt;em&gt;opciones_configuración&lt;/em&gt;}&lt;/code&gt; y la opción para modificar la familia de la fuente básica de forma que utilice la familia &lt;em&gt;Typewriter&lt;/em&gt; es &lt;code&gt;basicstyle=\ttfamily&lt;/code&gt;. Por otra parte, &lt;em&gt;listings&lt;/em&gt; suele requerir de una disminución del tamaño de la fuente básica cuando las líneas de código son más largas de lo acostumbrado, como la penúltima línea de nuestro texto original. Ahí podemos utilizar la orden &lt;code&gt;\small&lt;/code&gt; de LaTeX, que utiliza una fuente más pequeña de la habitual. En nuestro caso concreto, la opción podría aparecer también como parte de la configuración básica, es decir, dentro de &lt;code&gt;\lstset&lt;/code&gt;, o bien como opción que matiza un entorno &lt;code&gt;lstlisting&lt;/code&gt; en particular. Nosotros vamos a quedarnos con la primera posibilidad, aunque pueda ser discutible desde el punto de vista estético.&lt;br /&gt;&lt;br /&gt;Por tanto, y teniendo en cuenta las anteriores explicaciones, deberíamos añadir estas dos líneas al preámbulo de nuestro documento:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;\usepackage{listings}&lt;br /&gt;\lstset{basicstyle=\small\ttfamily}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finalmente sólo falta sustituir los &lt;code&gt;\verb&lt;/code&gt; y &lt;code&gt;\verbatim&lt;/code&gt; de antes por las marcas equivalentes de &lt;em&gt;listings&lt;/em&gt; [Las modificaciones se muestran en azul]:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:green"&gt;\documentclass{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue"&gt;\usepackage{listings}&lt;br /&gt;\lstset{basicstyle=\small\ttfamily}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green"&gt;\begin{document}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación gráfica&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\begin{enumerate}&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Ir al menú &amp;lt;&amp;lt;Archivo&amp;gt;&amp;gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Crear en &lt;span style="color:red"&gt;\emph{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:blue"&gt;\lstinline!&lt;/span&gt;:new ruta_fichero&lt;span style="color:blue"&gt;!&lt;/span&gt;.&lt;br /&gt;&lt;span style="color:red"&gt;\end{enumerate}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación desde consola&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si navegamos con &lt;span style="color:red"&gt;\emph{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;\emph{&lt;/span&gt;Vim&lt;span style="color:red"&gt;}&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;\emph{&lt;/span&gt;w3m&lt;span style="color:red"&gt;}&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:blue"&gt;\lstinline!&lt;/span&gt;-dump&lt;span style="color:blue"&gt;!&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;span style="color:blue"&gt;\begin{lstlisting}&lt;/span&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;span style="color:blue"&gt;\end{lstlisting}&lt;/span&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:green"&gt;\end{document}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;LaTeX suele favorecer e, incluso, forzar, al escritor a tomar conciencia plena de la estructura lógica de sus escritos.&lt;/li&gt; &lt;br /&gt;&lt;li&gt;El paquete &lt;em&gt;listings&lt;/em&gt; extiende las funcionalidades básicas de LaTeX para la edición de documentos que contengan cualquier clase de código.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La mayoría de los paquetes, como &lt;em&gt;listings&lt;/em&gt;, proporcionan marcas u órdenes especializadas que el usuario puede utilizar de acuerdo con sus fines concretos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las paquetes más versátiles, como &lt;em&gt;listings&lt;/em&gt;, proporcionan al usuario la posibilidad de configurar muchos detalles que afectan al resultado final.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-8925695723171083345?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/8925695723171083345/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8925695723171083345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/8925695723171083345'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-v.html' title='HAL y las marcas (LaTeX - V)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-438604967453422999</id><published>2009-03-21T18:36:00.005+01:00</published><updated>2009-03-21T23:19:04.579+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Aplicaciones de consola'/><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - IV)</title><content type='html'>Vale. Hemos marcado nuestro texto como LaTeX prescribe. Pero ¿cómo podemos ver el resultado? &lt;br /&gt;&lt;br /&gt;Para un texto marcado con marcas HTML el navegador hace las veces del experto que lo procesa y del soporte para su visualización. Para un texto marcado con LaTeX, las dos acciones, la de procesar el documento y la de visualizarlo, son, sin embargo, competencia de dos agentes diferentes: el tipógrafo y el "lector" o "visualizador" del documento resultante, normalmente, en nuestros días, un fichero PDF.&lt;br /&gt;&lt;br /&gt;El tipógrafo más recomendable en la actualidad para documentos LaTeX se llama &lt;a href="http://en.wikipedia.org/wiki/Pdftex"&gt;pdfTeX&lt;/a&gt;, un descendiente del original &lt;a href="http://es.wikipedia.org/wiki/TeX"&gt;TeX&lt;/a&gt;, que todavía se sigue usando, y mucho. &lt;a href="http://www.luatex.org/"&gt;LuaTeX&lt;/a&gt;, nieto de TeX e hijo de pdfTeX, podría consolidarse como el noble heredero de ambos en los próximos años.&lt;br /&gt;&lt;br /&gt;pdfTeX y todo lo que se requiere para procesar un documento LaTeX viene incluido en todas las distribuciones modernas de GNU/Linux. En Debian, por ejemplo, se empaqueta dentro de los paquetes que incluyen el prefijo &lt;em&gt;texlive-&lt;/em&gt;. &lt;a href="http://www.tug.org/texlive/"&gt;TeX Live&lt;/a&gt;, que es la distribución más completa que existe para procesar documentos con LaTeX, es realmente grande y por eso Debian ofrece la posibilidad de instalar todo TeX Live, mediante el paquete &lt;em&gt;texlive-full&lt;/em&gt;, o sólo una parte básica, mediante el paquete &lt;em&gt;texlive&lt;/em&gt; y otros posibles añadidos.&lt;br /&gt;&lt;br /&gt;Si el lector dispone de una gran cantidad de disco duro puede proceder a instalar &lt;em&gt;texlive-full&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;aptitude install texlive-full&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En caso de que quiera ahorrar espacio, bastará con que instale, por lo pronto, tres paquetes (de los cuales sólo los dos primeros son imprescindibles):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;aptitude install texlive texlive-lang-spanish texlive-doc-es&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tenemos ya a nuestros expertos ahí disponibles para todo lo que les ordenemos. No perdamos más tiempo y hagamos que pongan su imprenta en marcha sobre nuestro documento. Llamaremos a &lt;code&gt;pdflatex&lt;/code&gt; que es el ayudante de pdfTeX encargado de procesar los documentos LaTeX:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pdflatex texto_etiquetado.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si no hay ningún error sintáctico en nuestras marcas LaTeX, &lt;code&gt;pdflatex&lt;/code&gt; terminará su trabajo rápidamente tras expulsar algunos mensajes sobre el procesamiento. El resultado quedará guardado en el fichero &lt;code&gt;texto_etiquetado.pdf&lt;/code&gt;. Cualquier lector de PDF nos mostrará el resultado:&lt;br /&gt;&lt;br /&gt;&lt;a id="latex-1ver" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-HIqqxAvoQI/ScVLtziP4sI/AAAAAAAAACk/1_qsbNU0XfA/s1600-h/latex_file-pdf.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 349px;" src="http://2.bp.blogspot.com/_-HIqqxAvoQI/ScVLtziP4sI/AAAAAAAAACk/1_qsbNU0XfA/s400/latex_file-pdf.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315738185480790722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pero, ¿y si hemos cometido un error sintáctico en las marcas? Lo que sucederá es que &lt;code&gt;pdflatex&lt;/code&gt; se detendrá y nos mostrará un mensaje de error. Los mensajes de error de &lt;code&gt;pdflatex&lt;/code&gt; pueden ser difícilmente comprensibles; lo peor, sin embargo, es que tendremos que aprender algunos atajos de teclado para salir del procesamiento detenido y, sobre todo, nos veremos obligados a volver a ejecutar &lt;code&gt;pdflatex&lt;/code&gt; cuantas veces sea necesario hasta corregir todos los errores. Una opción para evitar, al menos, esto último, es utilizar un corrector de la sintaxis de LaTeX antes de procesar el documento con &lt;code&gt;pdflatex&lt;/code&gt;. Podemos recurrir a &lt;code&gt;lacheck&lt;/code&gt;, que viene incluido en TeX Live.&lt;br /&gt;&lt;br /&gt;Imaginemos, por ejemplo, que nos comimos ---un hambre descuidada produce estos males--- la llave de cierre en la primera sección y el &lt;code&gt;\end{enumerate}&lt;/code&gt; al final de la lista. O sea:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;  &lt;span style="color:green"&gt;6 &lt;/span&gt;\begin{document}&lt;br /&gt;  &lt;span style="color:green"&gt;7 &lt;/span&gt;\section{Navegación gráfica &lt;span style="color:red"&gt;&amp;lt;== Falta llave de cierre&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:green"&gt;8 &lt;/span&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;  &lt;span style="color:green"&gt;9&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;10 &lt;/span&gt;\begin{enumerate}&lt;br /&gt; &lt;span style="color:green"&gt;11 &lt;/span&gt;\item Ir al menú &amp;lt;&amp;lt;Archivo&amp;gt;&amp;gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt; &lt;span style="color:green"&gt;12 &lt;/span&gt;\item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.&lt;br /&gt; &lt;span style="color:green"&gt;13 &lt;/span&gt;&lt;span style="color:red"&gt;&amp;lt== Falta \end{enumerate}&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;14&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;15 &lt;/span&gt;\section{Navegación desde consola}&lt;br /&gt; &lt;span style="color:green"&gt;16 &lt;/span&gt;Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt; &lt;span style="color:green"&gt;17&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;18 &lt;/span&gt;Con w3m el proceso de convertir una página web entexto es absolutamente elemental: añadir la opción -dump. Por ejemplo:&lt;br /&gt; &lt;span style="color:green"&gt;19&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;20 &lt;/span&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt; &lt;span style="color:green"&gt;21&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;22 &lt;/span&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt; &lt;span style="color:green"&gt;23&lt;/span&gt;&lt;br /&gt; &lt;span style="color:green"&gt;24 &lt;/span&gt;\end{document}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Sobre este texto, que guardamos como el nombre &lt;code&gt;texto_erroneo.tex&lt;/code&gt;, ejecutamos ahora &lt;code&gt;lacheck&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;lacheck texto_erroneo.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Aparecerán los siguientes mensajes:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;"texto_erroneo.tex", line 24: &lt;- unmatched "\end{document}"&lt;br /&gt;"texto_erroneo.tex", line 10: -&gt; unmatched "\begin{enumerate}"&lt;br /&gt;"texto_erroneo.tex", line 25: &lt;- unmatched "end of file texto_erroneo.tex"&lt;br /&gt;"texto_erroneo.tex", line 7: -&gt; unmatched "{"&lt;br /&gt;"texto_erroneo.tex", line 25: &lt;- unmatched "end of file texto_erroneo.tex"&lt;br /&gt;"texto_erroneo.tex", line 6: -&gt; unmatched "\begin{document}"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;El analizador sintáctico, aunque emite mensajes que no son absolutamente claros, ayuda a localizar rápida y exactamente la línea o líneas que contiene los errores cometidos. Nótese que se muestran mensajes de error para las últimas líneas del fichero, la 24 y la 25, así como para la primera del fragmento, la línea 6. Estos mensajes de error son provocados por nuestros verdaderos errores, los que afectan a las líneas 7 y 13, que, como un efecto en cadena, disparan los mensajes relativos al resto de líneas. Una vez corregidas las líneas defectuosas (la 7 y la 13), el resto de mensajes de error desaparecerá.&lt;br /&gt;&lt;br /&gt;La moraleja es que hay que ser cuidadoso a la hora de marcar textos (los buenos editores como &lt;em&gt;Vim&lt;/em&gt; o &lt;em&gt;Emacs&lt;/em&gt; suelen ayudar ya de entrada en esta tarea) y que conviene utilizar un analizador sintáctico como &lt;code&gt;lacheck&lt;/code&gt; antes de procesar el documento con &lt;code&gt;pdflatex&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;&lt;code class="orden"&gt;pdflatex&lt;/code&gt; es el tipógrafo de documentos LaTeX recomendado en la actualidad. &lt;code&gt;pdflatex&lt;/code&gt; forma parte de la máquina tipográfica &lt;em&gt;pdfTeX&lt;/em&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;pdfTeX&lt;/em&gt; es heredero de &lt;em&gt;TeX&lt;/em&gt;. &lt;em&gt;LuaTeX&lt;/em&gt;, por su parte, es heredero de &lt;em&gt;pdfTeX&lt;/em&gt; y se perfila como su futuro sucesor.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La distribución actualmente más completa para procesar documentos LaTeX es &lt;em&gt;TeX Live&lt;/em&gt;. &lt;em&gt;TeX Live&lt;/em&gt; viene empaquetada por Debian en el paquete &lt;em&gt;texlive&lt;/em&gt; (que contiene lo básico) y otros paquetes con el prefijo &lt;em&gt;texlive-&lt;/em&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code class="orden"&gt;lacheck&lt;/code&gt; es un analizador de la sintaxis de marcas LaTeX. Es recomendable analizar la corrección de nuestra sintaxis antes de procesar nuestro documento con &lt;code&gt;pdflatex&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-438604967453422999?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/438604967453422999/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iv.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/438604967453422999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/438604967453422999'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iv.html' title='HAL y las marcas (LaTeX - IV)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-HIqqxAvoQI/ScVLtziP4sI/AAAAAAAAACk/1_qsbNU0XfA/s72-c/latex_file-pdf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-599616428939678836</id><published>2009-03-21T12:43:00.007+01:00</published><updated>2009-03-21T23:27:56.277+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - III)</title><content type='html'>&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-ii.html"&gt;Como sucede con HTML&lt;/a&gt;, también LaTeX requiere de cierto protocolo para definir aspectos básicos del documento marcado según sus convenciones y para que el experto o expertos que procesen estas marcas sepan cómo hacerlo exactamente. Por fortuna, este formulismo inicial es bastante más fácil de entender y de explicar que el de HTML. Nos limitaremos, no obstante, a comentar los aspectos más importantes de él y a confiar en que lector sabrá encontrar información más detallada en los enlaces propuestos en los primeros párrafos de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-i.html"&gt;este otro artículo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La estructura de un documento LaTeX listo para su procesamiento es básicamente la siguiente:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:green"&gt;PREÁMBULO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green"&gt;\begin{document}&lt;/span&gt;&lt;br /&gt;[Nuestro texto con las marcas LaTeX]&lt;br /&gt;&lt;span style="color:green"&gt;\end{docuemnt}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Así pues, si retomamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-ii.html"&gt;la metáfora aplicada en la exposición de HTML&lt;/a&gt;, vemos que también el gabinete de LaTeX precisa que nuestro texto marcado se envíe en un sobre &lt;code&gt;document&lt;/code&gt; y que a ese sobre le peguemos una etiqueta que contenga descripciones precisas de lo que va en él (el &lt;code&gt;PREÁMBULO&lt;/code&gt;). Un preámbulo típico para documentos en castellano consta de los siguientes enunciados:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;\documentclass{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Veamos qué significa cada uno de ellos:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\documentclass{article}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Define el tipo de documento que creamos. En nuestro caso un artículo.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\usepackage[spanish]{babel}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Define la lengua en la que está escrito nuestro documento.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\usepackage[T1]{fontenc}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Define el tipo de codificación de la fuente empleada por defecto. Es recomendable para lenguas que contienen, como la nuestra, caracteres acentuados.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\usepackage[utf8]{inputenc}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Define el tipo de codificación empleada al escribir el texto. En cualquier máquina moderna será UTF-8.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Más allá de los tecnicismos ---por los que hemos pasado rozando---, lo que salta a la vista en las tres últimas líneas del preámbulo es la marca &lt;code&gt;\usepackage{...}&lt;/code&gt;. Se trata de un tipo de orden que le indica a los expertos que procesarán nuestro documento que use un determinado tipo de &lt;em&gt;paquetes LaTeX&lt;/em&gt; y que active, en caso necesario, tales o cuales opciones de ese paquete, donde las opciones solicitadas se indican entre corchetes de acuerdo con la sintaxis &lt;code&gt;\usepackage[&lt;em&gt;opciones&lt;/em&gt;]{&lt;em&gt;paquete&lt;/em&gt;}&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;¿Pero qué es un paquete de LaTeX? Un paquete no es sino una extensión para determinados propósitos de las posibilidades básicas de LaTeX. Algunas de estas extensiones actúan sobre los engranajes de las máquinas que procesarán LaTeX y sólo deberemos ser conscientes de ellos a la hora de incluirlos en el preámbulo. Otras pueden poner a disposición del usuario nuevas marcas especializadas a las que éste puede recurrir si lo desea. Así, por citar sólo un caso particular, el paquete &lt;code&gt;babel&lt;/code&gt; permite escribir documentos en varias lenguas (las que se indican como opciones suyas) y seleccionar una u otra lengua cuando convenga mediante, por ejemplo, la orden o marca &lt;code&gt;\selectlanguage{&lt;em&gt;lengua&lt;/em&gt;}&lt;/code&gt;. En el caso de nuestro ejemplo sólo utilizamos una lengua, &lt;code&gt;spanish&lt;/code&gt;, y podemos prescindir de estas sofisticaciones. Por lo demás, el recurso a paquetes es especialmente recomendable cuando nuestro texto va a contener elementos característicos propios que requerirán de un tratamiento específico. Veremos un caso de ello en un artículo posterior.&lt;br /&gt;&lt;br /&gt;Bien. Nos queda sólo incluir el preámbulo comentado y el envoltorio &lt;code&gt;document&lt;/code&gt; en nuestro texto marcado con LaTeX para obtener un documento LaTeX completo listo para su procesamiento. Si seguimos la misma estrategia empleada en la generación del documento HTML a partir de nuestro texto con marcas informales, bastaría con modificar ligeramente el guión &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-ii.html#generar-html"&gt;&lt;code&gt;generar_html&lt;/code&gt;&lt;/a&gt; de este modo:&lt;br /&gt;&lt;pre id="generar-latex"&gt;&lt;br /&gt;## --* generar_latex - 21/03/09 - átopos *--&lt;br /&gt;## Genera documento LaTeX canónico a partir de un documento de texto &lt;br /&gt;## marcado con mis marcas informales&lt;br /&gt;SED_F=&lt;span style="color:red"&gt;txt2latex.sed&lt;/span&gt;                   # Fichero sed: convierte mis marcas &lt;br /&gt;                                      #              informales en marcas LaTeX&lt;br /&gt;ORIG_F=$1                             # Fichero de entrada&lt;br /&gt;DEST_F=$(basename $ORIG_F .txt).&lt;span style="color:red"&gt;tex&lt;/span&gt;   # Fichero LaTeX de salida&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;tr -d '\n'&lt; $ORIG_F \&lt;br /&gt;| sed -f $SED_F&lt;/span&gt; \&lt;br /&gt;| awk 'BEGIN {&lt;br /&gt;               &lt;span style="color:red"&gt;print "\\documentclass{article}"; &lt;br /&gt;               print "\\usepackage[spanish]{babel}";&lt;br /&gt;               print "\\usepackage[T1]{fontenc}";&lt;br /&gt;               print "\\usepackage[utf8]{inputenc}\n"; &lt;br /&gt;               print "\\begin{document}";&lt;/span&gt;&lt;br /&gt;             }&lt;br /&gt;             { print $0; }&lt;br /&gt;       END   { &lt;br /&gt;               &lt;span style="color:red"&gt;print "\\end{document}";&lt;/span&gt;&lt;br /&gt;             }' \&lt;br /&gt;&amp;gt; $DEST_F&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las modificaciones, aparte de las que afectan a los comentarios, son las lógicas: cambia el fichero de órdenes para &lt;code&gt;sed&lt;/code&gt;, que ahora será el &lt;code&gt;txt2latex.sed&lt;/code&gt; que creamos el día pasado; se añade la orden &lt;code&gt;tr&lt;/code&gt;, y se modifica el subsiguiente &lt;code&gt;sed&lt;/code&gt; como corresponde (también lo comentamos ayer); se modifican &lt;em&gt;mutatis mutandis&lt;/em&gt; las líneas que imprimirá &lt;code&gt;awk&lt;/code&gt; al principio y al final (nótese que en &lt;code&gt;awk&lt;/code&gt;, como en &lt;code&gt;sed&lt;/code&gt;, el literal '&lt;code&gt;\&lt;/code&gt;' debe escaparse).&lt;br /&gt;&lt;br /&gt;El nuevo guión, que llamaremos &lt;code&gt;generar_latex&lt;/code&gt; recibe como argumento el fichero con nuestras etiquetas informales y produce el fichero &lt;code&gt;texto_etiquetado.tex&lt;/code&gt;. Tras cambiarlo de modo, podemos ejecutarlo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;./generar_latex texto_etiquetado.txt&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado, &lt;code&gt;texto_etiquetado.tex&lt;/code&gt;, es el esperado:&lt;br /&gt;&lt;code id="marcas_latex"&gt;&lt;br /&gt;\documentclass{article}&lt;br /&gt;\usepackage[spanish]{babel}&lt;br /&gt;\usepackage[T1]{fontenc}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;\section{Navegación gráfica}&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;\begin{enumerate}&lt;br /&gt;\item Ir al menú &amp;lt;&amp;lt;Archivo&amp;gt;&amp;gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;\item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.&lt;br /&gt;\end{enumerate}&lt;br /&gt;&lt;br /&gt;\section{Navegación desde consola}&lt;br /&gt;Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con w3m el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción -dump. Por ejemplo:&lt;br /&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Si queremos ver coloreada la sintaxis de LaTeX nada mejor que echar mano del propio &lt;em&gt;Vim&lt;/em&gt;. Se puede llamar a &lt;em&gt;Vim&lt;/em&gt; para ver ficheros, sin intención de editarlos, con la orden &lt;code&gt;view&lt;/code&gt;, que es un atajo de &lt;code&gt;vim -R&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;view texto_etiquetado.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La imagen siguiente muestra el resultado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-HIqqxAvoQI/ScUfrIEff0I/AAAAAAAAACc/8Yk8QOhAduU/s1600-h/latex_file.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_-HIqqxAvoQI/ScUfrIEff0I/AAAAAAAAACc/8Yk8QOhAduU/s400/latex_file.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315689760941899586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li id="latex-preambulo-document"&gt;Un documento LaTeX consta de un preámbulo y un entorno &lt;code&gt;document&lt;/code&gt;. El preámbulo incluye, como mínimo, la definición de la clase de documento (artículo, libro, carta, etc.) y, normalmente, también la solicitud de uso de paquetes. El entorno &lt;code&gt;document&lt;/code&gt; engloba todo el texto marcado con marcas LaTeX.&lt;/li&gt;&lt;br /&gt;&lt;li id="latex-paquetes"&gt;Un &lt;em&gt;paquete de LaTeX&lt;/em&gt; es una extensión de las posibilidades básicas de LaTeX. La inclusión de paquetes se solicita en el preámbulo del documento con la etiqueta u orden &lt;code&gt;\usepackage[&lt;em&gt;opciones&lt;/em&gt;]{&lt;em&gt;paquete&lt;/em&gt;}&lt;/code&gt;, donde cada opción activa un conjunto determinado de las extensiones que el paquete proporciona. Por ejemplo, &lt;code&gt;\usepackage[spanish]{babel}&lt;/code&gt; permite usar el paquete para el uso de múltiples lenguas &lt;code&gt;babel&lt;/code&gt; y beneficiarse de sus extensiones para el castellano.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-599616428939678836?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/599616428939678836/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iii.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/599616428939678836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/599616428939678836'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-iii.html' title='HAL y las marcas (LaTeX - III)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-HIqqxAvoQI/ScUfrIEff0I/AAAAAAAAACc/8Yk8QOhAduU/s72-c/latex_file.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1441058638955862551</id><published>2009-03-20T20:39:00.002+01:00</published><updated>2009-03-21T01:57:16.332+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - II)</title><content type='html'>Si quisiéramos acudir a un procedimiento automático para traducir nuestras marcas informales a marcas LaTeX, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-i.html"&gt;como hicimos para obtener nuestro documento HTML&lt;/a&gt;, deberíamos tener en cuenta la forma típica que adoptan los textos etiquetados con LaTeX, de lo que ayer se dio un brevísimo ejemplo, así como algunas de sus peculiaridades, tales como la manera de entrecomillar en español o la introducción literal de caracteres especiales.&lt;br /&gt;&lt;br /&gt;¿Qué queremos decir con esto? La mejor manera de verlo es elaborar un fichero &lt;code&gt;txt2latex.sed&lt;/code&gt; semejante al &lt;code&gt;txt2html.sed&lt;/code&gt; de entonces. El fichero tendría por lo pronto este aspecto:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# Conversión de caracteres especiales&lt;br /&gt;s/"\([[:alnum:]]\+\)"/&amp;lt;&amp;lt;\1&amp;gt;&amp;gt;/g&lt;br /&gt;s/_/\\_/g&lt;br /&gt;&lt;br /&gt;# Conversión de etiquetas&lt;br /&gt;s/INICIO SECCIÓN//g&lt;br /&gt;s/FIN SECCIÓN//g&lt;br /&gt;s/INICIO TÍTULO SECCIÓN/\\section{/g&lt;br /&gt;s/FIN TÍTULO SECCIÓN/}\n/g&lt;br /&gt;s/INICIO PÁRRAFO//g&lt;br /&gt;s/FIN PÁRRAFO/\n\n/g&lt;br /&gt;s/INICIO LISTA NUMERADA/\\begin{enumerate}\n/g&lt;br /&gt;s/FIN LISTA NUMERADA/\\end{enumerate}\n\n/g&lt;br /&gt;s/INICIO ELEMENTO LISTA/\\item /g&lt;br /&gt;s/FIN ELEMENTO LISTA/\n/g&lt;br /&gt;s/INICIO NOMBRE PROGRAMA//g&lt;br /&gt;s/FIN NOMBRE PROGRAMA//g&lt;br /&gt;s/INICIO ORDEN//g&lt;br /&gt;s/FIN ORDEN//g&lt;br /&gt;s/INICIO OPCIÓN//g&lt;br /&gt;s/FIN OPCIÓN//g&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Buena parte de este fichero se entiende por sí mismo. Las etiquetas informales que no tienen traducción se sustituyen por nada, es decir, se eliminan. También hemos eliminado provisionalmente las etiquetas para nombre de programa, opción y orden, porque todavía no sabemos sus equivalencias en LaTeX. Allí donde queremos un salto de párrafo sustituimos la marca informal por la marca LaTeX equivalente más dos saltos de línea ---recuérdese que el salto de línea se expresa con '&lt;code&gt;\n&lt;/code&gt;'. Estos dos saltos crean precisamente una línea en blanco. Nótese, en particular, que el carácter '&lt;code&gt;\&lt;/code&gt;' de LaTeX debe escaparse con otro '&lt;code&gt;\&lt;/code&gt;' (el carácter de escape de &lt;code&gt;sed&lt;/code&gt;, y de casi todo en HAL), puesto que es un carácter especial de &lt;code&gt;sed&lt;/code&gt;, justamente el que sirve para escapar un carácter cualquiera.&lt;br /&gt;&lt;br /&gt;En cuanto a la primera sección del fichero, la relativa a la conversión de las comillas rectas por comillas angulares y la secuencia de escape para el carácter '&lt;code&gt;_&lt;/code&gt;' explicada ayer, sólo nos puede extrañar la primera orden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;s/"\([[:alnum:]]\+\)"/&amp;lt;&amp;lt;\1&amp;gt;&amp;gt;/g&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Entender lo que esta orden de &lt;code&gt;sed&lt;/code&gt; significa implica conocer una nueva posibilidad de &lt;code&gt;sed&lt;/code&gt; todavía no explicada: las referencias hacia atrás (&lt;em&gt;backreferences&lt;/em&gt;). Miremos la expresión minuciosamente, porque casi todo nos debería resultar familiar.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;s/&lt;code&gt;&lt;em&gt;RE&lt;/em&gt;&lt;/code&gt;/&lt;em&gt;remplazo&lt;/em&gt;/g&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;es evidentemente una orden de sustitución de &lt;code&gt;sed&lt;/code&gt;. Lo sustituido es todo lo que encaja con la expresión regular (&lt;code&gt;RE&lt;/code&gt;) que hay a la izquierda. Analicemos primero esa expresión regular:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"\([[:alnum:]]\+\)"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se trata de un molde para un texto entrecomillado (&lt;code&gt;"&lt;em&gt;texto&lt;/em&gt;"&lt;/code&gt;). Lo entrecomillado es un conjunto de caracteres alfanuméricos &lt;code&gt;&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-los-trabalenguas-ii.html#RE-conjuntos"&gt;[[:alnum:]]&lt;/a&gt;&lt;/code&gt;. Este conjunto contiene uno o más miembros (el signo &lt;code&gt;&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-los-trabalenguas-ii.html#RE-especificaciones-numericas"&gt;+&lt;/a&gt;&lt;/code&gt;), que en &lt;code&gt;sed&lt;/code&gt;, frente a lo que ocurre con expresiones regulares extendidas, tiene que escaparse (&lt;code&gt;\+&lt;/code&gt;). Además, este conjunto aparece agrupado (los paréntesis &lt;code&gt;&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-los-trabalenguas-ii.html#RE-agrupaciones"&gt;(...)&lt;/a&gt;&lt;/code&gt;, que en &lt;code&gt;sed&lt;/code&gt; deben también escaparse). Por tanto, la expresión regular designa todo fragmento de texto constituido por uno o más de un carácter alfanuméricos que esté entrecomillado por comillas rectas. En definitiva, esta expresión regular no contiene nada que no sepamos ya, salvo la necesidad de escapar algunos de sus caracteres.&lt;br /&gt;&lt;br /&gt;Lo nuevo está en la expresión que se propone como remplazo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;&amp;lt;\1&amp;gt;&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Las comillas angulares de inicio y cierre son justamente aquellas por las que queremos sustituir las comillas rectas del texto que encaje con la expresión regular. Lo que aparece entre estas comillas angulares es la enigmática expresión &lt;code&gt;\1&lt;/code&gt;. Esta expresión simplemente recupera el contenido de lo registrado por &lt;code&gt;sed&lt;/code&gt; cuando descubrió una agrupación en la expresión regular, es decir, todo lo que hay entre los paréntesis. (Como sólo se ha registrado una agrupación, la referencia hacia atrás es &lt;code&gt;\1&lt;/code&gt;; si en la expresión regular apareciese una segunda agrupación, la referencia de esta segunda agrupación sería &lt;code&gt;\2&lt;/code&gt;, etc.). Por tanto, el fragmento de texto constituido por los caracteres alfanuméricos va a aparecer intacto en el remplazo. Esta es la técnica habitual que se utiliza cuando una parte interna del texto que encaja con la expresión (en nuestro caso, lo entrecomillado) se quiere preservar y sólo otra parte (en nuestro caso, las comillas rectas) se quiere modificar.&lt;br /&gt;&lt;br /&gt;Diseccionado el sentido de nuestro fichero &lt;code&gt;txt2latex.sed&lt;/code&gt;, podemos utilizarlo para efectuar la sustitución de nuestras marcas informales ---que, recuérdese, aparecen en el fichero &lt;code&gt;texto_etiquetado.txt&lt;/code&gt;--- por las de LaTeX y guardar el resultado en un fichero con la extensión &lt;code&gt;.tex&lt;/code&gt;, que es la forma canónica de identificar ficheros LaTeX:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed -f txt2latex.sed texto_etiquetado.txt &gt;texto_etiquetado.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado deja mucho que desear:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;\section{&lt;br /&gt;Navegación gráfica&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;code&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Los espacios en blanco están por doquier y se han generado saltos de línea donde no debía haberlos.&lt;br /&gt;&lt;br /&gt;La causa del problema está en que &lt;code&gt;sed&lt;/code&gt;, tras realizar cada sustitución, incluye el salto de línea en las líneas modificadas. Este comportamiento es conveniente en la mayoría de los casos ---nadie esperaría que &lt;code&gt;sed&lt;/code&gt; se comiese el salto de línea, cuando de lo que se trata es de cambiar sólo una parte de una línea. Sin embargo, este educada manera de obrar es fatal para el caso que nos ocupa. &lt;br /&gt;&lt;br /&gt;Hay varias formas de resolver el problema, que pasan por utilizar otro ayudante que no sea &lt;code&gt;sed&lt;/code&gt;. Pero quizá la más sencilla para nuestro caso particular, y que no nos obliga a renunciar a &lt;code&gt;sed&lt;/code&gt;, sea darle como entrada el mismo fichero pero transformado previamente en una única línea. Las marcas seguirán allí intactas y nada provocará saltos de línea innecesarios, más allá de los que nosotros hemos decidido producir en nuestras sustituciones, puesto que &lt;code&gt;sed&lt;/code&gt; trabajará sobre una línea única.&lt;br /&gt;&lt;br /&gt;Hacer que las múltiples líneas de un fichero se unan y constituyan una única línea se puede conseguir con distintas órdenes de HAL. Una de las más simples es la orden &lt;code&gt;tr&lt;/code&gt; (de &lt;em&gt;translate&lt;/em&gt;). Esta orden dispone de una opción adecuada a nuestros fines, la opción &lt;code&gt;-d&lt;/code&gt;, que elimina (&lt;em&gt;delete&lt;/em&gt;) de la entrada el carácter que demos como argumento a esa opción. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tr -d 'a'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;eliminaría todas las aes de nuestra entrada.&lt;br /&gt;&lt;br /&gt;Para convertir múltiples líneas en una única línea, el carácter que deberemos eliminar es justamente el salto de línea. Por tanto:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tr -d '\n'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;es la orden apropiada para lograr nuestro propósito.&lt;br /&gt;&lt;br /&gt;Hemos dicho que &lt;code&gt;tr&lt;/code&gt; afecta a la "entrada" y no simplemente al "fichero" dado como argumento. ¿Por qué? La razón es que &lt;code&gt;tr&lt;/code&gt; es una de esas pocas órdenes que no permite ficheros como argumentos. Dicho de otra forma, &lt;code&gt;tr&lt;/code&gt; actúa sólo y directamente sobre el flujo de entrada del que se nutre. Esta característica la hace especialmente apta para integrarse en tuberías. Pero en nuestro caso, sigue siendo un fichero el que queremos darle como alimento. &lt;br /&gt;&lt;br /&gt;Existe una forma de dar un fichero de alimento a una orden que trabaja únicamente sobre el flujo de entrada. Es una herramienta más de fontanería, el reverso del famoso embudo (&lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/hal-y-mis-ficheros.html#redireccion-salida"&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/a&gt;) que aplicamos para redirigir la salida de una orden a un fichero. Existe otro embudo, &lt;code&gt;&amp;lt;&lt;/code&gt;, que realiza la función contraria: redirige un fichero hacia la entrada estándar. Si en el otro lado (el izquierdo) hay una orden que puede alimentarse directamente desde la entrada estándar (cualquiera de los filtros que hemos visto en anteriores artículos: &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, etc.) o que sólo se alimenta de ella, como &lt;code&gt;tr&lt;/code&gt;, el fichero redirigido se convertirá en la entrada de la orden.&lt;br /&gt;&lt;br /&gt;En consecuencia, para que nuestra anterior orden de supresión de saltos de línea haga su efecto sobre el fichero &lt;code&gt;texto_etiquetado.txt&lt;/code&gt;, deberíamos decirle a HAL lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tr -d '\n'&amp;lt; texto_etiquetado.txt&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con este paso previo se puede ya construir la orden completa, puesto que el resultado de la acción de &lt;code&gt;tr&lt;/code&gt; se puede enviar sin problemas a &lt;code&gt;sed&lt;/code&gt; mediante una tubería y redirigir lo que produce &lt;code&gt;sed&lt;/code&gt; al fichero &lt;code&gt;texto_etiquetado.tex&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;tr -d '\n'&amp;lt; texto_etiquetado.txt | sed -f txt2latex.sed &gt;texto_etiquetado.tex&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo cual produce el documento con todas las transformaciones propias de LaTeX que hemos solicitado:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación gráfica&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\begin{enumerate}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Ir al menú &lt;span style="color:blue"&gt;&amp;lt;&amp;lt;&lt;/span&gt;Archivo&lt;span style="color:blue"&gt;&amp;gt;&amp;gt;&lt;/span&gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta&lt;span style="color:blue"&gt;\_&lt;/span&gt;fichero.&lt;br /&gt;&lt;span style="color:red"&gt;\end{enumerate}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación desde consola&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;br /&gt;Con w3m el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción -dump. Por ejemplo:&lt;br /&gt;&lt;br /&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;br /&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;Las expresiones regulares para &lt;code&gt;sed&lt;/code&gt; no son idénticas a las expresiones regulares extendidas. Ello implica que muchos caracteres típicos de las EREs tengan que escaparse en &lt;code&gt;sed&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li id="sed-backreference"&gt;&lt;code&gt;sed&lt;/code&gt; registra las agrupaciones que en los patrones de expresiones regulares aparecen entre paréntesis &lt;code&gt;\(...\)&lt;/code&gt; y los guarda para su uso posterior. Para recuperar lo contenido en esos registros se utilizan los signos de referencias hacia atrás (&lt;code&gt;\1&lt;/code&gt;, &lt;code&gt;\2&lt;/code&gt;, ..., &lt;code&gt;\9&lt;/code&gt;), cada uno de los cuales remite a la primera, segunda, ..., novena agrupación de la expresión regular del caso.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La orden &lt;code class="orden"&gt;tr&lt;/code&gt; traduce o elimina (con la opción &lt;code&gt;-d&lt;/code&gt;) caracteres de la entrada estándar. Por ejemplo &lt;code&gt;tr -d '\n'&lt;/code&gt; elimina los saltos de línea del flujo de entrada.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Existen órdenes de HAL que se nutren únicamente de la entrada estándar, como &lt;code&gt;tr&lt;/code&gt; y no pueden recibir un fichero como argumento.&lt;/li&gt;&lt;br /&gt;&lt;li id="redireccion-entrada"&gt;El embudo &lt;code&gt;&amp;lt;&lt;/code&gt; permite redirigir un fichero a la entrada estándar y, por extensión, a una orden que se alimente de la entrada estándar. Por ejemplo, &lt;code&gt;tr -d '\n'&lt; mi_fichero&lt;/code&gt;, hace que el fichero &lt;code&gt;mi_fichero&lt;/code&gt; sea la entrada de la orden &lt;code&gt;tr&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1441058638955862551?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1441058638955862551/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1441058638955862551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1441058638955862551'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-ii.html' title='HAL y las marcas (LaTeX - II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4238791019565590804</id><published>2009-03-20T00:40:00.005+01:00</published><updated>2009-03-20T20:25:47.347+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (LaTeX - I)</title><content type='html'>En los artículos anteriores de &lt;a href="http://los-pajaros-de-hogano.blogspot.com/search/label/Lenguajes de marcas"&gt;esta sección&lt;/a&gt; hemos entrado en contacto con la noción de marcar un texto y hemos experimentado con el lenguaje de marcas más ampliamente usado y probablemente más conocido, HTML, uno de los pilares de la Internet actual. Es un buen punto de partida, dada su simplicidad y omnipresencia. Pero hay unos cuantos lenguajes de marcas más ahí dentro y hay expertos en las fábricas de HAL cuya pericia indiscutible ha resistido la prueba de los años.&lt;br /&gt;&lt;br /&gt;En los próximos artículos conoceremos al que tal vez sea el más conspicuo de estos sistemas. Se trata de LaTeX, de ese mismo LaTeX que tan merecidos elogios viene recibido desde su nacimiento por parte de tipógrafos y diseñadores profesionales y del que nosotros, simples escritores legos en la materia, vamos a poder disfrutar con muy poco esfuerzo.&lt;br /&gt;&lt;br /&gt;De la "filosofía" y el sentido de LaTeX hemos hablado ya en varias ocasiones (por ejemplo, en el primer artículo de &lt;a href="http://goliat.mecanica.upm.es/cervantex/files/cervantex/texemplares8.pdf"&gt;este TeXemplar&lt;/a&gt;). No viene, pues, al caso repetir más de la cuenta lo dicho tantas veces. El lector podrá encontrar información básica en castellano, y enlaces seleccionados a textos introductorios públicamente accesibles, en &lt;a href="http://goliat.mecanica.upm.es/cervantex/manuales"&gt;la sección de manuales&lt;/a&gt; de la web de CervanTeX, el grupo de usuarios hispanohablantes de TeX.&lt;br /&gt;&lt;br /&gt;Sigamos, pues, un procedimiento semejante al que aplicamos  con HTML. Empezaremos viendo cuáles son las marcas de LaTeX equivalentes a aquéllas informales con que etiquetamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;nuestro texto&lt;/a&gt;:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO TÍTULO SECCIÓN:&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;\section{&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN TÍTULO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;Línea en blanco&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;\begin{enumerate}&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;\end{enumerate}&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;item&amp;para;&lt;/strong&gt; [donde '&amp;para;' es un espacio en blanco]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[No necesario]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;[Depende del &lt;em&gt;paquete LaTeX&lt;/em&gt; usado o de la marca personal creada]&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;La diferencia de las marcas de LaTeX con las de HTML es evidente. La sintaxis de LaTeX es más irregular, pero, a la vez, bastante menos prolija, lo que implica que marcar textos con LaTeX es mucho más fácil que hacerlo con HTML, una vez conocidas las marcas adecuadas.&lt;br /&gt;&lt;br /&gt;Echemos un vistazo al primer párrafo de nuestro texto tal como quedaría tras sustituir nuestras marcas informales con las de LaTeX (se omiten las marcas correspondientes a nombres de programas, opciones y órdenes, que se explicarán más adelante):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\section{&lt;/span&gt;Navegación gráfica&lt;span style="color:red"&gt;}&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\begin{enumerate}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Ir al menú &lt;span style="color:blue"&gt;&amp;lt;&amp;lt;&lt;/span&gt;Archivo&lt;span style="color:blue"&gt;&amp;gt;&amp;gt;&lt;/span&gt; del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;\item &lt;/span&gt;Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta&lt;span style="color:blue"&gt;\_&lt;/span&gt;fichero.&lt;br /&gt;&lt;span style="color:red"&gt;\end{enumerate}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Describir la razón de la sintaxis de LaTeX rebasa el nivel introductorio de estos artículos. La mayoría de la gente que utiliza LaTeX la aprende sin mayor cuestionamiento, y es realmente fácil de aprender, si nos atenemos a su uso básico, que es válido para el 99% de los casos habituales. Así que no comentaremos nada más que lo evidente. Y lo evidente salta a la vista. &lt;br /&gt;&lt;br /&gt;Todas las marcas tienen en común el ir precedidas por el carácter de barra invertida '&lt;code&gt;\&lt;/code&gt;'. Los dos tipos de marcas más frecuentes son:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\&lt;em&gt;estructura&lt;/em&gt;{&lt;em&gt;texto marcado&lt;/em&gt;}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Un texto se define por la estructura lógica o textual que le conviene. Por ejemplo, &lt;code&gt;\section{&lt;em&gt;texto&lt;/em&gt;}&lt;/code&gt; define el texto englobado como título de una sección. (Nota: lo que hay tras el título de sección hasta una nueva &lt;code&gt;\section{...}&lt;/code&gt;, o hasta el comienzo de una estructura de más alto nivel como &lt;code&gt;\chapter{...}&lt;/code&gt; o hasta el final del documento, se considera parte de la sección iniciada por el título anterior. Es por esta razón por la que no es necesario indicar expresamente donde comienza o termina el contenido propiamente dicho de la sección).&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;\begin{&lt;em&gt;entorno&lt;/em&gt;}&lt;em&gt;texto&lt;/em&gt;\end{&lt;em&gt;entorno&lt;/em&gt;}&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Un texto puede considerarse un bloque relativamente independiente, textualmente hablando, de lo que le rodea. Un entorno aisla ese texto y lo identifica como perteneciente a una categoría estructural o textual especial. Por ejemplo, &lt;code&gt;\begin{enumerate}&lt;em&gt;texto&lt;/em&gt;\end{enumerate}&lt;/code&gt; caracteriza el texto englobado como una lista ordenada.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Por su parte la marca &lt;code&gt;\item &lt;em&gt;texto&lt;/em&gt;&lt;/code&gt; identifica el texto como un elemento de una lista. Se trata de un caso de marca especial para elementos de cualquier lista, donde no se consideran necesarias las llaves delimitadoras. Sería, en efecto, bastante molesto tener que escribir &lt;code&gt;\item{texto}&lt;/code&gt; cuando el texto fuera de cierta longitud.&lt;br /&gt;&lt;br /&gt;Una marca particularmente significativa es la que corresponde al fin de párrafo, la línea en blanco. Mientras que en HTML las líneas en blanco no existen para el navegador que interpretará el documento, en LaTeX las líneas en blanco tienen un significado fundamental, separan párrafos. Así, en nuestro ejemplo, el primer párrafo se separa del segundo, en este caso de una lista, gracias a la línea en blanco (Nótese que la lista puede constituir un párrafo por sí sola, como en nuestro caso, o formar parte de un párrafo existente. El escritor es quien decide, aunque la diferencia, en nuestro caso concreto, resultará prácticamente inapreciable). Utilizar la línea en blanco para delimitar párrafos es, contra lo que parece, una ventaja que LaTeX proporciona al escritor. Nunca el escritor tuvo que explicitar dónde había una separación de párrafos, le bastaba con introducir una línea en blanco para que todos lo entendiésemos. Disponer de una marca específica para párrafos sólo es necesario con lenguajes de marcas altamente formalizados como HTML. LaTeX, aunque menos riguroso en su forma, es más afín en esto a la práctica habitual de la escritura [Ver, además, mi primer comentario a este artículo].&lt;br /&gt;&lt;br /&gt;El lector atento habrá observado que hemos coloreado de azul los signos '&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;' y '&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;' de comillas angulares y los signos '&lt;code&gt;\_&lt;/code&gt;'. En el &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;texto original&lt;/a&gt; las comillas aparecían como dobles comillas (&lt;code&gt;"&lt;/code&gt;) y el guión bajo no venía precedido por la barra. ¿Por qué hemos tenido que cambiarlos? La razón es diferente en cada caso. &lt;br /&gt;&lt;br /&gt;Las comillas angulares son las comillas ortotipográficamente correctas en español y LaTeX es muy pulcro con la ortotipografía. No aceptará así como así las dobles comillas. LaTeX nos obliga, pues, a escribir buen español: una ventaja añadida).&lt;br /&gt;&lt;br /&gt;Un caso diferente es el del guión bajo. Resulta que este guión tiene un significado especial en LaTeX. Como de costumbre, cuando queremos introducir literalmente un carácter especial debemos encontrar un modo de "escaparlo". Por suerte, el carácter de escape es aquí el de siempre, la barra invertida. Lo mismo vale para estos otros caracteres especiales ('&lt;code&gt;#&lt;/code&gt;', '&lt;code&gt;$&lt;/code&gt;', '&lt;code&gt;%&lt;/code&gt;', '&lt;code&gt;&amp;&lt;/code&gt;', '&lt;code&gt;{&lt;/code&gt;' y '&lt;code&gt;}&lt;/code&gt;'), que también deben escaparse, si se quieren introducir literalmente, con la barra invertida. [Los otros tres caracteres especiales, que raramente escribirá el lector no informático, ('&lt;code&gt;^&lt;/code&gt;', '&lt;code&gt;\&lt;/code&gt;' y '&lt;code&gt;~&lt;/code&gt;') se escapan, respectivamente, con &lt;code&gt;\textasciicircum&lt;/code&gt;, &lt;code&gt;\textbackslash&lt;/code&gt; y &lt;code&gt;\textasciitilde&lt;/code&gt;].&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen:&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;LaTeX es un lenguaje de marcas especialmente indicado cuando lo que se desea es producir un documento de calidad profesional destinado a ser impreso.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Muchas editoriales científicas, y no científicas, de prestigio utilizan LaTeX como sistema de preparación de sus ediciones.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las marcas de LaTeX empiezan con el carácter '&lt;code&gt;\&lt;/code&gt;'.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La sintaxis de LaTeX es más irregular que la de otros lenguajes de marcas como HTML. A cambio, suele ser más amigable y menos prolija.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La línea en blanco separa párrafos en LaTeX.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La forma correcta de entrecomillar en español son las comillas angulares. LaTeX requiere de este tipo de comillas, cuando el texto está en español.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hay que cuidar de no introducir literalmente caracteres especiales de LaTeX sin "escaparlos".&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4238791019565590804?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4238791019565590804/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-i.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4238791019565590804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4238791019565590804'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-latex-i.html' title='HAL y las marcas (LaTeX - I)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1482117486981010997</id><published>2009-03-18T11:04:00.005+01:00</published><updated>2009-03-18T15:33:08.072+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (CSS)</title><content type='html'>Si abrimos en un navegador (por ejemplo, Iceweasel) la página web creada el día pasado tras convertir nuestras marcas informales en marcas HTML, veremos el siguiente resultado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/ScEE092pzxI/AAAAAAAAACE/ecODBqnLM8U/s1600-h/pagina_web-default.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/ScEE092pzxI/AAAAAAAAACE/ecODBqnLM8U/s400/pagina_web-default.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5314534343277399826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¿Por qué precisamente esta un tanto rudimentaria página y no una de aquéllas más vistosas que visitamos cotidianamente?&lt;br /&gt;&lt;br /&gt;La razón es que el equipo de diseño que funciona por defecto en nuestro navegador se limita a realizar su trabajo del modo más simple posible, sin filigranas ni sofisticaciones de ninguna clase. Si queremos más, tenemos que convertirnos nosotros mismos en diseñadores. No es nuestra intención ---lo hemos establecido desde el principio--- asumir más responsabilidades de las que nos competen como escritores. Sin embargo, y con un fin puramente didáctico, vamos a tratar de definir un estilo más elaborado para nuestro texto. Como se trata de una tarea que &lt;strong&gt;no&lt;/strong&gt; vamos a realizar y que se presenta sólo con fines didácticos, no entraremos en detalles.&lt;br /&gt;&lt;br /&gt;Uno de los procedimientos, el más extendido y conveniente, de definir el diseño de nuestro página es utilizar lo que se denomina una &lt;em&gt;hoja de estilo&lt;/em&gt; (&lt;em&gt;stylesheet&lt;/em&gt;). La definición de hojas de estilo para documentos HTML se atiene a las especificaciones del lenguaje llamado CSS (&lt;em&gt;Cascading StyleSheets&lt;/em&gt;, hojas de estilo en cascada), establecidas también por el &lt;a href="http://www.w3.org"&gt;W3C&lt;/a&gt;. La idea es simple. A cada elemento del documento HTML se le asocia una descripción formal de su estilo. Dentro de la vaga noción de estilo entran cosas como la ubicación precisa del elemento en la página, las dimensiones de la "caja" que lo contiene, el tipo de fuente, el color, etc.&lt;br /&gt;&lt;br /&gt;Podríamos, por ejemplo, pensar en los siguientes atributos de estilo para algunos de los elementos de nuestro documento web:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;BODY&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;familia de fuente: sans-serif; relleno: 1,5 emes ---la distancia que ocupa una "m" y media--- en margen izquierdo y derecho.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;H2&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;color: azul suave; fuente: 170% del tamaño del resto del texto y familia sans-serif.&lt;dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;CODE&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;color: granate&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;La traducción de estas especificaciones según las convenciones de CSS sería la siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;BODY { font-family:sans-serif; padding: 0 1.5em 0 1.5em }&lt;br /&gt;H2   { font:170% sans-serif; color:#005A9C }&lt;br /&gt;CODE { color:maroon }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hay varias maneras de integrar esta definición dentro de nuestro documento HTML. Una de ellas es incluirlo dentro del elemento &lt;code&gt;STYLE&lt;/code&gt; de HTML, que recibe un &lt;em&gt;atributo&lt;/em&gt; (el atributo &lt;code&gt;type&lt;/code&gt;) donde se indica el tipo de estilo fijado. &lt;code&gt;STYLE&lt;/code&gt; es una de esas informaciones globales sobre el documento que debe aparecer en la sección &lt;code&gt;HEAD&lt;/code&gt;. De acuerdo con estas normas, nuestro estilo integrado en el documento sería:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;STYLE type="text/css"&amp;gt;&lt;br /&gt; BODY { font-family:sans-serif; padding: 0 1.5em 0 1.5em }&lt;br /&gt; H2   { font:170% sans-serif; color:#005A9C }&lt;br /&gt; CODE { color:maroon }&lt;br /&gt;&amp;lt;/STYLE&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Iceweasel nos presentaría de la siguiente manera nuestro documento estilizado (un resultado de andar por casa, pero quizá no absolutamente insatisfactorio):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-HIqqxAvoQI/ScEFCV5cTdI/AAAAAAAAACM/haj8QzwnT_I/s1600-h/pagina_web-estilo1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_-HIqqxAvoQI/ScEFCV5cTdI/AAAAAAAAACM/haj8QzwnT_I/s400/pagina_web-estilo1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5314534573069848018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Consideremos un estilo aparentemente más trabajado como el siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;BODY { background:brown }&lt;br /&gt;H2   { color:yellow }&lt;br /&gt;EM   { background:navy}&lt;br /&gt;CODE { background:maroon }&lt;br /&gt;P    { text-align:justify }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Más esfuerzo no produce mejor arte, y el resultado de tanto trabajo sería este engendro ---y por engendros parecidos está invadida la Web:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-HIqqxAvoQI/ScEFNzpVqBI/AAAAAAAAACU/bVsbp2US8ME/s1600-h/pagina_web-estilo2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_-HIqqxAvoQI/ScEFNzpVqBI/AAAAAAAAACU/bVsbp2US8ME/s400/pagina_web-estilo2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5314534770033928210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Moraleja: "zapatero a tus zapatos". Aunque la seducción de los atractivos visuales es grande, y grande la posibilidad de que cualquier advenedizo se entregue a la entretenida experiencia de estilizar sus producciones, más vale evitar la tentación y dejar que los expertos realicen su trabajo, que bastantes años les ha llevado aprenderlo. Como escritores nos seguiremos conformando con la hoja de estilo básica que por defecto proporciona el navegador o, al menos, si insistimos en practicar la definición del estilo, reservar nuestros juguetes para nosotros mismos, sin hacer que el resto del mundo sea partícipe de nuestras más que probables chapuzas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-1482117486981010997?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/1482117486981010997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-css.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1482117486981010997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/1482117486981010997'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-css.html' title='HAL y las marcas (CSS)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-HIqqxAvoQI/ScEE092pzxI/AAAAAAAAACE/ecODBqnLM8U/s72-c/pagina_web-default.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-3682102352664810027</id><published>2009-03-17T14:02:00.004+01:00</published><updated>2009-03-21T15:50:09.142+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (HTML - II)</title><content type='html'>Nuestro texto, marcado como prescribe la especificación de HTML, esta casi listo para ser interpretado adecuadamente por un navegador. Sólo le faltan unos detalles más, los más engorrosos y desagradables para alguien no particularmente interesado en los entresijos de HTML. Nos conformaremos con incluirlos sin apenas comentario, dando por hecho que el lector curioso sabrá encontrar la información pertinente en la referencia que se indica al final del artículo.&lt;br /&gt;&lt;br /&gt;Los gabinetes de especialistas a los que vamos a dirigir nuestro texto marcado suelen ser muy puntillosos en la forma de remitírselo. Tampoco es nada nuevo, estamos acostumbrados en la vida diaria a pasar por toda clase de formalismos endemoniados cuando tratamos de realizar ciertas gestiones que desde nuestro punto de vista son elementales (que si la maldita fotocopia del DNI, que si una copia compulsada de la cabecera de vaya usted a saber qué recibo, ...). Los receptores de nuestros textos marcados gustan de ese mismo rigor protocolario. Sus razones tienen, y no vamos a analizarlas. Ahora es cuestión sólo de conocer la fórmula y perder el menor tiempo posible en tratar de desentrañar su sentido.&lt;br /&gt;&lt;br /&gt;Bien, recurramos a una metáfora que hará más entretenida esta burocrática tarea. Imaginemos que nos dirigimos a la ventanilla de la oficina de nuestro navegador web para informarnos de cómo enviarles el texto que acabamos de marcar. Los funcionarios del navegador nos notificarán que tenemos que utilizar un sobre y que no podemos emplear cualquier clase de sobre. Es necesario un sobre especial, que recibe el nombre &lt;code&gt;BODY&lt;/code&gt;. Pero no basta, conviene incluir además, en otro sobre aparte ---y que se vea al principio---, llamado &lt;code&gt;HEAD&lt;/code&gt;, información de orden global sobre el documento, por ejemplo, el tipo de codificación de caracteres con el que ha sido escrito. Esos dos sobres deben introducirse a su vez en otro mayor, denominado &lt;code&gt;HTML&lt;/code&gt;, en cuya solapa se pegará una etiqueta donde conste claramente expresado el tipo de documento que remitimos. Si ahora pensamos en los sobres implicados como marcas globales de HTML, nuestro envío deberá atenerse al siguiente formato:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:green"&gt;DECLARACIÓN DEL TIPO DE DOCUMENTO&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;HTML&amp;gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&lt;/span&gt;&lt;br /&gt;[Metainformación (como codificación del documento) y otras informaciones de orden global.]&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;/HEAD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;BODY&amp;gt;&lt;/span&gt;&lt;br /&gt;[Nuestro texto con las marcas HTML.]&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;/BODY&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;/HTML&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Preparados los sobres e informados puntual y minuciosamente por los oficinistas del navegador, rellenamos todo lo burocráticamente necesario y metemos en el sobre &lt;code&gt;BODY&lt;/code&gt; nuestro texto con las marcas HTML visto ayer:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&lt;br /&gt;   "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;HTML&amp;gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&lt;br /&gt;&amp;lt;META content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;BODY&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;H2&amp;gt;&lt;/span&gt;&lt;br /&gt;Navegación gráfica&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/H2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;OL&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;LI&amp;gt;&lt;/span&gt;&lt;br /&gt;Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/LI&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;LI&amp;gt;&lt;/span&gt;&lt;br /&gt;Crear en &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;Vim&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;:new ruta_fichero&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/LI&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/OL&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;H2&amp;gt;&lt;/span&gt;&lt;br /&gt;Navegación desde consola&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/H2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Si navegamos con &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;w3m&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;Vim&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;w3m&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;-dump&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;/BODY&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;&amp;lt;/HTML&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Sería insoportablemente aburrido tener que repetir "el papeleo" cada vez que enviamos al navegador un documento web. Es frecuente, por ese motivo, crearse una plantilla con las partes áridas y comúnmente compartidas por todos los documentos html que vayamos a producir y concentrarse en el marcado del texto propiamente dicho. Por supuesto, otra forma, mucho más del gusto de HAL, sería crear un guión que incorporase nuestra anterior orden &lt;code&gt;sed&lt;/code&gt; y que de paso añadiese el resto del formulismo.&lt;br /&gt;&lt;br /&gt;Un guión posible para esta tarea ---uno más para nuestro directorio &lt;code&gt;guiones&lt;/code&gt;--- sería éste. Lo llamaremos &lt;code id="generar_html"&gt;generar_html&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;## --* generar_html - 18/03/09 - átopos *--&lt;br /&gt;## Genera documento HTML canónico a partir de un documento de texto &lt;br /&gt;## marcado con mis marcas informales&lt;br /&gt;SED_F=txt2html.sed                    # Fichero sed: convierte mis marcas &lt;br /&gt;                                      #              informales en marcas HTML&lt;br /&gt;ORIG_F=$1                             # Fichero de entrada&lt;br /&gt;DEST_F=$(basename $ORIG_F .txt).html  # Fichero HTML de salida&lt;br /&gt;&lt;br /&gt;sed -f $SED_F $ORIG_F \&lt;br /&gt;| awk 'BEGIN {&lt;br /&gt;               print "&amp;lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\""; &lt;br /&gt;               print "\t\"http://www.w3.org/TR/html4/strict.dtd\"&amp;gt;";&lt;br /&gt;               print "&amp;lt;HTML&amp;gt;";&lt;br /&gt;               print "&amp;lt;HEAD&amp;gt;"; &lt;br /&gt;               print "&amp;lt;META content=\"text/html; charset=UTF-8\"&amp;gt;";&lt;br /&gt;               print "&amp;lt;/HEAD&amp;gt;";&lt;br /&gt;               print "\n&amp;lt;BODY&amp;gt;";&lt;br /&gt;             }&lt;br /&gt;             { print $0; }&lt;br /&gt;       END   { print "&amp;lt;/BODY&amp;gt;";&lt;br /&gt;               print "&amp;lt;/HTML&amp;gt;";&lt;br /&gt;             }' \&lt;br /&gt;&amp;gt; $DEST_F&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El guión presupone que el fichero &lt;code&gt;txt2html.sed&lt;/code&gt;, creado el día pasado, se encuentra en el mismo directorio donde está el guión, en nuestro caso, el directorio &lt;code&gt;guiones&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Para generar el documento HTML, deberíamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/con-tu-permiso-hal.html#chmod"&gt;cambiar el modo&lt;/a&gt; del guión y solicitar a HAL su ejecución con la siguiente orden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;./generar_html texto_etiquetado.txt&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado será el fichero &lt;code&gt;texto_etiquetado.html&lt;/code&gt; cuyo contenido será el referido en este artículo.&lt;br /&gt;&lt;br /&gt;La única orden de HAL que aparece en ese guión y que no hemos explicado todavía en estas conversaciones es la orden &lt;code class="orden"&gt;basename&lt;/code&gt;. El lector sabrá encontrar la información concerniente a ella recurriendo a &lt;code&gt;man&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Asimismo, el lector interesado en profundizar en lo expuesto durante estos días podrá encontrar toda clase de información sobre las marcas utilizadas y el resto de marcas HTML en la referencia definitiva de la especificación actualmente más usada de HTML, que se puede encontrar aquí:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.w3.org/TR/html401/"&gt;http://www.w3.org/TR/html401/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por supuesto, se debe comprobar que el HTML funciona, abriéndolo con cualquier navegador:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;w3m texto_etiquetado.html&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¡Felices sueños!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-3682102352664810027?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/3682102352664810027/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3682102352664810027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/3682102352664810027'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-ii.html' title='HAL y las marcas (HTML - II)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-4675715877725258546</id><published>2009-03-17T10:32:00.004+01:00</published><updated>2009-03-25T12:39:49.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (HTML - I)</title><content type='html'>Una vez expuesta &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html"&gt;la manera general e informal de marcar un texto&lt;/a&gt;, convoquemos al primer experto, el menos sofisticado de los que vamos a ver, el propio navegador web, que es primariamente el productor de la versiones finales de los textos que visitamos en la Web.&lt;br /&gt;&lt;br /&gt;Todo navegador web entiende, como mínimo, una serie de marcas convencionalmente estipuladas para definir la estructura de nuestro documento. El conjunto de estas convenciones y las prescripciones de su uso se denomina HTML (&lt;em&gt;HyperText Markup Language&lt;/em&gt;, lenguaje de marcas de hipertexto). Bajo este amenazador título no hay más que la descripción precisa de las marcas (y del uso de esas marcas) que debo introducir en mi escrito para que un navegador web las presente como una página web. Esta descripción surge del común acuerdo de las partes implicadas (creadores de contenidos web, desarrolladores de navegadores, etc.) y se recogen en las especificaciones del consorcio &lt;a href="http://www.w3.org"&gt;W3C&lt;/a&gt;. Dicho de otra manera, saber HTML es conocer qué marcas debo poner en mi texto para que un navegador las entienda y cómo debo escribirlas.&lt;br /&gt;&lt;br /&gt;Como HTML es un sistema de marcas genérico, dispondremos de marcas equivalentes para aquellas que son comunes a todo texto. No podremos contar, sin embargo, con marcas especialmente apropiadas para los elementos característicos y únicos de nuestro texto, ni tampoco con la posibilidad de crear dichas marcas por nosotros mismos. Por tanto, todos los elementos específicos de nuestro texto anterior (nombre de programa, orden y opción) deberán marcarse con alguna clase de marca genérica de HTML.&lt;br /&gt;&lt;br /&gt;Veamos, primero, el nombre de los elementos HTML genéricos que constituyen nuestro texto de ejemplo. Se trata de abreviaturas de palabras inglesas que designan el significado estructural del elemento marcado:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;DIV&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Division&lt;/em&gt; = Sección, división&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;H&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Header&lt;/em&gt; = Cabecera o título (donde &lt;em&gt;n&lt;/em&gt; es un número que indica el nivel de título, '1' para el título del nivel más alto y '6' para el de mínimo nivel. Por ejemplo, &lt;code&gt;H1&lt;/code&gt; designaría el título general del texto; &lt;code&gt;H2&lt;/code&gt;, el de las secciones principales; etc).&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;OL&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Ordered List&lt;/em&gt; = Lista ordenada&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;LI&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;List Item&lt;/em&gt; = Elemento de lista&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;P&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Paragraph&lt;/em&gt; = Párrafo&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;A ellos habría que añadir los siguientes elementos HTML, que utilizaremos para identificar aquéllos de nuestro texto que son característicos únicamente de él. Los nombres de programa los marcaremos como fragmentos de texto enfatizados y las opciones y las órdenes como fragmentos de código de computador:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;EM&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Emphasis&lt;/em&gt; = Énfasis&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;&lt;strong&gt;CODE&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;Code&lt;/em&gt; = Código&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Las marcas HTML de comienzo y fin de elemento para los elementos citados se construyen enmarcando el nombre del elemento en paréntesis angulares, cuando la marca es la de inicio (por ejemplo, &lt;code&gt;&amp;lt;P&amp;gt;&lt;/code&gt; sería la marca HTML para indicar el comienzo de un párrafo), y añadiendo una barra ('&lt;code&gt;/&lt;/code&gt;') a dicha marca después del primer paréntesis, cuando la marca es la de fin (por ejemplo, &lt;code&gt;&amp;lt;/P&amp;gt;&lt;/code&gt; sería la marca HTML para señalar el fin de un párrafo).&lt;br /&gt;&lt;br /&gt;En consecuencia, las marcas HTML que corresponderán a los elementos de nuestro texto y que equivalen a las &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;marcas informales&lt;/a&gt; que aplicamos en el anterior artículo son las siguientes:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO TÍTULO SECCIÓN:&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;H2&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN TÍTULO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/H2&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;DIV&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN SECCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/DIV&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;P&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN PÁRRAFO&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/P&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;OL&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN LISTA NUMERADA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/OL&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;LI&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ELEMENTO LISTA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/LI&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;EM&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN NOMBRE PROGRAMA&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/EM&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;CODE&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN OPCIÓN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/CODE&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;INICIO ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;CODE&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;code&gt;FIN ORDEN&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;code&gt;&lt;strong&gt;&amp;lt;/CODE&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Procedamos, pues, a sustituir nuestras marcas informales por las marcas HTML convenidas. Para ello, por supuesto, merece la pena recurrir a HAL, concretamente a &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/01/hal-y-el-sol-naciente.html#sed"&gt;&lt;code&gt;sed&lt;/code&gt;&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Guardemos el &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-introduccion.html#marcas_informales"&gt;texto con nuestras etiquetas iniciales&lt;/a&gt; en el fichero &lt;code&gt;texto_etiquetado.txt&lt;/code&gt;. [Si el lector utiliza &lt;em&gt;Vim&lt;/em&gt; para copiar el texto desde esta web al susodicho fichero, ejecute antes de hacerlo la orden &lt;code&gt;:set wrapmargin=0&lt;/code&gt;, ello impedirá que se creen saltos de línea donde no debe haberlos y evitará comportamientos inesperados de &lt;code&gt;sed&lt;/code&gt;; en caso de emplear otros editores, asegúrese de que la generación de saltos de línea automáticos no está activada.]&lt;br /&gt;&lt;br /&gt;Crearemos también un fichero, que llamaremos &lt;code&gt;txt2html.sed&lt;/code&gt;, y escribiremos en él las siguientes órdenes de &lt;code&gt;sed&lt;/code&gt;, que son las que realizan una a una la conversión requerida:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;s/INICIO TÍTULO SECCIÓN/&amp;lt;H2&amp;gt;/g&lt;br /&gt;s/FIN TÍTULO SECCIÓN/&amp;lt;\/H2&amp;gt;/g&lt;br /&gt;s/INICIO SECCIÓN/&amp;lt;DIV&amp;gt;/g&lt;br /&gt;s/FIN SECCIÓN/&amp;lt;\/DIV&amp;gt;/g&lt;br /&gt;s/INICIO PÁRRAFO/&amp;lt;P&amp;gt;/g&lt;br /&gt;s/FIN PÁRRAFO/&amp;lt;\/P&amp;gt;/g&lt;br /&gt;s/INICIO LISTA NUMERADA/&amp;lt;OL&amp;gt;/g&lt;br /&gt;s/FIN LISTA NUMERADA/&amp;lt;\/OL&amp;gt;/g&lt;br /&gt;s/INICIO ELEMENTO LISTA/&amp;lt;LI&amp;gt;/g&lt;br /&gt;s/FIN ELEMENTO LISTA/&amp;lt;\/LI&amp;gt;/g&lt;br /&gt;s/INICIO NOMBRE PROGRAMA/&amp;lt;EM&amp;gt;/g&lt;br /&gt;s/FIN NOMBRE PROGRAMA/&amp;lt;\/EM&amp;gt;/g&lt;br /&gt;s/INICIO ORDEN/&amp;lt;CODE&amp;gt;/g&lt;br /&gt;s/FIN ORDEN/&amp;lt;\/CODE&amp;gt;/g&lt;br /&gt;s/INICIO OPCIÓN/&amp;lt;CODE&amp;gt;/g&lt;br /&gt;s/FIN OPCIÓN/&amp;lt;\/CODE&amp;gt;/g&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ahora podemos pedir a &lt;code&gt;sed&lt;/code&gt; que realice la sustitución de marcas y guarde el resultado en el fichero &lt;code&gt;texto_etiquetado.html&lt;/code&gt;. (Nótese que al fichero le añadimos la extensión &lt;code&gt;html&lt;/code&gt; puesto que el fichero resultante contendrá marcas &lt;code&gt;html&lt;/code&gt;). &lt;br /&gt;&lt;br /&gt;Pero vamos a poner a trabajar a &lt;code&gt;sed&lt;/code&gt; de una manera diferente a como lo hemos hecho habitualmente. Se recordará que la orden para &lt;code&gt;sed&lt;/code&gt; se le daba como su primer argumento:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed ORDEN_SED FICHERO&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Cuando había varias órdenes ---no lo explicamos expresamente, pero sí lo utilizamos, por ejemplo, &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/lo-que-haremos-con-hal.html"&gt;aquí&lt;/a&gt;--- se recurría la opción &lt;code&gt;-e ORDEN&lt;/code&gt;, que se podía repetir cuantas veces quisiéramos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed -e ORDEN1 -e ORDEN2 ... FICHERO&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora bien, cuando el número de órdenes para &lt;code&gt;sed&lt;/code&gt; es grande, como en nuestro presente caso, es preferible guardarlas en un fichero en lugar de escribirlas directamente en la línea de órdenes y utilizar la opción &lt;code&gt;-f&lt;/code&gt; para que &lt;code&gt;sed&lt;/code&gt; lea sus órdenes de ese fichero:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed -f FICHERO_ORDENES FICHERO&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Por tanto, la orden que en esta ocasión enviaremos a HAL para que &lt;code&gt;sed&lt;/code&gt; nos libere del pesadísimo trabajo de realizar a mano la conversión es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sed -f txt2html.sed texto_etiquetado.txt &amp;gt;texto_etiquetado.html&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y el resultado será éste:&lt;br /&gt;&lt;code id="marcas_html"&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;H2&amp;gt;&lt;/span&gt;&lt;br /&gt;Navegación gráfica&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/H2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;OL&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;LI&amp;gt;&lt;/span&gt;&lt;br /&gt;Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/LI&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;LI&amp;gt;&lt;/span&gt;&lt;br /&gt;Crear en &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;Vim&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt; una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden &lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;:new ruta_fichero&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/LI&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/OL&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;H2&amp;gt;&lt;/span&gt;&lt;br /&gt;Navegación desde consola&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/H2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Si navegamos con &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;w3m&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt;, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;Vim&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt;, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;Con &lt;span style="color:red"&gt;&amp;lt;EM&amp;gt;&lt;/span&gt;w3m&lt;span style="color:red"&gt;&amp;lt;/EM&amp;gt;&lt;/span&gt; el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción &lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;-dump&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;w3m -dump http://www.w3.org/TR/html401/struct/lists.html&lt;span style="color:red"&gt;&amp;lt;/CODE&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;P&amp;gt;&lt;/span&gt;&lt;br /&gt;nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/P&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&amp;lt;/DIV&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumen&lt;/strong&gt;&lt;br /&gt;&lt;ul class="resumen"&gt;&lt;br /&gt;&lt;li&gt;HTML es un lenguaje de marcas. El navegador web procesa un texto marcado con marcas HTML para su visualización adecuada como página web.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HTML utiliza nombres especiales para designar los elementos estructurales y genéricos de todo texto (sección, título, párrafo, lista, etc.). Por ejemplo, &lt;code&gt;DIV&lt;/code&gt; es la forma de llamar en HTML a una sección: &lt;code&gt;P&lt;/code&gt;, a un párrafo, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las marcas HTML se construyen a partir del nombre del elemento que se ha de marcar, englobándolo en paréntesis angulares y distinguiendo la marca de inicio de la marca de cierre. Por ejemplo, &lt;code&gt;&amp;lt;P&amp;gt;&lt;/code&gt; es la marca de inicio de un párrafo y &lt;code&gt;&amp;lt;/P&amp;gt;&lt;/code&gt; es la de cierre.&lt;/li&gt;&lt;br /&gt;&lt;li id="sed-f"&gt;La opción &lt;code&gt;-f&lt;/code&gt; de la orden &lt;code&gt;sed&lt;/code&gt; permite agrupar varias órdenes de &lt;code&gt;sed&lt;/code&gt; en un mismo fichero y pasárselas a &lt;code&gt;sed&lt;/code&gt; sin que sea necesario escribirlas directamente en la línea de órdenes. Por ejemplo, &lt;code&gt;sed -f mis_ordenes mi_fichero&lt;/code&gt; ejecutará las órdenes de &lt;code&gt;sed&lt;/code&gt; que constan en el fichero &lt;code&gt;mis_ordenes&lt;/code&gt; para procesar el fichero &lt;code&gt;mi_fichero&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7872588298095020991-4675715877725258546?l=los-pajaros-de-hogano.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://los-pajaros-de-hogano.blogspot.com/feeds/4675715877725258546/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4675715877725258546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7872588298095020991/posts/default/4675715877725258546'/><link rel='alternate' type='text/html' href='http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-las-marcas-html-i.html' title='HAL y las marcas (HTML - I)'/><author><name>átopos</name><uri>http://www.blogger.com/profile/15405131193146954258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7872588298095020991.post-1994426883462306516</id><published>2009-03-16T11:34:00.010+01:00</published><updated>2009-03-21T23:29:35.678+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes de marcas'/><category scheme='http://www.blogger.com/atom/ns#' term='Conversaciones con HAL'/><title type='text'>HAL y las marcas (Introducción)</title><content type='html'>Como ya comentamos &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/02/hal-y-vim-i.html"&gt;hace unos días&lt;/a&gt;, hubo un tiempo en que el escritor no se encargaba más que de escribir el texto y entregar su borrador a los expertos tipógrafos y diseñadores, que le otorgaban esa forma acabada y bella que luego el lector disfrutaría en su amado libro. Cuando surgían dudas sobre algunos aspectos del texto, un ayudante del diseñador se ponía en contacto con el escritor para determinar cosas como si tal frase era un título de sección, si tal palabra era un vocablo especial o si cierta lista debía o no ordenarse numéricamente. Se producía así un intercambio de pruebas que, con el tiempo, corregidas erratas y suprimidas todas las ambigüedades, conducía al borrador final. El ayudante del diseñador prepararía ese borrador, que contendría marcas especiales, las cuales indicarían básicamente la estructura del texto ("he aquí un capítulo", "esto es una palabra importante", "aquí empieza una sección", etc.), signos convencionales establecidos por el equipo de diseño. El propio escritor o su ayudante ---si es que tenía alguno--- podría incluso tener noticia de esas marcas y escribirlas él mismo, agilizando de este modo la producción del libro. &lt;br /&gt;&lt;br /&gt;Aunque esta descripción es una versión idealizada de la seguramente compleja y variopinta realidad histórica, podemos considerarla como una aproximación suficiente a lo que, &lt;em&gt;idealiter&lt;/em&gt;, debería ser el proceso de edición de un libro, donde cada parte implicada realiza su tarea con la pericia que emana del dominio de su oficio sin inmiscuirse en el trabajo de los demás.&lt;br /&gt;&lt;br /&gt;Nuestra propuesta ha sido y sigue siendo retornar en la medida de lo posible a esa Edad de Oro de la escritura. El primer paso lo dimos ya, al presentar un puro editor de consola como medio para facilitar la ingrata tarea de mecanografiar el texto. El segundo paso es, indudablemente, conocer quiénes son los expertos en la producción final del documento y qué convenciones hemos de seguir para comunicarnos con ellos. Salvo que el escritor disponga de medios de financiación inusitados, tendrá que adoptar el papel que antes adscribimos al ayudante del diseñador, es decir, tendrá que incluir él mismo las marcas que los expertos prescriben para llevar a buen término su tarea. Marcas, en principio ---adviértase---, únicamente estructurales, que nadie mejor que el autor será capaz de explicitar, pues atañen a la estructura lógica de su propio escrito.&lt;br /&gt;&lt;br /&gt;La ventaja de los nuevos tiempos es que no tenemos que perder horas al teléfono o escribir decenas de cartas para hablar con los siempre ocupados tipógrafos y diseñadores. Ambos son ya miembros de la abigarrada tropa de ayudantes de HAL. Y los hay para todos los gustos y para todos los fines. Por ejemplo, para que nuestro escrito quede fiel y bellamente representado en un fichero listo para imprimir, puedo ponerme en contacto con un experto en la creación de ficheros PDF como &lt;em&gt;pdflatex&lt;/em&gt;; si mi propósito es, más bien, obtener un documento para su trasmisión por la Web, puedo elegir que sea el navegador mismo el que se encargue de la tarea de mostrarlo como debe o, si soy más exigente, acudir a otros expertos que conviertan el mismo fichero en PDF o en HTML, según nuestra conveniencia del momento.&lt;br /&gt;&lt;br /&gt;Cada uno de estos ayudantes de HAL entiende sus propias convenciones y presupone sus propias formas de marcar el texto. Conocer a todos los expertos y las numerosas posibilidades de incluir las marcas que cada cual estipula es una tarea demasiado ambiciosa y terriblemente vasta. Pero sí es extraordinariamente interesante pasar unos días en los gabinetes y talleres de alguno de ellos y hacerse una idea de lo que ahí se cuece. Siempre habrá tiempo para ir aprendiendo lo que necesitamos, una vez que el terreno es conocido y no hay nada temible a la vista.&lt;br /&gt;&lt;br /&gt;Lo lógico es empezar con un texto cualquiera y ver cómo podemos marcarlo para que el experto de turno ponga en marcha sus sofisticadas herramientas. Naturalmente, el texto de ejemplo será muy sencillo, pero suficiente para nuestro objetivo actual de iniciación al asunto. Se trata de un fragmento de este mismo blog (varios párrafos a partir del tercero del &lt;a href="http://los-pajaros-de-hogano.blogspot.com/2009/03/hal-y-w3m-iv.html"&gt;artículo anterior&lt;/a&gt; al que hemos añadido dos frases que harán las veces de título de sendas secciones). Helo aquí:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Navegación gráfica&lt;br /&gt;Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:&lt;br /&gt;Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).&lt;br /&gt;Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta_fichero.&lt;br /&gt;Navegación desde consola&lt;br /&gt;Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar pa
