使用 Tengwar 字体进行页码编号

使用 Tengwar 字体进行页码编号

将 JRR Tolkien 开发的类型系统与 TeX 及其扩展结合使用虽然有些棘手,但并非不可能。一个解决方案是使用包tengwarscript。现在,书写系统的有趣之处在于,对应的数字系统不是十进制,而是十二进制。

我想知道是否有人尝试过自动将页数转换为相应的字符。不幸的是,我目前对 TeX 的了解不足以实现这样的事情。有人能帮我吗?

答案1

我并不完全确定,但据我所知,Tengwar 不仅使用以 12 为基数的数字系统,而且还将最低有效数字放在左边。

以下代码创建一个用户宏\tengwarnumeral,用于将数字转换为其对应的 Tengwar 字符。它首先将数字转换为表示 Tengwar 数字的个位数的序列(其中数字的顺序已经翻转),然后使用该包用正确的字形替换此序列中的字符串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 代码点,如果最新编码提案将被接受):

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

相关内容