Datatool でカスタム注文を行う方法

Datatool でカスタム注文を行う方法

私が書いているロック クライミング ガイド用のデータがあります。最後のページで、すべてのルートをグレード順にリストしたいと思っています。問題は、従来のソートがここでは適用されないことです。

登山グレードの簡単な説明(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
            }%
          }%
        }%
      }%
    }%
  }%
}

出力:

ここに画像の説明を入力してください

関連情報