编辑 编辑

编辑 编辑

为了让 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.0n0

\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&#3& \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简单地将给定的值转发到Antondouble troubleAnton

我认为,解释起来比在代码中看到的要复杂得多!

\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 键的优点在于用户界面直观,并且可以轻松修改tikzpictures 之间或 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}

扩展和原始案例

相关内容