Datatool을 사용하여 맞춤 주문하는 방법

Datatool을 사용하여 맞춤 주문하는 방법

그래서 제가 작성하고 있는 암벽등반 가이드에 대한 데이터가 있습니다. 마지막 페이지에는 등급별로 정렬된 모든 경로를 나열하고 싶습니다. 문제는 여기에는 기존 정렬이 적용되지 않는다는 것입니다.

등반 등급에 대한 간단한 설명(YDS 시스템):

등급은 암벽 등반의 난이도를 나타내는 1차원 수량입니다. 등급은 숫자로 표시되며, 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, 10ㄴ, 11a, 11-, 11b, 11c, 12d

솔루션 아이디어:

-숫자와 문자를 분리하여 2열로 정렬합니다. 나는 이 솔루션을 좋아하지만 아마도 그 숫자 끝에 + 및 - 등급을 넣을 것입니다(나는 그와 함께 살 수 있습니다). 또한 소스가 아닌 datatool에서 이 분할을 수행하고 싶습니다.

- 어쩌면 맞춤 주문을 지정하는 방법이 있을 수도 있습니다. 가능한 모든 등급을 직접 입력해야 하는 것은 괜찮습니다. 그렇게 많지는 않습니다(세계에서 가장 어려운 경로는 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)

보시다시피 이 솔루션은 내 상황에 매우 구체적이며 일반화되지 않습니다. 캐릭터 8과 9에 적용한 변경 사항은 등급이 18인 경로가 존재하는 경우 문제가 될 수 있습니다. 왜냐하면 등급이 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
            }%
          }%
        }%
      }%
    }%
  }%
}

산출:

여기에 이미지 설명을 입력하세요

관련 정보