将数字字符串转换为罗马数字

将数字字符串转换为罗马数字

我有一个由阿拉伯数字组成的(子)字符串(不是计数器)。有没有简单的方法可以将此字符串转换为罗马数字?我想我可以建立一个数组,但我认为这很快就会变得令人厌烦。我正在使用LuaLaTeX,所以一两行 Lua 代码也可以。

\documentclass{article}
\def\myString{9}

\begin{document}

How can I have \myString read "IX" instead of 9?

\end{document}

答案1

如果要将的含义更改\myString为罗马数字表示:

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\makeRoman}{om}
 {% #1 = optional control sequence
  % #2 = something that expands to a positive integer
  \IfNoValueTF{#1}
   {
    \tl_set:Nx #2 { \int_to_Roman:n { #2 } }
   }
   {
    \tl_clear_new:N #1
    \tl_set:Nx #1 { \int_to_Roman:n { #2 } }
   }
 }
\ExplSyntaxOff

\def\myString{9}

\makeRoman{\myString}

\makeRoman[\newString]{7*5-4}

\begin{document}

How can I have \myString\ read "IX" instead of 9?

Also \newString\  works.

\end{document}

在此处输入图片描述

如果您只想打印扩展为罗马数字正整数的内容:

\documentclass{article}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\printRoman}{m}
 {
  \int_to_Roman:n { #1 }
 }
\ExplSyntaxOff

\def\myString{9}

\begin{document}

It works, see? Here \printRoman{\myString} works.

\end{document}

在此处输入图片描述

可能可以\MakeUppercase{\romannumeral\myString},但是它不可扩展,因此只适用于打印数字,而不能将罗马数字表示形式提供给其他东西。

答案2

使用包modroman

\documentclass{article}
\usepackage{modroman}

\begin{document}

How can I have \nbRoman{9} read "IX" instead of 9?

\end{document}

结果

答案3

这里有两种方法(第一种方法与Ulrike Fischer 的评论):

\documentclass{article}
\newcommand\myNine{9}

\begin{document}

\MakeUppercase{\romannumeral \myNine\space}~plus
\ExplSyntaxOn
\int_to_Roman:n { \myNine } \nobreakspace
equals \nobreakspace
\int_to_Roman:n { \myNine + \myNine }.
\ExplSyntaxOff

\end{document}

在此处输入图片描述

后缀\space扩展\romannumeral \myNine为一个空格标记,该标记完成了 ⟨number⟩。\romannumeral是一个读取 ⟨number⟩ 的 TeX 原语,当使用代表数字的字符标记指定数字时,⟨number⟩ 在其语法规则中具有 ⟨一个可选空格⟩;可选空格标记是 ⟨number⟩ 的一部分,并告诉 TeX 此时数字已完成。使用 \int_to_Roman:n(它接受expl3⟨integer expression⟩ 作为普通的,即带括号的参数)时,这些预防措施不是必需的。

答案4

\romannumeral和调用的组合\directlua

在此处输入图片描述

\documentclass{article}
\newcommand\myString{9}
\newcommand\IngmarRomanNumeral[1]{%
   \directlua{tex.sprint(string.upper('\romannumeral #1'))}}
   
\begin{document}
\romannumeral5, \romannumeral\myString

\IngmarRomanNumeral{5}, \IngmarRomanNumeral{\myString}
\end{document} 

相关内容