同时对包含西里尔字母和拉丁字母的字符串进行排序

同时对包含西里尔字母和拉丁字母的字符串进行排序

我在自动对包含多篇文章作者信息的行进行排序时遇到了问题,这些信息包括俄语姓氏、名字和父名、其他信息、ORCID 和电子邮件。这些信息写在*.ppl每篇文章的单独文件中。主文件读取所有*.ppl文件,并将每行设置为一些变量。问题是,在输出到“作者信息”部分之前,需要先按西里尔字母排序这些行,然后再按英文字母排序。

由于这里需要大量代码来读取和处理*.ppl文件,因此我简化了代码以开始描述问题。

\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}

\newcounter{pplcount}
\newcommand\addp[1]{
    \stepcounter{pplcount}
    \expandafter\gdef\csname info\arabic{pplcount}\endcsname{#1}
}

\begin{document}

\addp{Валерий Валерьевич Валерьев; e-mail: [email protected]}
\addp{Борис Борисович Борисов; e-mail: [email protected]}
\addp{Александр Александрович Александров; e-mail: [email protected]}
\addp{Diana Davis; e-mail: [email protected]}

\makeatletter

\@nameuse{info3}

\@nameuse{info2}

\@nameuse{info1}

\@nameuse{info4}

\makeatother

\end{document}

然后我需要使用 pdflatex 输出不区分大小写的有序作者列表,首先使用俄语字母("А" "Б" "В" "Г" "Д" "Е" "Ж" "З" "И" "Й" "К" "Л" "М" "Н" "О" "П" "Р" "С" "Т" "У" "Ф" "Х" "Ц" "Ч" "Ш" "Щ" "Ъ" "Ы" "Ь" "Э" "Ю" "Я"),然后使用英语字母,列出任意数量的作者(通常不超过 50 位)。由于作者可能有相同的姓氏,因此需要排序到第一个不匹配的字符。偶尔,同一作者可能会在同一期刊的不同文章中重复出现。当然,自动删除重复项(即直到分号的所有内容)会很酷,但我可以手动执行此操作,因为这种情况极少发生。屏幕截图显示了我的示例的正确排序顺序,这是我手动执行的。

正确排序

我也尝试了,texindy因为它可以分别对西里尔文和英文字符串进行排序。它工作正常,但前提是排序后的字符串仅包含英文或西里尔文字符。在我的例子中,只有电子邮件保留在 中*.idx,但在具有正确第一个西里尔字母的部分中。顺便说一下,datatool该包可以对西里尔文字符串进行排序,但顺序错误。

我非常感谢 tex.stackexchange 社区之前的帮助!我希望有人也能帮助我解决这个问题。

答案1

我使用该软件包找到了解决方案datatool。默认情况下,它对俄语文本的排序不正确,但阅读后如何使用 \dtlsort 处理不同的字母?,我意识到可以重新定义宏\dtlsetUTFviiilccharcode(用于不区分大小写的比较),并且可以正确执行按西里尔字符排序。例如:

\renewcommand*{\dtlsetUTFviiilccharcode}[2]{%
     \ifstrequal{#1}{А}{#2=123\relax}%
    {\ifstrequal{#1}{Б}{#2=124\relax}%
    {\ifstrequal{#1}{В}{#2=125\relax}%
    {\ifstrequal{#1}{Г}{#2=126\relax}%
    {\ifstrequal{#1}{Д}{#2=127\relax}%
    {\ifstrequal{#1}{Е}{#2=128\relax}%
    {\ifstrequal{#1}{Ё}{#2=129\relax}%
    {\ifstrequal{#1}{Ж}{#2=130\relax}%
    {\ifstrequal{#1}{З}{#2=131\relax}%
    {\ifstrequal{#1}{И}{#2=132\relax}%
    {\ifstrequal{#1}{Й}{#2=133\relax}%
    {\ifstrequal{#1}{К}{#2=134\relax}%
    {\ifstrequal{#1}{Л}{#2=135\relax}%
    {\ifstrequal{#1}{М}{#2=136\relax}%
    {\ifstrequal{#1}{Н}{#2=137\relax}%
    {\ifstrequal{#1}{О}{#2=138\relax}%
    {\ifstrequal{#1}{П}{#2=139\relax}%
    {\ifstrequal{#1}{Р}{#2=140\relax}%
    {\ifstrequal{#1}{С}{#2=141\relax}%
    {\ifstrequal{#1}{Т}{#2=142\relax}%
    {\ifstrequal{#1}{У}{#2=143\relax}%
    {\ifstrequal{#1}{Ф}{#2=144\relax}%
    {\ifstrequal{#1}{Х}{#2=144\relax}%
    {\ifstrequal{#1}{Ц}{#2=145\relax}%
    {\ifstrequal{#1}{Ч}{#2=146\relax}%
    {\ifstrequal{#1}{Ш}{#2=147\relax}%
    {\ifstrequal{#1}{Щ}{#2=148\relax}%
    {\ifstrequal{#1}{Ь}{#2=149\relax}%
    {\ifstrequal{#1}{Ы}{#2=150\relax}%
    {\ifstrequal{#1}{Ъ}{#2=151\relax}%
    {\ifstrequal{#1}{Э}{#2=152\relax}%
    {\ifstrequal{#1}{Ю}{#2=153\relax}%
    {\ifstrequal{#1}{Я}{#2=154\relax}%
    %
    {\ifstrequal{#1}{а}{#2=123\relax}%
    {\ifstrequal{#1}{б}{#2=124\relax}%
    {\ifstrequal{#1}{в}{#2=125\relax}%
    {\ifstrequal{#1}{г}{#2=126\relax}%
    {\ifstrequal{#1}{д}{#2=127\relax}%
    {\ifstrequal{#1}{е}{#2=128\relax}%
    {\ifstrequal{#1}{ё}{#2=129\relax}%
    {\ifstrequal{#1}{ж}{#2=130\relax}%
    {\ifstrequal{#1}{з}{#2=131\relax}%
    {\ifstrequal{#1}{и}{#2=132\relax}%
    {\ifstrequal{#1}{й}{#2=133\relax}%
    {\ifstrequal{#1}{к}{#2=134\relax}%
    {\ifstrequal{#1}{л}{#2=135\relax}%
    {\ifstrequal{#1}{м}{#2=136\relax}%
    {\ifstrequal{#1}{н}{#2=137\relax}%
    {\ifstrequal{#1}{о}{#2=138\relax}%
    {\ifstrequal{#1}{п}{#2=139\relax}%
    {\ifstrequal{#1}{р}{#2=140\relax}%
    {\ifstrequal{#1}{с}{#2=141\relax}%
    {\ifstrequal{#1}{т}{#2=142\relax}%
    {\ifstrequal{#1}{у}{#2=143\relax}%
    {\ifstrequal{#1}{ф}{#2=144\relax}%
    {\ifstrequal{#1}{х}{#2=144\relax}%
    {\ifstrequal{#1}{ц}{#2=145\relax}%
    {\ifstrequal{#1}{ч}{#2=146\relax}%
    {\ifstrequal{#1}{ш}{#2=147\relax}%
    {\ifstrequal{#1}{щ}{#2=148\relax}%
    {\ifstrequal{#1}{ь}{#2=149\relax}%
    {\ifstrequal{#1}{ы}{#2=150\relax}%
    {\ifstrequal{#1}{ъ}{#2=151\relax}%
    {\ifstrequal{#1}{э}{#2=152\relax}%
    {\ifstrequal{#1}{ю}{#2=153\relax}%
    {\ifstrequal{#1}{я}{#2=154\relax}%
    {\dtlsetdefaultUTFviiilccharcode{#1}{#2}}%
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

相关内容