为什么将盒子维度附加到序列(在循环中)会使该序列仅包含最后一个维度的重复项?

为什么将盒子维度附加到序列(在循环中)会使该序列仅包含最后一个维度的重复项?

循环步骤从 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.pdfl3styleguide.pdf这里(的开始界面3.pdf一开始读起来也很有用,但我想你已经看过它了)。

相关内容