我有一个由阿拉伯数字组成的(子)字符串(不是计数器)。有没有简单的方法可以将此字符串转换为罗马数字?我想我可以建立一个数组,但我认为这很快就会变得令人厌烦。我正在使用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
答案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⟩ 作为普通的,即带括号的参数)时,这些预防措施不是必需的。