为什么\setlength
在环境中无效tabular
? 以下是 MWE:
\documentclass{article}
\newlength{\globallength}
\newlength{\locallength}
\begin{document}
\setlength{\globallength}{10pt}%
\begin{tabular}{l}
\setlength{\locallength}{10pt}%
\hspace*{10pt}. \\
\hspace*{\globallength}. \\
\hspace*{\locallength}. \\
\hspace*{0pt}. \\
\end{tabular}
\end{document}
虽然前两个点对齐得很好,但第三个点却不同,并且表现得好像\locallength
是0pt
。这是为什么?我该怎么办?我想在环境\setwidth
内部使用tabular
,因此在环境外部设置长度并不是一个真正的选择。
答案1
对齐单元在隐式组内处理,因此当组结束时,对变量的本地分配将被撤消。
的核定义\setlength
是
% latex.ltx, line 2181:
\def\setlength#1#2{#1 #2\relax}
这就是为什么\global\setlength
似乎工作。另一方面,的定义\settowidth
是
% latex.ltx, line 2187:
\def\settowidth {\@settodim\wd}
并且的定义\@settodim
是
% latex.ltx, line 2183:
\def\@settodim#1#2#3{\setbox\@tempboxa\hbox{{#3}}#2#1\@tempboxa
\setbox\@tempboxa\box\voidb@x}
因此\global\settowidth{\locallength}{abc}
将成为
\global\setbox\@tempboxa\hbox{{abc}}\locallength\wd\@tempboxa\setbox\@tempboxa\box\voidb@x
这对于进行全局分配当然是无效的\locallength
。
是的,\settowidth{\global\locallength}{abc}
会起作用,但这只是偶然。
LaTeX 不支持全局维度/跳过分配,因此您应该依赖较低级别的命令。因此,更安全的方法是定义新命令:
\makeatletter
\newlength\local@length@for@global
\newcommand\gsetlength[2]{%
\setlength{\local@length@for@global}{#2}%
\global#1\local@length@for@global
}
\newcommand{\gsettowidth}[2]{%
\settowidth{\local@length@for@global}{#2}%
\global#1\local@length@for@global
}
\makeatother
\gsettoheight
如果需要的话,对于和也类似\gsettodepth
。
即使calc
加载并且不利用“本地”命令的任何特定实现,它也能起作用。
答案2
\global\setlength{\locallength}{10pt}
和似乎都\setlength{\global\locallength}{10pt}
可以工作,但我不知道为什么需要这样做。
https://tex.stackexchange.com/a/210598/30810让我尝试一下,@ChristianHupfer 的评论解释了原因。
在我的较长的文档中,\global\settowidth{...}
没有起作用;\settowidth{\global...}
但是起作用了。