我希望前两个在第一行分开a
。wide
\documentclass{report}
\usepackage{tikz}
\begin{document}
\newlength{\mylength}
\foreach \i in {dum,iteration} {%
\settowidth{\mylength}{wide}% this does not seem to work..
}
a\hspace{\mylength}a % .. because the length still looks zero.
\settowidth{\mylength}{wide} % but this does work..
a\hspace{\mylength}a % .. although it's the exact same line X(
\end{document}
但事实并非如此。为什么?我怎样才能\settowidth
在循环内工作?
答案1
由于我的水晶球正在维护,所以我做出了猜测。;-)
您有一个单词列表,并想将\mylength
其设置为最大宽度。
由于中的每个循环\foreach
都是在组内进行的,因此使用它是没有希望的,因为\mylength
一旦组结束就会返回到其先前的值。
这是一个完成该工作的循环。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\settolargestwidth}{mm}
{% #1 = length to set, #2 = list of words
\iagolito_settolargestwidth:Nn #1 { #2 }
}
% A function still missing from expl3
\box_new:N \l__iagolito_dim_setto_box
\cs_new_protected:Nn \__iagolito_dim_setto:NNn
{
\hbox_set:Nn \l__iagolito_dim_setto_box { #3 }
\dim_set:Nn #1 { #2\l__iagolito_dim_setto_box }
}
\cs_new_protected:Nn \iagolito_dim_settowidth:Nn
{
\__iagolito_dim_setto:NNn #1 \box_wd:N { #2 }
}
\cs_new_protected:Nn \iagolito_dim_settoheight:Nn
{
\__iagolito_dim_setto:NNn #1 \box_ht:N { #2 }
}
\cs_new_protected:Nn \iagolito_dim_settodepth:Nn
{
\__iagolito_dim_setto:NNn #1 \box_dp:N { #2 }
}
%%%
\dim_new:N \l__iagolito_tempa_dim
\dim_new:N \l__iagolito_tempb_dim
\seq_new:N \l__iagolito_temp_seq
\cs_new_protected:Nn \iagolito_settolargestwidth:Nn
{
\dim_zero:N \l__iagolito_tempa_dim
\seq_set_from_clist:Nn \l__iagolito_temp_seq { #2 }
\seq_map_inline:Nn \l__iagolito_temp_seq
{
\iagolito_dim_settowidth:Nn \l__iagolito_tempb_dim { ##1 }
\dim_set:Nn \l__iagolito_tempa_dim
{
\dim_max:nn { \l__iagolito_tempa_dim } { \l__iagolito_tempb_dim }
}
}
\dim_set:Nn #1 { \l__iagolito_tempa_dim }
}
\ExplSyntaxOff
\newlength{\mylength}
\begin{document}
\settolargestwidth{\mylength}{a,bbb,cc}
xbbby
x\hspace{\mylength}y
\end{document}