我知道有一个命令 \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