{"id":84,"date":"2010-07-03T03:01:00","date_gmt":"2010-07-03T01:01:00","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=84"},"modified":"2022-08-20T18:26:02","modified_gmt":"2022-08-20T16:26:02","slug":"org-mode-spreadsheet-hojas-de-calculo","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=84","title":{"rendered":"Org-mode : spreadsheet (hojas de calculo)"},"content":{"rendered":"<p style=\"text-align: justify;\">Y aqui estamos con un nuevo articulo sobre <strong>org-mode<\/strong>, como no, <strong>org-mode<\/strong> permite la creacion y uso de hojas de calculo (en ingles spreadsheet). Parece increible como un software que a simple vista parece tan simple, pueda llegar a tener tanta potencia, todo esto no seria posible sin el magnifico grupo de desarrolladores de <strong>org-mode<\/strong> y en general a la comunidad tan activa de <strong>GNU\/emacs<\/strong>, sin mas dilacion comenzamos explicando el uso de referencias.<\/p>\n<p style=\"text-align: justify;\">Antes de comenzar, debe conocer un minimo el uso de tablas en org-mode, ya que las hojas de calculo se emplean mediante dicho uso, por lo que es necesario leer el articulo sobre <a href=\"https:\/\/www.blackhats.es\/wordpress\/?p=83\" target=\"_blank\" rel=\"noopener\">Org-mode: tablas<\/a> para poder aplicar luego hojas de calculo sobre el.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Referencias<\/strong><\/span><\/p>\n<p style=\"text-align: justify;\">Se puede referenciar un campo para computarlo con otros. Se puede referenciar dado su <strong>nombre<\/strong>, sus <strong>coordenadas absolutas<\/strong> o <strong>coordenadas\u00a0relativas<\/strong>. Para saber las corrdenadas de un campo debemos presionar <strong>C-c ?<\/strong> que mostrar las coordenadas de dicho campo o bien <strong>C-c }<\/strong> que hara toggle de las coordenadas del grid.<\/p>\n<p style=\"text-align: justify;\">La notacion que usa org es <strong>@fila$columna<\/strong>, si es relativa debemos anadir <strong>+<\/strong> o <strong>&#8211;<\/strong> delante del numero. Tambien se puede especificar &#8216;<strong>I<\/strong>&#8216; para referirse a la primera linea, &#8216;<strong>II<\/strong>&#8216; a la segunda linea, &#8216;<strong>-I<\/strong>&#8216; a la (n)anterior linea o bien &#8216;<strong>III+2<\/strong>&#8216; para referirse al segundo dato de la tercera linea de la tabla. 0 se referira a la columna y fila actual.<\/p>\n<p>Existen <strong>referencias especiales<\/strong> como &#8216;<strong>$LR5<\/strong>&#8216; que pueden ser usadas para referirse al 5o campo de la ultma fila de la tabla.<\/p>\n<p style=\"padding-left: 30px;\"><strong>@2$3<\/strong> -&gt; 2a fila, 3a columna<br \/>\n<strong> C2<\/strong> -&gt; igual que la anterior columna<br \/>\n<strong> $5<\/strong> -&gt; 5a columna en la fila actual<br \/>\n<strong> E&amp;<\/strong> -&gt; igual que la anterior<br \/>\n<strong> @2<\/strong> -&gt; columna actual, 2a fila<br \/>\n<strong> @-1$-3<\/strong> -&gt; una fila mas arriba, tres columnas mas a la derecha<br \/>\n<strong> @-I$2<\/strong> -&gt; encima de la fila actual, columna 2<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Rangos<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>$1..$3<\/strong> -&gt; Los primeros 3 campos de la fila actual<br \/>\n<strong> $P..$Q<\/strong> -&gt; rango usando nombres de columnas P y Q<br \/>\n<strong> @2$1..@4$3<\/strong> -&gt; 6 campos entre estos dos campos, dando rutas relativas<br \/>\n<strong> A2..C4<\/strong> -&gt; 6 campos entre estos dos campos, dando rutas absolutas<br \/>\n<strong> @-1$-2..@-1<\/strong> -&gt; 3 numeros de la columna a la derecha, 2 arriba de la fila actual.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Referencias con nombre<\/span><\/strong><\/p>\n<p style=\"text-align: justify;\">Se puede asignar un nombre a una referencia mediante la variable <span style=\"color: #000000;\"><strong>org-table-formula-constants<\/strong><\/span>, o localmente mediante el fichero de configuracion:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008080;\">#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6<\/span><\/p>\n<p>Es posible usar referencias remotas mediante:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008080;\">remote(NAME-OR-ID,REF)<\/span><\/p>\n<p style=\"text-align: justify;\">Donde nombre es el nombre de la tabla dado por <strong>#+TBLNAME: NAME<\/strong> o su <strong>ID<\/strong>. <strong>REF<\/strong> es la direccion absoluta o rango de referencias valido en la tabla.<\/p>\n<p style=\"text-align: justify;\">Las formulas pueden ser usadas como expresiones algebraicas mediante el paquete <strong>calc<\/strong> de <strong>emacs<\/strong> (importante saber que usa convencion no estandar donde <strong>\/<\/strong> tiene menos precedencia que <strong>*<\/strong>) mediante la funcion <strong>calc-eval<\/strong> se puede realizar esta evaluacion.<\/p>\n<p style=\"text-align: justify;\">Mediante <strong>org-calc-default-modes<\/strong> se usara el <strong>modo standard<\/strong> de <strong>calc<\/strong> (precision 12, unidades angulares graduales, fracciones y los modos simbolicos deshabilitados).<\/p>\n<p style=\"padding-left: 30px;\"><strong>p20<\/strong> -&gt; cambia la precision interna a 20 digitos<br \/>\n<strong> n3 s3 e4 f4<\/strong> -&gt; normal, cientifica, ingeniero o formato fijo<br \/>\n<strong> D R<\/strong> -&gt; gradianes o radiales (angulo)<br \/>\n<strong> F S<\/strong> -&gt; fraccion y simbolicos<br \/>\n<strong> N<\/strong> -&gt; interpreta todos los campos como numeros, y usa 0 para los campos que no tengan numeros.<br \/>\n<strong> T<\/strong> -&gt; fuerza la intepretacion del texto<br \/>\n<strong> E<\/strong> -&gt; mantiene campos vacios en rangos<\/p>\n<p>Ademas se puede usar <strong>printf<\/strong> como especificador de formato para reformatear el resultado final:<\/p>\n<p style=\"padding-left: 30px;\"><strong>$1+$2<\/strong> : suma el primero y el segundo campo<br \/>\n<strong> $1+$2;%.2f<\/strong> : suma los dos primeros campos usando 2 decimales<br \/>\n<strong> exp($2)+exp($1)<\/strong> : funciones matematicas<br \/>\n<strong> $0;%.1f<\/strong> : reformatea la celda actual a un decimal<br \/>\n<strong> ($3-32)*5\/9<\/strong> : Conversion de grados Farenheit a Celsius<br \/>\n<strong> $c\/$1\/$cm<\/strong> : Conversion de Hz a cm<br \/>\n<strong> tan($1);Dp3s1<\/strong> : computa en grados, precision 3, mostrando SCI 1<br \/>\n<strong> sin($1);Dp3%.le<\/strong> : usa el especificador printf para mostrar<br \/>\n<strong> vmean($2..$7)<\/strong> : computa un rango de columnas, usando un vector de funciones<br \/>\n<strong> vmean($2..$7);EN<\/strong> : igual, pero usa los campos vacios como 0<br \/>\n<strong> taylor($3,x=7,2)<\/strong> : serie de taylor de $3, en x=7, segundo grado.<\/p>\n<p>Tambien se pueden contener expresiones logicas tales como:<\/p>\n<p style=\"padding-left: 30px;\"><strong>if($1&lt;20,teen,string(\u00ab\u00bb))<\/strong> : teen, si la edad de $1 es menor que 20, en cualquier otro caso vacio.<\/p>\n<p style=\"text-align: justify;\">Si lo que queremos es usar mas potencia podemos escribir formulas para la manipulacion de cadenas y el control de estrucutras tales como:<\/p>\n<p style=\"padding-left: 30px;\">Intercambia los primeros dos caracteres de la columna 1:<br \/>\n<span style=\"color: #008080;\"> &#8216;(concat (substring $1 1 2) (substring $1 0 1) (substring $1 2))<\/span><\/p>\n<p style=\"padding-left: 30px;\">Suma columnas 1 y 2, equivalnete a calc $1 y $2:<br \/>\n<span style=\"color: #008080;\"> &#8216;(+ $1 $2);N<\/span><\/p>\n<p style=\"padding-left: 30px;\">Calcula la suma de las columnas 1 a 4:<br \/>\n<span style=\"color: #008080;\"> &#8216;(apply &#8216;+ &#8216;($1..$4));N<\/span><\/p>\n<p style=\"text-align: justify;\">Para asignar una formula a un campo en particular, debe ir precedido por \u00ab<strong>:=<\/strong>\u00ab. Las formulas son guardadas en el formato especial con <strong>#+TBLFM:<\/strong> directamente debajo de la tabla. Ademas debemos usar el comando <strong>C-u C-c =<\/strong> si queremos insertar una nueva formula en el campo actual.<\/p>\n<p style=\"text-align: justify;\">Es frecuente usar la misma formula para todos los campos de una columna, esto es posible mediante <strong>TAB<\/strong>, <strong>INTRO<\/strong> o <strong>C-c C-c<\/strong> para pasar guardar la formula en la columna usada. Una vez se sale a la siguiente fila tan solo debemos pulsar<strong> C-c =<\/strong>, e insertara la nueva formula en la columna actual, reemplazandola por el resultado, tambien es posible usar prefijos para aplicarlo en muchas celdas consecutivas de la columna actual.<\/p>\n<p>Para editar y depurar (o debuggear) existe:<\/p>\n<ul>\n<li><strong>C-c = <span style=\"font-weight: normal;\">\u00f3<\/span> C-u C-c =<\/strong> : Edita una formula asociada con el campo\/columna actual en el minibuffer.<\/li>\n<li><strong>C-u C-u C-c =<\/strong> : reinserta una formula activa en el campo actual. Ademas la ventaja de usar el minibuffer es que se puede emplear el comando <strong>C-c ?<\/strong><\/li>\n<li><strong>C-c ?<\/strong> : Resalta el campo referenciado por la posicion del cursor en una formula.<\/li>\n<li><strong>C-c }<\/strong> : Muestra (toggle) los numeros de una fila y columna para una tabla, usando overlays. Con<strong> C-c C-c<\/strong> se puede formar la alineacion de la tabla cada vez.<\/li>\n<li><strong>C-c {<\/strong> : Hace toggle del debugger de formula.<\/li>\n<li><strong>C-c &#8216;<\/strong> : Edita todas las formulas de la tabla actual en un buffer especial.<\/li>\n<li><strong>C-c C-c<\/strong> \u00f3\u00a0<strong>C-x C-s<\/strong> : Sale del editor de formulas<\/li>\n<li><strong>C-c C-q<\/strong> : Sale del editor de formula sin instalar los cambios.<\/li>\n<li><strong>C-c C-r<\/strong> : Hace toggle del editor de formulas para todas las referencias entre <strong>standard<\/strong> (B3, etc) e <strong>internas<\/strong> (@3$2, etc).<\/li>\n<li><strong>TAB<\/strong> : Hace impresion &#8216;bonita&#8217;, idnetando las formulas lisp, etc.<\/li>\n<li><strong>M-TAB<\/strong> : Completa los simbolos lisp.<\/li>\n<li><strong>S-up\/down\/left\/right<\/strong> (tecla super + flechas) : Desplaza el punto de referencia.<\/li>\n<li><strong>M-S-up\/down<\/strong> : Mueve la linea de test para formulas en columnas en el bufer de org.<\/li>\n<li><strong>M-up\/down<\/strong> : Desplaza la ventana<\/li>\n<li><strong>C-c }<\/strong> : Muestra las coordenadas del grid de la tabla.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Cuando se evalua una forma que contiene errores se mostrara la cadena &#8216;<strong>#ERROR<\/strong>&#8216; para conocer que ocurrio en la substitucion de variables y calculos se puede emplear <strong>C-u C-u C-c = INTRO<\/strong>.<\/p>\n<p>Para actualizar la tabla se pueden emplear los siguientes comandos:<\/p>\n<ul>\n<li><strong>C-c *<\/strong> : Recalcula la fila actual<\/li>\n<li><strong>C-u C-c *<\/strong> \u00f3\u00a0<strong>C-u C-c C-c<\/strong> : recalcula la tabla entera<\/li>\n<li><strong>C-u C-u C-c *<\/strong> \u00f3<strong> C-u C-u C-c C-c<\/strong> : Itera la tabla para recalcularla hasta que los cambios ocurran.<\/li>\n<\/ul>\n<p>Existen otras funciones avanzadas con tablas como:<\/p>\n<ul>\n<li><strong>C-#<\/strong> : rota la marca de calculos en la primera columa para los estados, &#8216;<strong>#<\/strong>&#8216;, &#8216;<strong>*<\/strong>&#8216;, &#8216;<strong>!<\/strong>&#8216;, &#8216;<strong>$<\/strong>&#8216;. Tambien se puede aplicar sobre regiones.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px; text-align: justify;\">Las tablas especiales que comiencen con <strong>C-u C-c *<\/strong> solo afectara a filas marcadas por &#8216;<strong>#<\/strong>&#8216; y &#8216;<strong>*<\/strong>&#8216;. Las marcas tienen los siguientes significados:<\/p>\n<p style=\"padding-left: 60px; text-align: justify;\"><strong>!<\/strong> : Define nombres para las columnas, por lo que es posible usar $nombre en lugar de $6.<br \/>\n<strong> ^<\/strong> : Define nombres para las filas, por lo que cualquier formula en la tabla que use $m1, tomara el valor de la misma.<br \/>\n<strong> _<\/strong> : Define nombres en los campos de la fila inferior.<br \/>\n<strong> $<\/strong> : Campos en esta fila pueden definir parametros para formulas. Por ej. si un campo de una fila contiene $, y dentro contiene max=50, las formulas en esta tabla se podran referir a $max usando como valor 50. Los parametros trabajaran como constantes.<br \/>\n<strong> #<\/strong> : Campos en esta fila seran automaticamente recalculados mediante <strong>TAB<\/strong>, <strong>INTRO<\/strong> o <strong>S-TAB<\/strong> o mediante <strong>C-u C-c *<\/strong> para recalcularlo de forma global.<br \/>\n<strong> *<\/strong> : Selecciona esta linea para recalcular globalmente con <strong>C-u C-c *<\/strong>, pero no de forma automatica (para evitar carga cuando se edita demasiado).<br \/>\n<strong> :<\/strong> Lineas desmarcadas estan excentas de calculos con <strong>C-u C-c *<\/strong>.<br \/>\n<strong> \/<\/strong> : No exporta esta linea.<\/p>\n<p style=\"text-align: justify;\">Basicamente este es el uso de hojas de calculo con emacs, aunque en el siguiente articulo anadire una funcionalidad interesante que sabiendo esto puedan crearse graficos sobre dichos datos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Y aqui estamos con un nuevo articulo sobre org-mode, como no, org-mode permite la creacion y uso de hojas de calculo (en ingles spreadsheet). Parece increible como un software que a simple vista parece tan simple, pueda llegar a tener tanta potencia, todo esto no seria posible sin el magnifico grupo de desarrolladores de org-mode [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[8,154,152,149,145,146,153,151],"class_list":["post-84","post","type-post","status-publish","format-standard","hentry","category-basic","tag-emacs","tag-graficas","tag-hoja-de-calculo","tag-org","tag-org-mode","tag-orgmode","tag-plot","tag-spreadsheet"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/84"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=84"}],"version-history":[{"count":6,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/84\/revisions"}],"predecessor-version":[{"id":767,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/84\/revisions\/767"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=84"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=84"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=84"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}