我需要一个长度为 的长度/tikz/cs/x[y]
。可以用这样的技巧来实现:
\documentclass{article}
\usepackage{tikz}
\newlength{\scaledx}
\newlength{\scaledy}
\begin{document}
\begin{tikzpicture}[
x=30pt,
y=60pt,
]
\makeatletter
\pgfpointxy{1}{1}
\setlength{\scaledx}{\pgf@x};
\setlength{\scaledy}{\pgf@y};
\makeatother
\node[draw] at (0,0) { \the\scaledx };
\node[draw] at (1,1) { \the\scaledy };
\end{tikzpicture}
\end{document}
但是,在我需要图片的地方,\makeatletter
有些东西被破坏了。此外,这种方法对于这项任务来说似乎有点不合时宜。
获取长度的正确方法是什么/tikz/cs/x[y]
?
答案1
你不能只在前言中定义一个宏来设置\scaledx
和\scaledy
,并且需要用包围起来\makeatletter....\makeatother
。稍后在文档中需要它们时调用该宏。这样就tikzpicture
不会看到 catcode 发生变化。
更详细地说,是这样的:
\documentclass{article}
\usepackage{tikz}
\newlength{\scaledx}
\newlength{\scaledy}
\makeatletter
\newcommand\SetScales{%
\pgfpointxy{1}{1}
\setlength{\scaledx}{\pgf@x};
\setlength{\scaledy}{\pgf@y};
}
\makeatother
\begin{document}
\begin{tikzpicture}[x=30pt, y=60pt]\SetScales
\node[draw] at (0,0) { \the\scaledx};
\node[draw] at (1,1) { \the\scaledy };
\end{tikzpicture}
\end{document}
答案2
您还可以使用
\documentclass{article}
\usepackage{tikz}
\newlength{\scaledx}
\newlength{\scaledy}
\newcommand\SetScales{%
\pgfextractx{\scaledx}{\pgfpointxy{1}{0}}%
\pgfextracty{\scaledy}{\pgfpointxy{0}{1}}%
}
\begin{document}
\begin{tikzpicture}[
x=30pt,
y=60pt,
]
\SetScales
\node[draw] at (0,0) { \the\scaledx };
\node[draw] at (1,1) { \the\scaledy };
\end{tikzpicture}
\end{document}
或者
\documentclass{article}
\usepackage{tikz}
\newlength{\scaledx}
\newlength{\scaledy}
\newcommand\SetScales{%
\pgfpointxy{1}{1}%
\pgfextractx{\scaledx}{}%
\pgfextracty{\scaledy}{}%
}
\begin{document}
\begin{tikzpicture}[
x=30pt,
y=60pt,
]
\SetScales
\node[draw] at (0,0) { \the\scaledx };
\node[draw] at (1,1) { \the\scaledy };
\end{tikzpicture}
\end{document}