循环步骤从 1 到 9。每一步都将循环的当前索引数字放入一个框中并提取数字的宽度。然后将宽度作为维度值附加到序列中。虽然序列末尾包含 9 个值,但奇怪的是,它们都是数字 9 的维度(宽度)。序列的所有值在每一步都会被覆盖到新维度。也许你可以找出问题的核心。
\documentclass[varwidth=100mm]{standalone}
\usepackage{expl3}
\usepackage{fontspec}
\setmainfont{Impact}
\begin{document}
\ExplSyntaxOn
\seq_new:N\mySeq
\box_new:N\myBox
\int_step_inline:nn{9}
{ \hbox_set:Nn\myBox{#1}
% display dimension before adding it to sequence
#1=\dim_eval:n{\box_wd:N\myBox}\\ % output
% add dimension to sequence
\seq_put_right:Nn\mySeq
{\dim_eval:n{\box_wd:N\myBox}}
% display current contents of the sequence
\seq_use:Nn\mySeq{_}\\\\
}
% display all dimensions (contains only duplicates of last dimension)
\seq_use:Nn\mySeq{,~}
\ExplSyntaxOff
\end{document}
答案1
您需要扩展该值:使用
\seq_put_right:Nx
反而。
有什么问题?如果你
\hbox_set:Nn \l_tmpa_box { A }
\seq_put_right:Nn \l_tmpa_seq { \dim_eval:n { \box_wd:N \l_tmpa_box } }
\hbox_set:Nn \l_tmpa_box { AA }
\seq_put_right:Nn \l_tmpa_seq { \dim_eval:n { \box_wd:N \l_tmpa_box } }
这导致序列包含以下项目(没有外部括号,因为它将通过 显示\seq_show:N \l_tmpa_seq
)
{ \dim_eval:n { \box_wd:N \l_tmpa_box } }
{ \dim_eval:n { \box_wd:N \l_tmpa_box } }
当使用序列时,\l_tmpa_box
将使用当前内容的宽度:分配时的值具有绝不被提及。
而\seq_put_right:Nx
你却得到了价值冻结在执行任务时。
使用
\exp_args:NNx \seq_put_right:Nn \l_tmpa_tl {...}
不。使用(或在需要时定义)变体是更好的风格。
答案2
当你这样做时:
\seq_put_right:Nn \mySeq { \dim_eval:n{ \box_wd:N \myBox } }
您要附加到序列中的是标记列表\dim_eval:n{\box_wd:N\myBox}
(标记是\dim_eval:n
,{
类别代码为 1,,\box_wd:N
和\myBox
类别}
代码为 2)。最终\dim_eval:n
将评估为时已晚,一旦循环完全执行,你就会执行\seq_use:Nn \mySeq {,~}
。此时,\myBox
包含数字9
,因此你看到了。作为 egreg说(比我快),替换\seq_put_right:Nn
为\seq_put_right:Nx
评估\dim_eval:n
里面循环时,\myBox
仍然包含相关数字。
您必须意识到您的序列变量\mySeq
根本不包含任何长度:它包含n 次相同的 token 列表,我在上面已经明确说明过,首先 n=0,然后 n=1,...,最后 n=9。换句话说,它包含n 次相同的“公式”,以标记列表的形式存储。此公式相当于一个变量的函数,即框变量\myBox
。每当您使用时\seq_use:Nn \mySeq {...}
,都会将相同公式的 n 个副本放入输入流中(其中 n 是 的当前长度\mySeq
),并且当 TeX 扩展其中一个标记并处理由此扩展产生的所有标记时,这将根据公式和此时\dim_eval:n
的内容产生一个长度(准确地说:一个 〈dimen〉) 。\myBox
因此,在示例的最后,您的代码计算了 n=9 乘以相同的公式,相同的值的\myBox
,\hbox
包含图形的9
。用非常明确的术语来说,你的最终\seq_use:Nn
调用相当于:
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox } ,~
\dim_eval:n { \box_wd:N \myBox }
使用相同的函数 f 和相同的 x 值计算 9 次 f(x) 会得出 9 次相同的结果,因此这就是您得到的输出。
对于\seq_use:Nn
循环内的调用,这完全相同,只是 n 被替换为 1 到 8 之间的数字(包括 1 和 8)。
注意:正如人们已经告诉你的那样,你的变量不遵守 LaTeX3 编码指南。阅读expl3.pdf和l3styleguide.pdf从这里(的开始界面3.pdf一开始读起来也很有用,但我想你已经看过它了)。