如何使用 Datatool 進行自訂訂購

如何使用 Datatool 進行自訂訂購

所以我有一些我正在寫的攀岩指南的數據。在最後一頁中,我想列出所有路線,按等級排序。問題是傳統的排序在這裡不適用。

攀登等級快速說明(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 按字母順序排序(土耳其語字元)

所以主要想法是:yoo 可以將字元的程式碼變更為您想要的任何內容,以便它們以與 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
            }%
          }%
        }%
      }%
    }%
  }%
}

輸出:

在此輸入影像描述

相關內容