20 逗号列表中元素按其所占空间长度排序的问题

发布于 2023-07-22 16:47:14

问题需求:

给定一逗号分隔列表,然后找出该列表里面“长度”最大的一项,比如给定:

\clist_set:Nn \l_tmpa_clist {ha, hahaha, haha}

此处最长的元素自然是hahaha,想通过编程找出它,然后计算它所占的长度。

尝试实现方法:

第一步:
首先将各元素所占据的“长度”转化为一组逗号分隔列表:

\clist_map_inline:Nn \l_tmpa_clist
  {
    \clist_put_right:Nn \l_tmpb_clist
      {
        \hcoffin_set:Nn \l_tmpa_coffin {#}
        \dim_use:N \coffin_wd:N \l_tmpa_coffin
      }
  }

如此得到的\l_tmpb_clist为:{11.5632pt,34.68959pt,23.12639pt}
第二步:
然后将“长度”组成的逗号分隔列表进行排序:

\clist_sort:Nn \l_tmpb_clist
  {
    \dim_compare:nNn {#1}>{#2}
      {\sort_return_same:}
      {\sort_return_swapped:}
  }

预想中得到的\l_tmpb_clist中各元素的排序为:{34.68959pt,23.12639pt,11.5632pt},但后取第一个元素就得到了长度最大值。但发生报错,无法编译。
倘若我直接设置\l_tmpb_clist为:{11.5632pt,34.68959pt,23.12639pt},即

\clist_set:Nn \l_tmpb_clist {11.5632pt,34.68959pt,23.12639pt}

然后使用第二步的操作,完全能够成功编译并排序,我不知道这第一步和第二步之间出了什么问题,需要怎样修改代码,望大佬解惑。

查看更多

关注者
0
被浏览
396
雾月
雾月 2023-07-22
这家伙很懒,什么也没写!
  1. 使用临时变量时,特别是需要用到 \.._put_left:Nn\.._put_right:Nn 等命令时,要注意先清空变量;
  2. 使用 \dim_compare:nNn.. 时,第 1、3 个参数必须是具体的长度(或长度表达式);
如此得到的 \l_tmpb_clist 为:{11.5632pt,34.68959pt,23.12639pt}

本例中,在使用 \clist_sort:Nn 之前,你可以用 \clist_show:N \l_tmpb_clist 看看是不是你想的那个结果:

\clist_set:Nn \l_tmpa_clist { ha, hahaha, haha }

\clist_clear:N \l_tmpb_clist
\clist_map_inline:Nn \l_tmpa_clist
  {
    \clist_put_right:Nn \l_tmpb_clist
      {
        \hcoffin_set:Nn \l_tmpa_coffin {#1}
        \dim_use:N \coffin_wd:N \l_tmpa_coffin
      }
  }
\clist_show:N \l_tmpb_clist

为什么结果不是 {11.5632pt,34.68959pt,23.12639pt} 而是

The comma list \l_tmpb_clist contains the items (without outer braces):
>  {\hcoffin_set:Nn \l_tmpa_coffin {ha}\dim_use:N \coffin_wd:N \l_tmpa_coffin}
>  {\hcoffin_set:Nn \l_tmpa_coffin {hahaha}\dim_use:N \coffin_wd:N \l_tmpa_coffin }
>  {\hcoffin_set:Nn \l_tmpa_coffin {haha}\dim_use:N \coffin_wd:N \l_tmpa_coffin }

因为你用的是 \clist_put_right:Nn,而
image.png
要把长度保存到 \l_tmpb_clist 里,而不是 \hcoffin_se...,可以这样:

\clist_set:Nn \l_tmpa_clist { ha, hahaha, haha }

\clist_clear:N \l_tmpb_clist
\clist_map_inline:Nn \l_tmpa_clist
  {
    \hcoffin_set:Nn \l_tmpa_coffin {#1}
    \clist_put_right:Nx \l_tmpb_clist
      { \dim_use:N \coffin_wd:N \l_tmpa_coffin }
  }

\clist_sort:Nn \l_tmpb_clist
  {
    \dim_compare:nNnTF {#1} > {#2}
      { \sort_return_same:    }
      { \sort_return_swapped: }
  }
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览