数学模式下的玛雅数字

数学模式下的玛雅数字

如何在数学模式下使用“BabelStone Mayan Numerals”字体中的玛雅数字和 LuaLaTeX?

答案1

经过完全转换,因此无需计算。

\documentclass{article}
\usepackage{amsmath}
\usepackage{fontspec}

\newfontface{\mayanumerals}{BabelStoneMayanNumerals}[
  Path=./,
  Extension=.ttf,
]

\ExplSyntaxOn

\NewDocumentCommand{\mayanumber}{sO{}m}
 {
  \IfBooleanTF { #1 }
   {
    \ensuremath { \mathrm { \tl_upper_case:n { \int_to_base:nn { #3 } { 20 } }\sb{20} } }
   }
   {
    \tatojo_maya_number:nn { #2 } { #3 }
   }
 }

\int_const:Nn \c__tatojo_maya_start_int { "1D2E0 }
\tl_new:N \l__tatojo_maya_converted_tl
\seq_new:N \l__tatojo_maya_digits_seq

\keys_define:nn { tatojo/maya }
 {
  align      .tl_set:N = \l__tatojo_maya_align_tl,
  align      .initial:n = c,
  horizontal .bool_set:N = \l__tatojo_maya_horizontal_bool,
  horizontal .default:n = true,
  vertical   .bool_set_inverse:N = \l__tatojo_maya_horizontal_bool,
  vertical   .default:n = true,
  scale      .code:n =
   {
    \fp_compare:nT { #1 != 1 } { \addfontfeatures{Scale=#1} }
   }
 }

\cs_new_protected:Nn \tatojo_maya_number:nn
 {
  \mbox
   {
    % choose the font and set spacing to 0.5
    \mayanumerals
    % evaluate options
    \keys_set:nn { tatojo/maya } { #1 }
    % clear the sequence containing the digits
    \seq_clear:N \l__tatojo_maya_digits_seq
    % convert the input to base 20
    \tl_set:Nx \l__tatojo_maya_converted_tl
     {
      \int_to_base:nn { #2 } { 20 }
     }
    % fill the digit sequence
    \tl_map_function:NN \l__tatojo_maya_converted_tl \__tatojo_maya_adddigit:n
    % print the digit sequence
    \bool_if:NTF \l__tatojo_maya_horizontal_bool
     {
      \seq_use:Nn \l__tatojo_maya_digits_seq { }
     }
     {
      \begin{tabular}[\l__tatojo_maya_align_tl]{@{}c@{}}
      \shortstack[c]{ \seq_use:Nn \l__tatojo_maya_digits_seq { \\ } }
      \end{tabular}
     }
   } % close the \mbox
 }

\cs_new:Nn \__tatojo_maya_adddigit:n
 {
  \seq_put_right:Nx \l__tatojo_maya_digits_seq
   {
    \tatojo_maya_digit:n { \int_from_base:nn { #1 } { 20 } }
   }
 }

\cs_new_protected:Nn \tatojo_maya_digit:n
 {
  \symbol { \int_eval:n { \c__tatojo_maya_start_int + #1 } }
 }

\ExplSyntaxOff

\begin{document}

$\mayanumber*{12414}=\mayanumber{12414}$\qquad
$\mayanumber[align=b]{12414}$\qquad
$\mayanumber[scale=0.5]{12414}$

\bigskip

\mayanumber*{123456} is \mayanumber[horizontal]{123456}

\end{document}

如果系统已安装字体(可能还包括名称),请删除Path和选项。Extension

如您所见,只需输入一个数字\mayanumber{<number>},然后宏就会负责转换。数字被转换为 20 进制,然后每个数字又被转换回 10 进制,以便将其添加到与玛雅数字 0 相对应的起点。

*-version 仅仅是对 20 进制转换的一个包装。

可用的选项包括

  • scale用于放大或缩小字体;
  • align用于最终对齐(垂直方面);默认为c,可以是tb
  • horizontal用于水平打印(vertical默认,也可以为了清晰起见指定)

在此处输入图片描述

答案2

@egreg 的回答,

\newfontface{\babm}{BabelStone Mayan Numerals}

\DeclareRobustCommand\mcero{%
    \mathrel{\text{\normalfont\babm\symbol{"01D2E0}}}%
}

一位 MWE 表示:

\documentclass{article}
\usepackage{amsmath}
\usepackage{fontspec}

\newfontface{\babm}{BabelStone Mayan Numerals}

\DeclareRobustCommand\mcero{%
    \mathrel{\text{\normalfont\babm\symbol{"01D2E0}}}%
}
\DeclareRobustCommand\muno{%
    \mathrel{\text{\normalfont\babm\symbol{"01D2E1}}}%
}
\DeclareRobustCommand\monce{%
    \mathrel{\text{\normalfont\babm\symbol{"01D2EB}}}%
}
\DeclareRobustCommand\mcatorce{%
    \mathrel{\text{\normalfont\babm\symbol{"01D2EE}}}%
}

\begin{document}

$${1\text B0\text E}_{20} = \begin{matrix}
\huge\muno\\
\huge\monce\\
\huge\mcero\\
\huge\mcatorce
\end{matrix}
$$
\end{document}

在此处输入图片描述

相关内容