Portanto, tenho alguns dados para um guia de escalada que estou escrevendo. Na última página quero listar todos os percursos, ordenados por nota. O problema é que a classificação convencional não se aplica aqui.
Explicação rápida sobre graus de escalada (sistema YDS):
Uma nota é uma quantidade unidimensional que indica a dificuldade de uma escalada. As notas são indicadas por números e, a partir da 10ª série, são subdivididas em quatro séries, indicadas pelas letras a, b, c e d.
Exemplos: 8, 9, 10a, 10c, 11b
Às vezes, as notas são divididas em duas, e não em quatro, indicadas pelos sinais - e +. Desta forma, um percurso com nota 10+ poderá ser 10c ou 10d, e na tabela deverá ser exibido entre essas notas.
Então, eu quero ser capaz de resolver isso de alguma forma.
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}
Saída:
Ordem correta:
8, 9, 10b, 11a, 11-, 11b, 11c, 12d
Ideias de soluções:
-Divida o número e a letra e classifique em duas colunas. Gosto desta solução, porém, provavelmente colocaria notas + e - no final desse número (eu poderia conviver com a dele). Também gostaria de fazer essa divisão no datatool, não na fonte.
-Talvez haja alguma maneira de especificar um pedido personalizado. Eu não me importaria de ter que digitar todas as notas possíveis à mão, não são tantas (o caminho mais difícil do mundo é 15d, mas para o guia elas variam de 8 a 14a) Para resolver isso talvez modificando ou criando um manipulador personalizado (como \dtlicompare)?
Responder1
Ok, então consegui resolver o problema. Talvez esta não seja a forma mais elegante, mas funciona para mim.
Adaptei a resposta para esta pergunta:Classificação CSV alfabética personalizada (caracteres turcos)
Então a ideia principal é: você pode alterar o código de um caractere para o que quiser, para que eles sejam classificados de maneira diferente dos códigos UTF8.
Alterei os códigos desses caracteres:
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 você pode ver, esta solução é muito específica para a minha situação e não generaliza bem. As alterações que fiz nos caracteres 8 e 9 seriam problemáticas se existisse uma rota com nota 18, pois seriam colocadas antes dos 10. Mas como esta dificuldade não existe (e provavelmente nunca existirá) não há problema.
Talvez essa abordagem seja adequada para alguém que esteja lendo esta pergunta/resposta.
Código(adicionar ao 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
}%
}%
}%
}%
}%
}%
}
Saída: