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

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

https://tex.stackexchange.com/a/227862/6865解释了如何将罗马数字转换为阿拉伯数字,但在编译时

\documentclass{article}
\usepackage{etoolbox}
\xdef\test{VII}
\begin{document}
\rmntonum{VII} corresponds to \test\par
\rmntonum{\test} should not be -1!
\end{document}

其结果是:

7 corresponds to VII -1 should not be -1!

可能\rmntonum看到的\test是 而不是VII,但甚至\expandafter\rmntonum{\test}不起作用。我如何“输入”一些变量\rmntonum(或者我如何以其他方式转换它)?

答案1

\expandafter\rmntonum{\test}扩展到\rmntonum{\test}因为\expandafter适用于(顾名思义,跳过 )。你想要的是{以扩展。你可以更新以默认执行此操作:\rmntonum\expandafter\rmntonum\expandafter{\test}\test\rmntonum

7对应VII
7不应该是-1!

\documentclass{article}

\usepackage{etoolbox}

\def\test{VII}
\let\oldrmntonum\rmntonum
\renewcommand{\rmntonum}[1]{\expandafter\oldrmntonum\expandafter{#1}}

\begin{document}

\rmntonum{VII} corresponds to \test

\rmntonum{\test} should not be -1!

\end{document}

你可以节省一些按键

\let\oldrmntonum\rmntonum
\renewcommand{\rmntonum}{\expandafter\oldrmntonum\expandafter}

但它要求你明确地将参数括起来\rmntonum(而不是说\rmntonum\test)。当然,这通常不是一个坏主意。

答案2

这是将内核函数转换为用户级命令的问题,使用expl3

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\romantoarabic}{m}
 {
  \int_from_roman:f { #1 }
 }
\cs_generate_variant:Nn \int_from_roman:n { f }
\ExplSyntaxOff

\begin{document}

\romantoarabic{VII}

\newcommand{\seven}{VII}

\romantoarabic{\seven}

\end{document}

这将打印两个 7。

你甚至可以

\romantoarabic\seven

(但我不推荐它)。

如果您使用 LuaLaTeX,那么有一个更巧妙的定义:

\documentclass{article}

\usepackage{etoolbox}

\let\etoolboxrmntonum\rmntonum
\renewcommand{\rmntonum}[1]{%
  \expanded{\noexpand\etoolboxrmntonum{#1}}%
}

\newcommand\test{VII}
\newcommand\another{X\test}

\begin{document}

\rmntonum{VII} corresponds to \test

\rmntonum{\test} should not be -1!

\rmntonum\test{} should not be -1!

\rmntonum{C\another} should not be -1!

\end{document}

在此处输入图片描述

相关内容