So führen Sie mit Datatool kundenspezifische Bestellungen durch

So führen Sie mit Datatool kundenspezifische Bestellungen durch

Ich habe also einige Daten für einen Kletterführer, den ich gerade schreibe. Auf der letzten Seite möchte ich alle Routen nach Schwierigkeitsgrad sortiert auflisten. Die herkömmliche Sortierung ist hier jedoch nicht anwendbar.

Kurze Erklärung der Klettergrade (YDS-System):

Ein Schwierigkeitsgrad ist eine eindimensionale Größe, die den Schwierigkeitsgrad einer Klettertour angibt. Die Schwierigkeitsgrade werden durch Zahlen angegeben und ab dem Schwierigkeitsgrad 10 in vier Grade unterteilt, die durch die Buchstaben a, b, c und d gekennzeichnet sind.

Beispiele: 8, 9, 10a, 10c, 11b

Manchmal werden die Schwierigkeitsgrade auch in zwei statt in vier unterteilt, was durch - und +-Zeichen gekennzeichnet wird. So könnte eine Route mit der Schwierigkeitsstufe 10+ eine 10c oder 10d sein und sollte in der Tabelle zwischen diesen Schwierigkeitsgraden angezeigt werden.

Ich möchte das also irgendwie klären können.

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}

Ausgabe:

Bildbeschreibung hier eingeben

Korrekten Reihenfolge:

8, 9, 10b, 11a, 11-, 11b, 11c, 12d

Lösungsideen:

-Zahl und Buchstabe aufteilen und nach zwei Spalten sortieren. Mir gefällt diese Lösung, allerdings würde sie wahrscheinlich + und - Noten ans Ende der Zahl setzen (mit seiner könnte ich leben). Außerdem würde ich diese Aufteilung gerne im Datatool vornehmen, nicht in der Quelle.

-Vielleicht gibt es eine Möglichkeit, eine benutzerdefinierte Reihenfolge anzugeben. Mir würde es nichts ausmachen, alle möglichen Schwierigkeitsgrade von Hand einzugeben, es gibt nicht so viele (die schwierigste Route der Welt ist 15d, aber im Leitfaden reichen sie von 8 bis 14a). Um dieses Problem zu lösen, könnte man vielleicht einen benutzerdefinierten Handler ändern oder erstellen (wie \dtlicompare)?

Antwort1

Ok, ich habe das Problem also gelöst. Vielleicht ist das nicht der eleganteste Weg, aber bei mir funktioniert es.

Ich habe die Antwort auf diese Frage angepasst:Benutzerdefinierte alphabetische CSV-Sortierung (türkische Zeichen)

Die Hauptidee ist also: Sie können den Code eines Zeichens beliebig ändern, sodass es anders sortiert wird als die UTF8-Codes.

Ich habe die Codes dieser Zeichen geändert:

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)

Wie Sie sehen, ist diese Lösung sehr spezifisch für meine Situation und lässt sich nicht gut verallgemeinern. Die Änderungen, die ich an den Zeichen 8 und 9 vorgenommen habe, wären problematisch, wenn es eine Route mit Schwierigkeitsgrad 18 gäbe, da sie vor den 10ern platziert würden. Aber da diese Schwierigkeit nicht besteht (und wahrscheinlich auch nie bestehen wird), ist das kein Problem.

Vielleicht ist dieser Ansatz für jemanden geeignet, der diese Frage/Antwort liest.

Code(zur Präambel hinzufügen):

\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
            }%
          }%
        }%
      }%
    }%
  }%
}

Ausgabe:

Bildbeschreibung hier eingeben

verwandte Informationen