Tengo algunos datos para una guía de escalada en roca que estoy escribiendo. En la última página quiero enumerar todas las rutas, ordenadas por grado. El caso es que aquí no se aplica la clasificación convencional.
Explicación rápida de los grados de escalada (sistema YDS):
Una calificación es una cantidad unidimensional que indica la dificultad de una escalada en roca. Los grados se indican con números, y a partir del grado 10, se subdividen en cuatro grados, indicados con las letras a, b, cy d.
Ejemplos: 8, 9, 10a, 10c, 11b
A veces, las calificaciones se dividen en dos, no en cuatro, lo que se indica con los signos - y +. De esta manera, una ruta calificada como 10+ podría ser 10c o 10d, y en la tabla debería mostrarse entre esas calificaciones.
Entonces quiero poder solucionar esto de alguna manera.
MWE:
\documentclass[12pt,a4paper]{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage{longtable}
\begin{filecontents*}{datos.csv}
Route,Grade
Cempasúchil,9
La Gripe, 8
Dopamina infinita, 10b
Casiopea, 11c
El Hombre Avispa, 11b
Tiranosaurio Tex, 11-
Euro Dance, 11a
El Primer Contacto, 12d
\end{filecontents*}
\pagestyle{empty}
\DTLloaddb[keys={Route,Grade}]{datos}{datos.csv}
\DTLsort{Grade=ascending}{datos}
\begin{document}
{\tiny
\noindent
\begin{longtable}{ll}
\bfseries Route & \bfseries Grade \\
\DTLforeach{datos}{%
\pname=Route,\pGrade=Grade}{%
\pname & \pGrade \\
}
\end{longtable}
}
\end{document}
Producción:
Orden correcto:
8, 9, 10b, 11a, 11-, 11b, 11c, 12d
Ideas de solución:
-Dividir el número y la letra, y ordenar por dos columnas. Me gusta esta solución, sin embargo, probablemente pondría calificaciones + y - al final de ese número (podría vivir con el suyo). También me gustaría hacer esta división en la herramienta de datos, no desde la fuente.
-Tal vez haya alguna forma de especificar un orden personalizado. No me importaría tener que escribir todos los grados posibles a mano, no hay tantos (la ruta más difícil del mundo es 15d, pero para la guía van de 8 a 14a) Para solucionar esto tal vez modifique o cree un controlador personalizado. (como \dtlicompare)?
Respuesta1
Ok, logré resolver el problema. Quizás esta no sea la forma más elegante, pero a mí me funciona.
Adapté la respuesta para esta pregunta:Clasificación CSV alfabética personalizada (caracteres turcos)
Entonces, la idea principal es: puedes cambiar el código de un carácter a lo que quieras, para que se ordenen de una manera diferente a los códigos UTF8.
Cambié los códigos de estos personajes:
Char ----> New Code
8 ----> 1 (8 always goes first)
9 ----> 2 (9 always goes second)
a ----> 96 (move the a back one code, to put - between a and b)
- ----> 97 (right between a and b)
+ ----> 100 (Right after the c)
d ----> 101 (d is displaced by the d)
Como puede ver, esta solución es muy específica para mi situación y no se generaliza bien. Los cambios que hice a los personajes 8 y 9 serían problemáticos si existiera una ruta calificada con 18, ya que se colocarían antes de los 10. Pero como esta dificultad no existe (y probablemente nunca existirá), no hay problema.
Quizás este enfoque sea adecuado para alguien que lea esta pregunta/respuesta.
Código(añadir al preámbulo):
\renewcommand*{\dtlsetcharcode}[2]{%
\ifstrequal{#1}{8}%
{%
#2=1\relax
}%
{%
\ifstrequal{#1}{9}%
{%
#2=2\relax
}%
{%
\ifstrequal{#1}{a}%
{%
#2=96\relax
}%
{%
\ifstrequal{#1}{-}%
{%
#2=97\relax
}%
{%
\ifstrequal{#1}{+}%
{%
#2=100\relax
}%
{%
\ifstrequal{#1}{d}%
{%
#2=101\relax
}%
{%
#2=`#1\relax
}%
}%
}%
}%
}%
}%
}
Producción: