正如解释的那样interface3
\int_to_roman:n {<integer expression>}
将 的值
<integer expression>
作为罗马数字(小写 (\int_to_roman:n
) 或大写\int_to_Roman:n
)放置在输入流中。罗马数字是类别代码为 11(字母)的字母。
但是,我怎样才能将函数值放入某个变量中,比如\l_here_str
不在流中(如果我正确理解流的意思是“输出到LaTeX
文档”)?
也许更普遍的问题是指传统编程语言的行为,其中函数值可以分配给变量:它是如何实现的expl3
?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \int_from_roman:n {V}
\cs_generate_variant:Nn \int_to_roman:n {V}
\NewDocumentCommand{\CharCount}{ m }
{ \tl_set:Nn \l_roman_tl {#1}
\int_to_roman:V \l_roman_tl % How to assign mmciv to some variable, say \l_here_str
}
\ExplSyntaxOff
\begin{document}
\noindent\CharCount{2104}
\end{document}
答案1
最终expl3
是用 TeX 编写的,因此保留了宏扩展语言的基本特性。在这里,如果你想存储结果函数的输入,而不是强制求值所需的确切输入。这通常通过所谓的x
-type 扩展来完成
\tl_set:Nn \l_tmpa_tl { \int_to_roman:n {#1} } % _Exactly_ "\int_to_roman:n {#1}"
\tl_set:Nx \l_tmpa_tl { \int_to_roman:n {#1} } % Result of \int_to_roman:n
这将适用于任何可扩展函数(标有星号的函数interface3
)。
如果你在这里生成一个整数,你可能会使用一个int
变量。这些只能保存整数所以自动地评估它们的参数以得出一个。例如,对于反向转换:
\int_set:Nn \l_tmpa_int { \int_from_roman:n {#1} }
如果您有“经典”编程背景,请注意:str
类型在 TeX 中相当专业,并且tl
使用更为广泛。TeX 将“类别代码”与每个标记相关联,这会影响解释。大多数时候您希望保留该含义,因此 atl
是可行的方法。(str
类型是 的一种特殊情况,tl
其中所有字符都是“其他”,除了空格是“空格”。)