Lo que he aprendido: trucar paquetes de Latex

Os contaba hace tiempo cómo hacer una lista de símbolos en Latex sin enloquecer. Hoy os traigo la versión mejorada de esa lista porque como estoy ida de la cabeza he modificado el paquete para que cumpla con mis manías. Antes de nada he de decir que yo no tengo ni idea de programar cosas en Latex y es la primera vez que toco un paquete pero os quiero demostrar que estas cosas no son tan difíciles como parecen😀

En nuestro caso vamos a modificar el paquete listofsymbols para que separe los símbolos de las letras griegas y los acrónimos. Para ello cogeremos el archivo sty, lo leeremos a ver si comprendemos lo que hace y lo trucaremos a nuestro gusto.

Echando un vistazo al código podemos ver que los símbolos se definen y se escriben en un archivo auxiliar sym:

\newcommand{\opensymdef}{\newwrite\@sym \immediate\openout\@sym=\jobname.sym}

\newcommand{\closesymdef}{\immediate\closeout\@sym}

Podemos ver abrir el archivo sym (texto plano, amigos) y ver qué tiene por dentro, que será algo así:

\printsymline{\mathbf{C}}{\mathbf{C}}{cm}{Damping matrix}{1}

Parece que sirve para escribir el símbolo en la lista de símbolos. Luego vemos que el símbolo se crea con la función \newsym que pide 3 argumentos:

\newcommand{\newsym}[3][]{\@createsym{#1}{#2}{#3}\addsymline{#3}{#3}{#2}{#1}{\@sym}}

Esos argumentos son según el manual:

\newsym[description]{macroname}{output}

Seguimos leyendo, se definen los títulos de las secciones:

\newcommand{\symheadingname}{Symbols}
\newcommand{\symheading}{\section*{\symheadingname}}

y las funciones que crean las listas, quitando las opciones de formato:

\newcommand{\listofsymbols} {
\symheading\par
\makeatletter
\IfFileExists{\jobname.syc}{\@input@{\jobname.syc}}{}
\IfFileExists{\jobname.sym}{\@input@{\jobname.sym}}{}
\makeatother

Es decir, que se cogen los archivos sym y syc y se hacen cosas con ellos. Más abajo tenemos cómo se crea el syc:

\renewcommand{\printsymline}[5]{\immediate\write\@syc{\string\newcommand%
{\expandafter\string\csname #3include\endcsname}%
{\csname #3isused\endcsname}}}
\newwrite\@syc \immediate\openout\@syc=\jobname.syc
\IfFileExists{\jobname.sym}{\@input@{\jobname.sym}}{}
\immediate\closeout\@syc

En el que habrá algo del tipo:

\newcommand{\cminclude}{yes}

es decir, se decide si se inclurirá o no en la lista de símbolos según lo hayamos usado en el documento o no.

Viendo esto es fácil saber lo que tenemos que hacer nosotros:

  1. Hacer una función que cree las letras griegas, para mí será newgreek y cogerá los mismos argumentos que newsym

  2. Crear dos archivos temporales, les he llamado greek y grc. Para el greek copiaremos la línea debajo de \opensymdef cambiando sym por greek. Para el grc crearemos otra función \printsymline abajo del todo.

  3. Crear el título de la sección con su variable correspondiente (\greekheadingname) y darle el estilo (\greekheading). Igual que está hecho para el símbolo.

  4. Crear la función que creará la lista de símbolos griegos, le he llamdo \listofgreek. Es igual que \listofsymbols pero cambiando las extensiones de los archivos de los que se lee.

  5. Añadir esta última función \listofgreek a la definición de \listofboth.

Para los acrónimos tenemos que hacer exactamente lo mismo. Con estas modificaciones la lista quedaría parecida a esta:

glossary

Como veis no es difícil. Os enlazo al Gitlab donde tengo mi solución (funciona pero se puede mejorar) porque es bastante largo: lossections

Nada más por hoy señoras y señores, espero que me hurguéis en los paquetes y hagáis del mundo un lugar mejor😀

Más

Escribir paquetes en Latex

Camino a la panificación: pan de plátano

¿Qué haces cuando solo venden los plátanos en bolsas de kilo y nadie más come plátano en tu casa? ¿Y si te juntas además con demasiados fermentos lácteos? Pues está claro: ¡un pan de plátano! Que no es un pan, es un bizcocho pero es conocido en el mundo anglosajón como banana bread. Necesitamos:

  • 200 g de harina, a ser posible tamizada con el bicarbonato y la canela

  • 200 ml de filmjolk o yogur líquido de algún tipo

  • 60 ml de aceite, la mantequilla y la margarina funcionan también

  • 100 g de azúcar, yo usé blanco esta vez pero podéis probar con moreno, panela, miel… aunque cuidado con las cantidades

  • 2 huevos enanos (o uno gordo)

  • 1 cucharada de bicarbonato

  • Una pizquilla de sal

  • 3 plátanos (o más mientras haya más masa que plátano)

  • Canela al gusto del consumidor 

Batimos los huevos con el azúcar. Le añadimos el yogur y el aceite y mezclamos. Añadimos la harina tamizada con el bicarbonato y la canela (si somos vagos no tamizamos pero luego no nos quejamos de que hay grumos). Aplastamos los plátanos con un tenedor y añadimos la masa de plátano a la mezcla anterior. Le damos unas vueltas hasta que se distribuya bien el plátano. Horneamos en horno precalentado a 180C unos 40 minutos. Aquí cada uno que dome su horno, yo sé que cuando tengo el bizcocho casi hecho le apago el calor con el calor residual se me hace, pero cuidadín con los hornos que los carga el diablo. Hala, pan de plátano que te crió: 

#bananabread

Una foto publicada por Ondiz Zarraga (@ondiz_) el

Lo que he aprendido: pintar matrices de MAC en Matlab

Hoy vengo con una cosa megaespecífica para lo que yo hago en la vida: comparar cosas de simulación y experimentales. Concretamente comparo ruido y vibración y en este caso (más concretamente) comparo modos de vibración. ¿Por qué os voy a contar esto? Pues por varios motivos, hermanos míos. El primero es que alguien en el vasto mundo del Interneto puede querer hacer lo mismo que yo y así no tendría que empezar de cero. El segundo es que algún día no muy lejano tendré que buscar currelo y si mis futuros empleadores buscan mi nombre y lo ven relacionado con cosas técnicas dirán ¡oh! esta pava sabe lo que hace y me darán trabajo y me pagarán bien de dinero. Luego está el tercero y más importante: al explicar cosas a los demás es cuando entiendes si tú mismo las captas o no1. Dejémonos de rollos y vamos al lío: pintemos una matriz de MAC todo colorinesca en Matlab.


Primero y para los neófitos en el tema ingeniería mecánica, el MAC o Modal Assurance Criterion es un número entre 0 y 1 que nosotros los ingenieros de la piedra y el palo usamos para decir si dos modos de vibración (ignorar esto y leed vectores) son parecidos o no. Si el MAC es 0 pues son totalmente diferentes y si es 1 pues son iguales. ¿Cómo hacemos esto? Pues dividiéndolos entre su módulo y multiplicándolos escalarmente:

\mathrm{MAC}(\varphi_1, \varphi_2) = \frac{|{\varphi_1}^\intercal{\varphi_2}^*|}{({\varphi_1}^\intercal{\varphi_1}^*) ({\varphi_2}^\intercal{\varphi_2}^*)}

Las Ts y los asteriscos son porque son vectores complejos y verticales.

La particularidad de esto es que nos sirve para ver cómo de parecido es nuestro modelo de simulación a la realidad. Básicamente le damos a un programa nuestros modos de simulación y nuestros modos experimentales le decimos que compare todos con todos y nos haga una matriz rellena de MACs. Si tenemos muchos MACs grandes pues decimos que nuestro modelo es la repera y vamos por ahí muy ufanos. Así de simples somos, ya veis.

Después de esta miniintro teórica para que todo el mundo aprenda algo vamos a centrarnos en la gente que tiene una matriz de MAC en un xls exportada de algún programa y vamos a pintarla.

Cosas que necesitamos:

  • Este hilo de Stack Overflow. Vamos a adaptar el código que dan aquí a nuestras necesidades

  • Entender como van las cells y las funciones lambda en Matlab. Bueno, más o menos.

  • Un archivo xls2 con un formato concreto. Me he basado en los xls que exporta el programa Virtual Lab que es lo que tengo que usar para generar las matrices de MAC3. Abajo en el código está explicado.

  • Paciencia

Tenemos que hacer lo siguiente:

  1. Importar el xls separando los valores de MAC por un lado (lo que pintaremos) y las frecuencias por otro (los ticks los ejes)
  2. Pintar una imagen con cuadrados de colores según el valor de MAC y que contengan el numerito. Para esto adaptaremos el código de Stack Overflow.
  3. Tratar el texto que indica las frecuencias
  4. Poner el texto del eje horizontal en vertical

Siguiendo ese esquema he llegado a esta solución:

Esta en pitinglis y debe ser mejorada pero de momento la podéis ir mirando (y criticando).

Para que la historieta funcione tal vez tengáis que descargar xticklabel_rotate dependiendo de la versión de Matlab que uséis, ya que hasta la versión R2014b Matlab no dejaba girar los nombres de los ticks (el muy). A mí no me queda otra que usarlo porque tengo la R2014a en el curro (al palo). Aquí lo tenéis, por cierto.

Los pros de la versión moderna cambiáis la línea del xticklabel_rotate con algo del tipo:

ejes = gca;
ejes.XTickLabelRotation = 90;

Si os parece interesante otro día explico bien bien los pasos. Me contáis😉


  1. Recuerden si no a aquellos profesores explicando qué pasa al dividir por cero. 
  2. Y NO Excel 
  3. Al loro con el tengo, lo uso porque no tengo alternativa. Pero ese programa es Satán. 

Diálogos: hardcore rap

Pues ahí andábamos mi brother y yo de charleta en el chat cuando se me ocurrió hacerle una pregunta inocente. A partir de ahí se nos fue de las manos. Pasen y vean.


¿En qué se ve que el rap es hardcore?

Depende

En el punk es fácil

1) Letras

Pillas un sonómetro

2) Ritmos
3) Flow

el que más ruidamen meta gana.

Normalmente son las tres a la vez. En una ocasión le preguntan a Doble V si Zombies es la canción más hardcore que han hecho

Porque por ejemplo el negro y el blanco aquellos hacen hardcore, los
del programa de coches ¿cómo se llamaban?

No sé de qué me hablas

Duo Kie

… ellos responden: No consideramos que el hardcore sea algo
así. El hardcore para nosotros son ritmos machacones. Duo Kie hace
hardcore porque gritan y las letras qeu tienen. DMX hace hardcore por
lo mismo. Vinnie hace Hardcore y Horrorcore por los ritmos pesados,
las letras secas y la rima tan machacona. Se cataloga diferente.

Interesting

“Is a genre of hip hop music that developed through the East Coast
hip hop scene in the 1980s. Pioneered by such artists as Kool G Rap,
2Pac, Schoolly D, Spoonie Gee, Boogie Down Productions, Public Enemy,
The Earl (Thomas Dent), Nas, Jay Z, Big L, and N.W.A, it is generally
characterised by anger, aggression, and confrontation.”

Me mola el hardcore de Vinnie por la base

https://en.wikipedia.org/wiki/Hardcore_hip_hop De la lista molan:
Apathy
Big L
Big Pun: tipo Vinnie pero menos oscuro y más bestia en la rima
Boogie Down (antiguo grupo de KRS One)
Canibus
Diabolic
DMX
Gangrene
Heltah Skeltah
House of Pain
Ice Cube
Ill Bill
Immortal Technique
Jadakiss (Jadakiss y todos los Ruff Riders: Styles P, Eve, DMX)
J Cole no es hardcore pero mola también
JMT ya conoces
La Coka ya conoces
The LOX: Jadakiss con Styles P

Esa info ahí

Kool Keith
KRS One (Keith es también horror raro)
MOP es hiperhardcore (la canción de Cena es de ellos)
Nas: no es muy hardcore
Necro (Necro es el hermano de Ill Bill, hace mucho horror también se autoproclama el inventor del Death Rap)
Non Phixion es el grupo de Ill Bill con otros (Goretex y otros)

Hay gentes del Wu Tang Clan

Sí. Wu Tang era hardcore pero no seco como Non Phixion y así
Obie Trice es agresivo, es de Detroit, mola
Onyx te lo recomendé ayer: Hiperagresivo

Interesante

RA Rugged Man es raro, rollo Vinnie pero rima raro (rápido)
Ras Kass, la recomendación de la semana: ponte Drink Irish
Raekwon: no me gusta la voz, flow bonito
Redman hardcore estilo antiguo, buen flow, moody waters
Remy Ma es la mujer de Papoose, recomiendo ambos
Scarface, antiguo getto boy, oro puro

¡Oh! ¡Hay una mujer!

Slaughterhouse es un grupo patrocinado por eminem Royce da 50 9 o como sea etc, mola.
La mujer: hay más pero no me gustan
Smiff-n-Wessun: recomiendo Da Shinnin, buen disco

Oyendo Ras Kass. Me mola

Tech N9ne hace mucho horror, mola, rima supermultisilábico y loco

¿Snoop Dog hace hardcore?

Not really, pero por letras se puede entender que sí

¿Y por qué está ahí? ¡Oh! Drink Irish, smoke Jamaican

Warren G: Recomiendo un poco de G funk en tu vida “Looking at You”
no es hardcore. G Funk es un estilo que “inventó él” tiene cosas
chulas con
Nate Dogg (que en paz descanse)
Xzibit: Oh yeah! ponte Criminal Set o alguna Mixtape de los Serial
killers (Xzibit + B Real + Demrick) los otros pasando no conozco o no
me gustan. Los Wu Tang ni te los recomiendo porque ya tendrías que
tenerlos recomendados. Bueno The Notorious BIG yo no lo considero
hardcore y Rakim tampoco, por eso no los he nombrado. Hardcore: Lo
que te he dicho

Muy bien

No he visto Cypress Hill que es hardcore y casi chicano rap, pero bueno

Hay que coger todo esto y hacer un documento

Eso te iba a decir. Añade EPMD, que también mola

Suficiente

(Haz el documento)
Me he venido arriba,perdona: D Cunninlinguists también pero no es
muy hardcore y si quieres algo oscuro para pasar el rato:
https://www.youtube.com/watch?v=L9-YoeEQAs8a mí me relaja. Con la
portada y el nombre ya sabes por donde van los tiros. Black
Helicopters de Non Phixion también mola.

¿El hombre cabra ese? Me da miedo.

Ponte, ponte

Como la polilla gigante con el cuerpo, Dios qué horrible era.

“When was this released? Goretex has the best fucken delivery ever”

No más, me he agobiao

¡Haz el documento!

Lo que he aprendido: latexdiff vuelve a la carga

¿Os acordáis que me tuve que rendir y utilizar latexdiff online porque no me iba en el Windows? Pues volví a la carga (soy muy terca) y ahora funciona.

La cuestión es que leí esto y decidí usar latexdiff-so por probar a ver qué hacía. Y funcionó. Y yo me quedé loquísima.

Intentaré contar aquí un poco la película para ver si os vale a alguno. Pongamos un poco de contexto, latexdiff es un script de Perl que marca las diferencias entre dos archivos de Latex. Se puede instalar directamente desde el gestor de paquetes de MikTex, para el resto de distribuciones no tengo ni idea.

Como script de Perl que es necesita Perl para poderse usar, así que yo instalé Strawberry Perl, me añadió el path por sí mismo pero por si acaso comprobáis y si no está C:\Strawberry\perl\bin lo añadís. También hay que añadir la carpeta donde está latexdiff al path, será algo del estilo de C:\Program Files (x86)\MiKTeX 2.9\scripts\latexdiff\ así que aprovechamos y hacemos las dos cosas.

Bien, ahora para hacer el diff hacemos lo siguiente:

latexdiff-so viejo.tex nuevo.tex > diff.tex

Nos creará un archivo diff.tex que podemos compilar y donde veremos las diferencias.

Ahora viene lo raro: a mí latexdiff tal cual no me carrula, me da este error:

Can't locate Algorithm/Diff.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/msys /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/msys /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl .) at C:\Program Files (x86)\MiKTeX 2.9\scripts\latexdiff\latexdiff line 117.
BEGIN failed--compilation aborted at C:\Program Files (x86)\MiKTeX 2.9\scripts\latexdiff\latexdiff line 117.

Creo que tiene que ver con lo que cuentan aquí: latexdiff usa el paquete Algorithm::Diff de Perl y latexdiff-so en cambio no (es standalone). De hecho en el código de latexdiff-so pone lo siguiente:

# The stand-alone version of latexdiff is provided as a convenience
# for latex users with no knowledge of PERL who do not wish to install
# additional packages to be able to use latexdiff.

Y en lugar de hacer:

use Algorithm::Diff qw(traverse_sequences);

que es lo que hace latexdiff, define Algorithm::Diff dentro del propio script:

BEGIN { 
package Algorithm::Diff;
use strict;

Y eso hermanos míos, que no hay que rendirse nunca jamás, siempre podemos encontrar una pista aleatoria en Internet que nos encamine hacia la solución final🙂

Lo que he aprendido: definir comandos en Latex

Hoy vamos a definir comandos nuevos en Latex. ¿Por qué? Pues porque nosotros lo valemos. No, en serio, ¿recordáis que hicimos hace un tiempo una plantilla para responder a los revisores de una revista? ¡Pues los revisores han vuelto a la carga! El problema es que ahora las preguntas que hacen no son correlativas sino que piden aclaraciones sobre preguntas que ya hicieron. Ni siquiera los revisores son correlativos, el Revisor 2 ha desaparecido (que era mi favorito😦 ) y ahora son el 1, el 3 y el 4. Por lo tanto nuestra plantilla debe ser modificada1. Bien, pensemos.

Lo primero que tenemos que saber es que los comandos en Latex se definen así:

\newcommand{comando}[argumentos]{definición}

donde:

  • comando será el nombre del comando que queramos definir (lógico) que deberá empezar por \
  • argumentos es el número de argumentos entre 0 y 9 que le pasaremos al comando
  • definición será donde escribiremos lo que hace el comando

No es difícil (no lo parece al menos). En su momento adaptamos una plantilla de por ahí a nuestros gustos sin pararnos a entender a fondo lo que hacía, hoy vamos a pensar qué es lo que necesitamos y cómo lo podemos conseguir. From scratch, como los valientes.

Veamos, en primer lugar nos hace falta crear secciones que se llamen Reviewer X donde X es el número del reviewer. Siguiendo con lo que hemos definido arriba y teniendo en cuenta que los argumentos se pasan con la almohadilla (el hashtag para los modernos) hacemos:

\newcommand{\reviewersec}[1]{\section*{Reviewer #1}}

Ahora nos toca hacer el formato para la pregunta. Para ello queremos que nos ponga Q X.Y y la pregunta en cursiva. X es el número del revisor y Y el de la pregunta. Lo más fácil que podemos hacer es usar tres argumentos, uno para X, otro para Y y un tercero para la pregunta en sí. También queremos que se inicie un nuevo párrafo al final de la pregunta así que usaremos \par al final. Juntando todo nos queda algo así:

\newcommand{\point}[3]{\textbf{Q\,#1.#2}\,\textit{#3}\par}

La parte de la respuesta es muy fácil así que no la voy a explicar, os pongo debajo el código😉

Resumiendo, en total tenemos:

\documentclass[10pt,a4paper]{article}
\usepackage[parfill]{parskip} % para que no nos indente

% Definición de comandos
\newcommand{\reviewersec}[1]{\section*{Reviewer #1}}
\newcommand{\point}[3]{\textbf{Q\,#1.#2}\,\textit{#3}\par}
\newcommand{\reply}{\textbf{Reply}:\ }

\begin{document}

\reviewersec{1}

\point{1}{1}{Pregunta}
\reply{Respuesta}

\end{document}

Que nos genera algo así:

rev

Pues ya lo tenemos, ¿qué os parece? ¿se os ocurre alguna mejora?

Referencias

Latex Macros. Wikibooks

Create your own commands with newcommand

Pasar argumentos a \newcommand


  1. He de añadir que podría darle el formato a manubrio al documento pero prefiero tomármelo como una oportunidad para aprender cosas nuevas. Bastante rabia me da ya la brasa macabea que me están dando los revisores, si por lo menos sacamos algo bueno de ello algo que ganamos :)