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