
Использование системы типов, разработанной Дж. Р. Р. Толкиеном, с TeX и его расширениями — сложная, но возможная задача. Одним из решений является пакет tengwarscript
. Самое интересное в системе письма — то, что соответствующая система счисления имеет основание не 10, а 12.
Интересно, пробовал ли кто-нибудь автоматически преобразовывать количество страниц в соответствующие символы. К сожалению, мои текущие знания о TeX недостаточны для реализации чего-то подобного. Может ли кто-нибудь мне помочь?
решение1
Я не совсем уверен, но, насколько я понимаю, тенгвар не только использует систему счисления с основанием 12, но и размещает наименее значимую цифру слева.
Следующий код создает пользовательский макрос \tengwarnumeral
, который преобразует число в его аналог в тенгваре. Он делает это, сначала преобразуя число в последовательность, которая представляет собой отдельные цифры числа в тенгваре (где порядок цифр уже перевернут), а затем заменяя строки в этой последовательности правильным глифом с помощью пакета tengwarscript
.
\documentclass{article}
\pdfmapfile{=tengwarscript.map}
\usepackage[annatar]{tengwarscript}
\ExplSyntaxOn
\int_new:N \l_tengwarnumeral_tempa_int
\int_new:N \l_tengwarnumeral_tempb_int
\seq_new:N \l_tengwarnumeral_tengwardigits_seq
\NewDocumentCommand { \tengwarnumeral } { m } {
\seq_clear:N \l_tengwarnumeral_tengwardigits_seq
\int_set:Nn \l_tengwarnumeral_tempa_int { #1 }
\int_do_until:nn { \l_tengwarnumeral_tempa_int <= 0 } {
\int_set:Nn \l_tengwarnumeral_tempb_int { \int_mod:nn { \l_tengwarnumeral_tempa_int } { 12 } }
\int_compare:nNnTF \l_tengwarnumeral_tempb_int = { 0 } {
\int_sub:Nn \l_tengwarnumeral_tempa_int { 12 }
} {
\int_sub:Nn \l_tengwarnumeral_tempa_int { \l_tengwarnumeral_tempb_int }
}
\int_set:Nn \l_tengwarnumeral_tempa_int { \int_div_truncate:nn \l_tengwarnumeral_tempa_int { 12 } }
\seq_put_right:Nx \l_tengwarnumeral_tengwardigits_seq { \int_use:N \l_tengwarnumeral_tempb_int }
}
\seq_map_inline:Nn \l_tengwarnumeral_tengwardigits_seq {
\str_case:nn { ##1 } {
{ 0 } { \Tzero }
{ 1 } { \Tone }
{ 2 } { \Ttwo }
{ 3 } { \Tthree }
{ 4 } { \Tfour }
{ 5 } { \Tfive }
{ 6 } { \Tsix }
{ 7 } { \Tseven }
{ 8 } { \Teight }
{ 9 } { \Tnine }
{ 10 } { \Tten }
{ 11 } { \Televen }
}
}
}
\ExplSyntaxOff
\begin{document}
\tengwarnumeral{3}
% is 12 + 3, so should be: 3 1
\tengwarnumeral{15}
% is 1728 + 144 + 120 + 3, so should be: 3 10 1 1
\tengwarnumeral{1995}
\end{document}
Если вы хотите использовать шрифты с поддержкой Unicode fontspec
, например Tengwar Telcontar, вы можете настроить вторую часть макроса, где происходит преобразование, следующим образом (я также добавил кодовые точки Unicode, которым будут назначены цифры Tengwar, еслипоследнее предложение по кодированиюбудет принято):
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\tengwarfont{tengtelc.ttf}
\ExplSyntaxOn
\int_new:N \l_tengwarnumeral_tempa_int
\int_new:N \l_tengwarnumeral_tempb_int
\seq_new:N \l_tengwarnumeral_tengwardigits_seq
\NewDocumentCommand { \tengwarnumeral } { m } {
\seq_clear:N \l_tengwarnumeral_tengwardigits_seq
\int_set:Nn \l_tengwarnumeral_tempa_int { #1 }
\int_do_until:nn { \l_tengwarnumeral_tempa_int <= 0 } {
\int_set:Nn \l_tengwarnumeral_tempb_int { \int_mod:nn { \l_tengwarnumeral_tempa_int } { 12 } }
\int_compare:nNnTF \l_tengwarnumeral_tempb_int = { 0 } {
\int_sub:Nn \l_tengwarnumeral_tempa_int { 12 }
} {
\int_sub:Nn \l_tengwarnumeral_tempa_int { \l_tengwarnumeral_tempb_int }
}
\int_set:Nn \l_tengwarnumeral_tempa_int { \int_div_truncate:nn \l_tengwarnumeral_tempa_int { 12 } }
\seq_put_right:Nx \l_tengwarnumeral_tengwardigits_seq { \int_use:N \l_tengwarnumeral_tempb_int }
}
\group_begin:
\tengwarfont
\seq_map_inline:Nn \l_tengwarnumeral_tengwardigits_seq {
\str_case:nn { ##1 } {
{ 0 } { \char"E070 } % \char"160B0
{ 1 } { \char"E071 } % \char"160B3
{ 2 } { \char"E072 } % \char"160E2
{ 3 } { \char"E073 } % \char"160E3
{ 4 } { \char"E074 } % \char"160E4
{ 5 } { \char"E075 } % \char"160E5
{ 6 } { \char"E076 } % \char"160E6
{ 7 } { \char"E077 } % \char"160E7
{ 8 } { \char"E078 } % \char"160E8
{ 9 } { \char"E079 } % \char"160E9
{ 10 } { \char"E07A } % \char"160EA
{ 11 } { \char"E07B } % \char"160EB
}
}
\group_end:
}
\ExplSyntaxOff
\begin{document}
\tengwarnumeral{3}
% is 12 + 3, so should be: 3 1
\tengwarnumeral{15}
% is 1728 + 144 + 120 + 3, so should be: 3 10 1 1
\tengwarnumeral{1995}
\end{document}