我有一个 格拉哥里字母字体(Epistula Croatica),字母与数字对应,并编程了一些连字符。我不想在这里描述格拉哥里数字系统的性质,而是介绍我想要实现的目标(字体的许可证不允许我修改它)。我正在尝试寻找一种解决方案,使我能够在页码、枚举环境和文本中使用自定义数字系统。
我需要的只是阿拉伯数字的不同表示形式,如下例所示:
- 1 至 9 — 无变化
- 11 — 10 1
- 19 — 10 9
- 25 — 20 5
- 347 — 300 40 7
- 901 — 900 1
- 50681 — 50000 600 80 1 等
我希望在数字之间有一个 \textcompwordmark
。
我将非常感激您对以下问题的任何回答:
- 是否可以定义一个数字系统,使用方式为罗马字母、阿拉伯字母、字母、fnsymbol?我使用
LuaLaTeX
这个解决方案可以是 Lua 代码。 - 如果是,如何在页码或枚举环境中使用它?
- 是否可能有类似于的文本模式命令
\mynumerals{123}
?
先感谢您。
答案1
以下是使用expl3
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\glagonumeral}{m}{\glago_numeral:n { \int_eval:n { #1 } } }
\seq_new:N \l_glago_digits_seq
\int_new:N \l_glago_position_int
\cs_new_protected:Npn \glago_numeral:n #1
{
\cs_set:Npn \glago_reverse_ten: { }
\seq_set_split:Nnx \l_glago_digits_seq { } { #1 }
\int_set:Nn \l_glago_position_int {\seq_length:N \l_glago_digits_seq - 1 }
\seq_map_inline:Nn \l_glago_digits_seq
{
\glago_symbol:x { \glago_make_digit:nn { ##1 } { \l_glago_position_int } }
\int_decr:N \l_glago_position_int
}
\glago_reverse_ten:
}
\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
\cs_new:Npn \glago_make_digit:nn #1 #2
{
#1 \prg_replicate:nn { \l_glago_position_int } { 0 }
}
\cs_new:Npn \glago_symbol:n #1
{
\int_compare:nTF { #1 == 10 }
{
\cs_set:Npx \glago_reverse_ten: { \prop_get:Nn \g_glago_numerals_prop { #1 } }
}
{
\prop_get:Nn \g_glago_numerals_prop { #1 }
}
}
\cs_generate_variant:Nn \glago_symbol:n {x}
\prop_new:N \g_glago_numerals_prop
\prop_put:Nnn \g_glago_numerals_prop {0}{\textcompwordmark}
\prop_put:Nnn \g_glago_numerals_prop {1}{A}
\prop_put:Nnn \g_glago_numerals_prop {2}{B}
\prop_put:Nnn \g_glago_numerals_prop {3}{C}
\prop_put:Nnn \g_glago_numerals_prop {4}{D}
\prop_put:Nnn \g_glago_numerals_prop {5}{E}
\prop_put:Nnn \g_glago_numerals_prop {6}{F}
\prop_put:Nnn \g_glago_numerals_prop {7}{G}
\prop_put:Nnn \g_glago_numerals_prop {8}{H}
\prop_put:Nnn \g_glago_numerals_prop {9}{I}
\prop_put:Nnn \g_glago_numerals_prop {00}{\textcompwordmark}
\prop_put:Nnn \g_glago_numerals_prop {10}{J}
\prop_put:Nnn \g_glago_numerals_prop {20}{K}
\prop_put:Nnn \g_glago_numerals_prop {30}{L}
\prop_put:Nnn \g_glago_numerals_prop {40}{M}
\prop_put:Nnn \g_glago_numerals_prop {50}{N}
\prop_put:Nnn \g_glago_numerals_prop {60}{O}
\prop_put:Nnn \g_glago_numerals_prop {70}{P}
\prop_put:Nnn \g_glago_numerals_prop {80}{Q}
\prop_put:Nnn \g_glago_numerals_prop {90}{R}
\prop_put:Nnn \g_glago_numerals_prop {000}{\textcompwordmark}
\prop_put:Nnn \g_glago_numerals_prop {100}{S}
\prop_put:Nnn \g_glago_numerals_prop {200}{T}
\prop_put:Nnn \g_glago_numerals_prop {300}{U}
\prop_put:Nnn \g_glago_numerals_prop {400}{V}
\prop_put:Nnn \g_glago_numerals_prop {500}{W}
\prop_put:Nnn \g_glago_numerals_prop {600}{X}
\prop_put:Nnn \g_glago_numerals_prop {700}{Y}
\prop_put:Nnn \g_glago_numerals_prop {800}{Z}
\prop_put:Nnn \g_glago_numerals_prop {900}{@}
\ExplSyntaxOff
\newcommand{\glagovalue}[1]{\glagonumeral{\number\value{#1}}}
\renewcommand{\thesection}{\glagovalue{section}}
\begin{document}
\tableofcontents
\section{A section}
\setcounter{section}{100}
\section{Another}
\glagonumeral{909}
\glagonumeral{1} --
\glagonumeral{2} --
\glagonumeral{3} --
\glagonumeral{4} --
\glagonumeral{5} --
\glagonumeral{6} --
\glagonumeral{7} --
\glagonumeral{8} --
\glagonumeral{9} --
\glagonumeral{10} --
\glagonumeral{11} --
\glagonumeral{12} --
\glagonumeral{13} --
\glagonumeral{14} --
\glagonumeral{15} --
\glagonumeral{16} --
\glagonumeral{17} --
\glagonumeral{18} --
\glagonumeral{19} --
\glagonumeral{20} --
\glagonumeral{21} --
\glagonumeral{22} --
\glagonumeral{312} --
\glagonumeral{321} --
\glagonumeral{322}
\end{document}
您现在要做的是将我用来表示数字的字母更改为合适的命令,并给出适当的格拉哥里字母。
您可以\glagovalue{<counter>}
像 一样使用\arabic{<counter>}
。
注意:此版本正确将 12 设置为“AJ”,而 21 设置为“KA”。
重要变更
由于expl3
2012 年夏季对 进行了更改,\seq_length:N
应替换为\seq_count:N
\cs_new_protected:Npn \glago_numeral:n #1
{
\cs_set:Npn \glago_reverse_ten: { }
\seq_set_split:Nnx \l_glago_digits_seq { } { #1 }
\int_set:Nn \l_glago_position_int {\seq_count:N \l_glago_digits_seq - 1}
\seq_map_inline:Nn \l_glago_digits_seq
{
\glago_symbol:x { \glago_make_digit:nn { ##1 } { \l_glago_position_int } }
\int_decr:N \l_glago_position_int
}
\glago_reverse_ten:
}
答案2
一个半生不熟的 LuaTeX 解决方案。我不知道定义页面计数器所需的 LaTeX 内容,但这个 Lua 函数会根据需要打印一个字符串。也许有人可以编辑此代码以使其与 LaTeX 计数器配合使用。
编辑:考虑 10 到 20 之间的反向编号。
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
glagolitic = function(cnt)
local glag_reverse = {}
local i = 0
local m
while cnt > 0 do
m = cnt % 10
cnt = cnt - m
glag_reverse[#glag_reverse + 1] = string.rep("0",i) .. m
cnt = cnt / 10
i = i + 1
end
if glag_reverse[2] == "01" then
glag_reverse[1], glag_reverse[2] = glag_reverse[2], glag_reverse[1]
end
-- insert \textcompwordmark between elements and reverse the string
tex.sprint(string.reverse(table.concat(glag_reverse,"kramdrowpmoctxet\\")))
end
\end{luacode*}
% (here we need to define some macros that use the function glagolitic)
\begin{document}
% prints: 310 203 100203 400506 500710 ...
\directlua{glagolitic(13)}
\directlua{glagolitic(23)}
\directlua{glagolitic(123)}
\directlua{glagolitic(456)}
\directlua{glagolitic(517)}
...
\end{document}