数字的复合表示。可能吗?

数字的复合表示。可能吗?

我有一个 格拉哥里字母字体(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”。


重要变更

由于expl32012 年夏季对 进行了更改,\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}

相关内容