有没有办法限制的范围\newlength
?我在许多 TikZ 图片中使用相同的名称,但每个图片都有不同的值,并且我不希望它在图片之间继续存在,因为这不是我想要的。
答案1
以下对我有用,并使用分组来本地化长度的设置:
\documentclass{article}
\newlength{\mylen}
\begin{document}
\setlength{\mylen}{30pt}% Global definition
Here is some text. \rule{40pt}{\mylen}
\bigskip
{% <--- \begingroup
\setlength{\mylen}{20pt}% Local redefinition
Here is some text. \rule{40pt}{\mylen}
}% <--- \endgroup
\bigskip
Here is some text. \rule{40pt}{\mylen}
\end{document}
答案2
请记住,\newlength
分配一个新的(跳过)寄存器,然后可以在任何地方使用;\setlength
在本地起作用,因此其效果仅限于给定它的组或环境。
本地分配(在最常见的情况下)用处不大。对于有限的范围,可以使用从未分配的“临时”寄存器:
\dimen0 \dimen2 \dimen4 \dimen6 \dimen8 \dimen255
\dimen1 \dimen3 \dimen5 \dimen7 \dimen9
\skip0 \skip2 \skip4 \skip6 \skip8 \skip255
\skip1 \skip3 \skip5 \skip7 \skip9
\toks0 \toks2 \toks4 \toks6 \toks8 \toks255
\toks1 \toks3 \toks5 \toks7 \toks9
\box0 \box2 \box4 \box6 \box8
\box1 \box3 \box5 \box7 \box9
寄存器<type>0
也称为<type>@
(\dimen@
与 相同,依此类推\dimen0
)。之所以分成两行是因为顶行中的寄存器应始终在本地使用,而第二行中的寄存器应“全局”使用,也就是说,它们的设置应在前面\global
(这样做是为了防止“保存堆栈累积”)。
LaTeX 还分配\@tempdima
、\@tempdimb
、\@tempdimc
(尺寸寄存器);\@tempskipa
、\@tempskipb
(跳过寄存器);\@tempboxa
(盒子寄存器);\@tempcnta
、\@tempcntb
(计数寄存器)并且\count@
与 相同\count255
。
因此,在有限的范围内有足够的空间来使用寄存器,而无需分配新的寄存器。但是,临时寄存器可能会被我们在同一范围内使用的宏利用,因此需要小心谨慎。
答案3
每个都tikzpicture
可以包含不会影响其他 tikzpicture
环境的本地设置。将范围限制在单个范围内的方法 tikzpicture
是使用\begin{scope} ... \end{scope}
。
为了说明这一点,请考虑:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newlength{\mylen}
\setlength{\mylen}{1cm}% global definition
% y-coordinate can be ignored, only used for formatting the output.
% We use `mylen` to determine how the long the drawn line is
\begin{tikzpicture}
\setlength{\mylen}{2cm}% This is ONLY in effect within this tikzpicture
\draw [red,thick] (0,0) -- (\mylen,0) node [right] {2cm};
\end{tikzpicture}
\begin{tikzpicture}
\draw [blue,thick] (0,-1) -- (\mylen,-1) node [right] {1cm};% not affected by above \setlength
\begin{scope}
\setlength{\mylen}{3cm}% This is ONLY in effect within this scope
\draw [green,thick] (0,-1.2) -- (\mylen,-1.2) node [right] {3cm};
\end{scope}
\draw [orange,thick] (0,-1.4) -- (\mylen,-1.4) node [right] {1cm};% not affected by above \setlength
\end{tikzpicture}
\end{document}
在进入tikzpicture
环境之前,我们已经将 的值全局设置\mylen
为1cm
。在第一个 中tikzpicture
, 的设置2cm
为该图片内的局部,如后续图片中的蓝线所示——它仍然使用 的初始设置,1cm
而不是2cm
。
在第二个中tikzpicture
,我们使用\begin{scope}
并设置\mylen
为3cm
并绘制绿线。此设置在 时恢复为之前的设置\end{scope}
,因此橙线仍然很1cm
长。
以下内容直接复制自相关问题移动和旋转图表的各部分因为它也与此相关:
在tikzpicture
环境中scope
,环境会应用环境内容的所有本地选项。此外,如果您\usetikzlibrary{scopes}
在序言中包含 ,则可以在“某些位置”使用 开始范围,前提{
是单个括号后跟 内的选项[]
。
来自文档(v2.10 TiKZ 和 PGF 手册第 12.3 节):
左括号具有这种特殊含义的“特定位置”如下:首先,紧跟在结束路径的分号之后。其次,紧跟在范围的末尾之后。第三,紧跟在范围的开头,包括图片的开头。还要注意,后面必须有一个方括号,否则括号将被视为普通的 TeX 范围。
答案4
我真的不知道我在这里做什么,因为我既不处理\newlength
很多事情,也不处理像这样的低级命令\let
,但下面的操作似乎有效:
\documentclass{article}
\begin{document}
\newlength{\elephant}
\setlength{\elephant}{100mm}
\rule{\elephant}{\elephant}
\let\elephant\relax
%\rule{\elephant}{\elephant}
\end{document}
如果取消注释第二个\rule
,您将收到四条错误消息,因为\elephant
未定义——我认为这就是您想要的?