使用 Tengwar 字型進行頁碼編號

使用 Tengwar 字型進行頁碼編號

將 JRR Tolkien 開發的類型系統與 TeX 及其擴充功能一起使用雖然很棘手,但也是可能的。一種解決方案是包tengwarscript。現在關於書寫系統的有趣之處在於,對應的數字系統不是以 10 為基數,而是以 12 為基數。

不知道有沒有人嘗試過自動將頁數轉換成對應的字元。不幸的是,我目前對 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}

相關內容