我正在编写攀岩指南,里面有一些数据。在最后一页,我想列出所有路线,并按等级排序。但传统的排序方法并不适用于此。
爬坡等级(YDS系统)的快速解释:
等级是衡量攀岩难度的一维量。等级用数字表示,从 10 级开始,又细分为四个等级,分别用字母 a、b、c 和 d 表示。
例如:8、9、10a、10c、11b
有时等级分为两级,而不是四级,用 - 和 + 符号表示。这样,等级为 10+ 的路线可能是 10c 或 10d,在表格中它应该显示在这两个等级之间。
所以我希望能够以某种方式解决这个问题。
梅威瑟:
\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}
输出:
正确的顺序:
8、9、10b、11a、11-、11b、11c、12d
解决思路:
- 拆分数字和字母,然后按两列排序。我喜欢这个解决方案,但是,它可能会在该数字的末尾放置 + 和 - 等级(我可以接受他的)。此外,我想在数据工具中进行拆分,而不是从源中进行拆分。
-也许有某种方法可以指定自定义顺序。我不介意手动输入所有可能的等级,因为等级并不多(世界上最难的路线是 15d,但对于指南来说,它们的范围从 8 到 14a)为了解决这个问题,也许可以修改或创建自定义处理程序(如 \dtlicompare)?
答案1
好吧,我设法解决了这个问题。也许这不是最优雅的方法,但对我来说很有效。
我调整了这个问题的答案:自定义字母 CSV 排序(土耳其字符)
所以主要的想法是:你可以将字符的代码更改为你想要的任何内容,以便它们以不同于 UTF8 代码的方式排序。
我改变了这些字符的代码:
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)
如您所见,此解决方案非常具体,仅适用于我的情况,并且不能很好地概括。如果存在等级为 18 的路线,我对字符 8 和 9 所做的更改将会出现问题,因为它们将位于 10 之前。但由于这种难度不存在(并且可能永远不会存在),所以这不是问题。
也许这种方法适合阅读这个问题/答案的人。
代码(添加到序言):
\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
}%
}%
}%
}%
}%
}%
}
输出: