请问对于下面的latex3代码:
\documentclass{article}
\usepackage[margin=2cm]{geometry}
\usepackage{amsmath}
\usepackage{ctex}
\pagestyle{empty}
\begin{document}
\ExplSyntaxOn
\int_set:Nn \l_tmpa_int {0}
实际上我们还可以尝试设置步长进行循环.\par
\int_step_inline:nnnn {30} {10} {60}{
\int_incr:N \l_tmpa_int
步长为~10~的循环之~{#1}~,这是第~\int_use:N \l_tmpa_int~个数\par
}
\int_new:N \l_loop_var
\int_step_variable:nnNn {10} {20} \l_loop_var {
这是第~\l_loop_var~个数\par
}
\ExplSyntaxOff
\end{document}
(1)代码中为什么\l_tmpa_int
需要使用\int_use:N
输出,而\l_loop_var
可以直接作为一个宏输出呢?我看下图文档均在输出流.
(2)传入参数#1
时,是否可以在其两侧加上{
,#1
与{#1}
是否有什么区别.
(3)\int_step_variable
相较于\int_step_inline
有什么其他的好处吗,是否仅仅是在内部调用时参数使用方式的不同,一者为#1
,另一者为\tl_xyz
?
(1).
\int_new:N \l_loop_var
\int_step_variable:nnNn {10} {20} \l_loop_var {
这是第~\l_loop_var~个数\par
}
其实你这里的第一行没有意义
可以看到,\int_step_variable:nnNn
需要的第三个参数需要接受一个 tl
类型 token,在循环的时候将每一次待循环的值赋给它, 他甚至不需要被定义.
在 LaTeX3 中有些变量是基于宏实现,还有一部分是基于寄存器实现,前者可以直接使用,后者则需要在前面加上 \xxx_use:
, 类似的在 TeX
中也有体现
\def\cmd{aaa}
\cmd % normally
\newcount\mycnt
\mycnt=1
\mycnt % error
\the\mycnt % normally
(2).
传入参数 #1
时 是指循环体内部的 {#1}
? 这里的 {}
可有可无.
(3).
个人感觉分场景吧, 如果你的循环在函数定义的内部, 那么循环体内部的 #
容易和函数定义中的 #
混淆, 因此循环体内部的 #
需要加倍, 如果嵌套比较深的情况下 ########1
这种东西一长串的虫子会比较恶心, 而使用 \int_step_variable
可以避免.
对于(1),从文档中我可以从哪里知道某个变量是基于宏还是寄存器实现呢?MWE中的代码是我多次尝试试出来的....;对于(2),我指的就是 “传入参数 #1 时 是指循环体内部的 {#1}” 这个意思.非常感谢!
@u70550 LaTeX3 的变量类型已经基本固定,总的来说可以分为三类,一是 TeX 寄存器(含 chardef 和 font),一是单个宏,三是多个宏或宏与寄存器。第一类有:int、dim、skip、muskip、box、bool(chardef)、intarray(除了 luatex 都是用 font)、cctab、ior 和 iow(chardef)。第二类是该变量类型只使用一个宏,有 cs、tl、str、scan、quark、clist、seq、fp、prop(非 linked prop)、regex、color(不确定),其中只有前三个可以不使用对应的 use 函数直接输出结果,其它的必须用 use 或类似的函数(clist 不是严格要求要用,但最好用)。其它的变量都是第三类,bitset、fparray、coffin、keys、linked prop、msg,还有一些 pdf object,等等。
基于单个宏的变量类型并不一定可以直接使用,比如直接用 seq、fp 等会报错。
@u10307 第二类是只需要额外定义一个宏,但他们仍然可能使用已经全局定义了的寄存器或宏。