私が書いているロック クライミング ガイド用のデータがあります。最後のページで、すべてのルートをグレード順にリストしたいと思っています。問題は、従来のソートがここでは適用されないことです。
登山グレードの簡単な説明(YDS システム):
グレードは、ロッククライミングの難易度を示す一次元的な量です。グレードは数字で示され、グレード 10 からは、文字 a、b、c、d で示される 4 つのグレードに細分化されます。
例: 8、9、10a、10c、11b
グレードは 4 つではなく 2 つに分けられる場合があり、- と + の記号で示されます。このため、グレード 10+ のルートは 10c または 10d である可能性があり、表ではそれらのグレードの間に表示されます。
だから、何とかこれを整理できるようにしたいのです。
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}
出力:
正しい順序:
8、9、10b、11a、11-、11b、11c、12d
解決策のアイデア:
- 数字と文字を分割し、2 つの列で並べ替えます。このソリューションは気に入っていますが、おそらくその数字の末尾に + と - の等級が付けられることになります (彼のソリューションで我慢できます)。また、この分割はソースからではなく、データツールで実行したいと思います。
- おそらく、カスタム順序を指定する方法があるでしょう。 可能なグレードをすべて手動で入力しなければならないのは構いません。 グレードはそれほど多くありません (世界で最も難しいルートは 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
}%
}%
}%
}%
}%
}%
}
出力: