给定一逗号分隔列表,然后找出该列表里面“长度”最大的一项,比如给定:
\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,大佬您改的太妙了!再次感谢雾月大佬!!!好人一生平安!!!