给定一逗号分隔列表,然后找出该列表里面“长度”最大的一项,比如给定:
\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}
然后使用第二步的操作,完全能够成功编译并排序,我不知道这第一步和第二步之间出了什么问题,需要怎样修改代码,望大佬解惑。
\.._put_left:Nn
,\.._put_right:Nn
等命令时,要注意先清空变量;\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
,而
要把长度保存到 \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: }
}
谢谢雾月大佬,也算是明白为啥没弄对了,你解释的很清楚。今天好不容易想出一个可以实现问题所述功能的方法,理论上觉得没错,结果就是差那么一点,卡死在那(最怕的就是一个合理的理论操作与实际操作不符,还找不到原因),难受一天,要不是你给解答了,今晚估计都睡不着觉。现在看来,主要犯了这样几个错误:
\l_tmpb_clist
,然后在.pdf文件显示{11.5632pt,34.68959pt,23.12639pt}
,就误以为\l_tmpb_clist
里存的就是这一串尺寸所表示的逗号列表,后来测试了半天也意识到里面存多了东西,至此都没意识到可以用\clist_show:N
来查看变量里的具体内容,没想到这么简单就能“诊断病情”\l_tmpb_clist
里有不该出现的东西后,把\hcoffin_set:Nn \l_tmpa_coffin {#1}
提到了外面,但得到的结果是{23.12639pt,23.12639pt,23.12639pt}
,直接一脸懵,不应该啊,陷入严重的自我怀疑。没想到是因为没有展开,需把n
换为x
,大佬您改的太妙了!再次感谢雾月大佬!!!好人一生平安!!!