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}