为了让 tikz 图片适应某些输入值,我创建了以下代码。在下面的代码中,A 和 C 之间的距离是 A 和 B 之间距离的两倍。但是,给出的数字不正确。我想要的是 30,而不是 2*15。
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usepackage[utf8]{inputenc}
\usetikzlibrary{calc}
\usetikzlibrary{backgrounds}
\newcommand{\Anton}{15}
\newcommand{\Berta}{\Anton*2}
\begin{document}
\centering
\begin{tikzpicture}[x=1mm,y=1mm,scale=1]
\tikzset{mystyle/.style={<->}}
\tikzset{every node/.style={fill=white, font=\normalsize}}
\node (A) at (0,0){A};
\node (B) at (\Anton,0){B};
\node (C) at (-\Berta,0){C};
% Maße Vertikal
\path (A) edge [mystyle] node {\Anton} (B);
\path (A) edge [mystyle] node {\Berta} (C);
\end{tikzpicture}
\end{document}
给出:
\Berta
在将其用作标签之前,有没有办法计算其内容\path
?
谢谢!
答案1
用作\pgfmathsetmacro
十进制数,\pgfmathtruncatemacro
用作整数。或者,如果您想同时处理两者,这里有一个 的变体\pgfmathsetmacro
。它的工作方式如下:我们的问题是\pgfmathsetmacro\test{1+1}
设置\test
为。因此,我的变体检查结果是否为某个整数 的2.0
形式,如果是,则删除。其他小数保持不变。n.0
n
0
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usepackage[utf8]{inputenc}
\usetikzlibrary{calc}
\usetikzlibrary{backgrounds}
\newcommand\mymathsetmacro[2]{\pgfmathparse{#2}\expandafter\mymathsetmacrohelper\pgfmathresult\nil\edef#1{\pgfmathresult}}
\def\mymathsetmacrohelper#1.#2#3\nil{\ifx0#2\ifx& \def\pgfmathresult{#1}\fi \fi}
\newcommand{\Anton}{15}
\mymathsetmacro{\Berta}{\Anton*2}
\begin{document}
\centering
\begin{tikzpicture}[x=1mm,y=1mm,scale=1]
\tikzset{mystyle/.style={<->}}
\tikzset{every node/.style={fill=white, font=\normalsize}}
\node (A) at (0,0){A};
\node (B) at (\Anton,0){B};
\node (C) at (-\Berta,0){C};
% Maße Vertikal
\path (A) edge [mystyle] node {\Anton} (B);
\path (A) edge [mystyle] node {\Berta} (C);
\end{tikzpicture}
\end{document}
答案2
我会和 Ti 一起做这件事钾Z/PGF 键。如果您需要\Anton
并且\Berta
通常可用,您可以\tikzset{}
在序言中或文档开头使用。
有多种方法可以做到这一点。我在这里所做的方法包括设置\Anton
存储简单值,定义一个附加样式(double trouble
)以\Berta
使用从参数创建,然后在设置时\pgfmathsetmacro
简单地将给定的值转发到Anton
。double trouble
Anton
我认为,解释起来比在代码中看到的要复杂得多!
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}
\tikzset{%
% key Anton stores a value in \Anton
Anton/.store in=\Anton,
% key double trouble sets \Berta to twice the argument it is given
double trouble/.code={%
\pgfmathsetmacro\Berta{int(2*#1)}%
},
% any time the key Anton is used, the same value will be passed to double trouble
Anton/.forward to=/tikz/double trouble,
% make sure the key Anton is set to something so \Anton and \Berta have some default value
Anton=15,
}
\begin{document}
\begin{tikzpicture}
[
x=1mm,
y=1mm,
mystyle/.style={<->},
every node/.style={fill=white},
]
\node (A) {A};
\node (B) at (\Anton,0){B};
\node (C) at (-\Berta,0){C};
% Maße Vertikal
% we can make this a bit more concise ...
\path [mystyle] (A) edge node {\Anton} (B) edge node {\Berta} (C);
\end{tikzpicture}
\end{document}
使用 Ti 的优势钾Z 键的优点在于用户界面直观,并且可以轻松修改tikzpicture
s 之间或 s 内的值。
例如,在上面的图片后面添加以下内容,我们通过设置来更改两个宏的值Anton=10
,然后仅对其中一个进行再次修改node
,设置Anton=2
,这样\Berta
就会产生效果4
,而在最后一行创建节点时\Anton
仍然会产生效果。10
\begin{tikzpicture}
[
x=1mm,
y=1mm,
mystyle/.style={draw=blue, thick, text=red},
every node/.style={fill=white},
Anton=10,
]
\node (A) {A};
\node (B) at (\Anton,0){B};
\node (C) at (-\Berta,0){C};
% Maße Verti
% we can make this a bit more concise ...
\path [mystyle] (A) edge node {\Anton} (B) edge node [Anton=2] {\Berta} (C);
\end{tikzpicture}
请注意,使用的距离全部基于初始值。只有在创建包含的节点时,宏才有所不同\Berta
。
这是否有用以及有多有用显然取决于实际用例。但它是 Ti 中经常需要的东西钾Z 图片,保持这种灵活性是很好的,即使它没有任何直接用途。
编辑 编辑
这是一个扩展和修改的版本,它演示了:
- 如何添加进一步的因变量(我没有做 10 个,因为我感到无聊,但我确实做到了
\Enid
); - 如何容纳小数和整数。
\variable
要在节点中打印变量,请使用
\node [print me=\variable] ;
通常情况下,\node
需要{}
。但是,在本例中,内容由 创建print me
,它使用了node contents
。
如果节点是在边缘上创建的,则可能需要
... edge node [print me=\variable] {} ...
至少,我发现我需要这个。
print me
期望一个数字。如果您使用例如A
,您将收到错误。\variable
只要它产生一个数字,就可以。代码配置为打印最多 2 位小数的数字。更改的值precision
可以改变这一点。如果数字的小数位少于 2 位,则不会打印零。如果数字是整数,则不会打印小数点。
这是原始案例和扩展案例的代码。
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}
\tikzset{%
% key Anton stores a value in \Anton
Anton/.store in=\Anton,
% key double trouble sets \Berta to twice the argument it is given
double trouble/.code={%
\pgfmathsetmacro\Berta{2*#1}%
% additional dependent variables for demonstration purposes
\pgfmathsetmacro\Carlos{4*(sqrt(#1))}%
% we can use those we've just defined to create more
\pgfmathsetmacro\Dave{atan(\Carlos/\Berta)}%
\pgfmathsetmacro\Enid{sqrt((\Carlos)^2 + (\Berta)^2)}%
},
% any time the key Anton is used, the same value will be passed to double trouble
Anton/.forward to=/tikz/double trouble,
% make sure the key Anton is set to something so \Anton and \Berta have some default value
Anton=15,
% this pretty-prints the argument, which should be a number (or something which produces a number)
print me/.style={node contents={\pgfmathprintnumber{#1}}},
% this configures the printing of the numbers
/pgf/number format/.cd,
% we don't want decimal points in the case of integers; we don't want trailing zeros
fixed,
% print at most 2 decimal places - modify value as desired
precision=2,
}
\begin{document}
\begin{tikzpicture}
[
x=1mm,
y=1mm,
mystyle/.style={<->},
every node/.style={fill=white},
]
\node (A) {A};
\node (B) at (\Anton,0){B};
\node (C) at (-\Berta,0){C};
% Maße Verti
% we can make this a bit more concise ...
% notice the nodes are empty: print me=\variable puts the content in
\path [mystyle] (A) edge node [print me=\Anton] {} (B) edge node [print me=\Berta] {} (C);
\end{tikzpicture}
\begin{tikzpicture}
[
x=1mm,
y=1mm,
mystyle/.style={<->},
every node/.style={fill=white},
Anton=15.5,
]
\node (A) {A};
\node (B) at (\Anton,0) {B};
\node (C) at (-\Berta,0) {C};
% use our new dependent variables
\node (D) at (0,-\Carlos) {D};
\path (C) ++(\Dave:\Enid) node (E) {E};
% Maße Verti
% we can make this a bit more concise ...
\draw [mystyle] (A) edge node [print me=\Anton] {} (B) edge node [print me=\Berta] {} (C) edge node [print me=\Carlos] {} (D) [bend left] to (E);
\end{tikzpicture}
\end{document}