如何将罗马数字转换为阿拉伯数字

如何将罗马数字转换为阿拉伯数字

我知道有一个命令 \romannumeral 可以将数字转换为罗马数字

\romannumeral3 

给出 iii

有没有类似

\arabicnumeral{x}

那应该产生 10 吗?

答案1

etoolbox包有一个\rmntonum命令:

\documentclass[12pt]{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{etoolbox}

\begin{document}

\rmntonum{MMXV}

\rmntonum{mmxvi}

\rmntonum{mMxViI}

\end{document} 

在此处输入图片描述

答案2

应该有一个“经典”的包,但expl3包含开箱即用的功能;这只是定义一个接口的问题。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\arabicnumeral}{m}
 {
  \int_from_roman:n { #1 }
 }
\ExplSyntaxOff

\begin{document}

\arabicnumeral{x}

\arabicnumeral{MMXV}

\end{document}

在此处输入图片描述

答案3

下面是一个在 TeX 原始级别执行此操作的示例。\romantonum宏在此处使用 usage 定义\romantonum{mmcdvii}。这将打印 2407。

\newcount\tmpnum
\def\romantonum#1{\tmpnum=0
   \lowercase\expandafter{\expandafter\romantonumA#1\end{}}\the\tmpnum}
\def\romantonumA#1{\ifx#1\end\else
   \ifx#1m\advance\tmpnum by1000 \let\next=\romantonumA
   \else \def\next{\romantonumB#1}%
   \fi \expandafter\next \fi
}
\def\romandef#1#2#3#4#5#6{%
   \def#1##1##2{\ifx##1\end\else
      \ifx##1#6\ifx##2#4\advance\tmpnum by9#3 \let\next=#1%
               \else \ifx##2#5\advance\tmpnum by4#3 \let\next=#1%
                     \else \advance\tmpnum by1#3 \def\next{#1##2}%
               \fi   \fi
      \else    \ifx##1#5\advance\tmpnum by5#3 \def\next{#1##2}%
               \else \def\next{#2##1##2}%
      \fi      \fi
      \expandafter\next \fi
}}
\romandef\romantonumB\romantonumC{00}mdc
\romandef\romantonumC\romantonumD{0}clx 
\romandef\romantonumD\romantonumE{}xvi 
\def\romantonumE#1\end{\errmessage{romantonum: something wrong}}

\romantonum{mmcmlvii}
\romantonum{MMXV}

\end

相关内容