为什么 \setlength 在表格环境中无效?

为什么 \setlength 在表格环境中无效?

为什么\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}

虽然前两个点对齐得很好,但第三个点却不同,并且表现得好像\locallength0pt。这是为什么?我该怎么办?我想在环境\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...}但是起作用了。

相关内容