tikz 中的 `let` 操作

tikz 中的 `let` 操作

如何在括号内分隔选项[...]以便只影响当前命令;

例如,这里我只想要虚线(0,0) |- (A) [dashed]

有人能详细解释一下该let操作的用法吗?pgf 手册中的示例在 150p。我认为let至少对我来说,这不足以深入了解该操作的用法。

\documentclass[11pt]{book}
\usepackage{tikz}
\usetikzlibrary{decorations.markings} 
\usetikzlibrary{calc,intersections,through,backgrounds}

\begin{document}

\begin{center}
  \begin{tikzpicture}[scale=1.25,cap=round,>=latex]
    \draw[step=.5cm,gray,very thin] (-3.0cm,-3.0cm) grid (3.0cm,3.0cm);
    \draw[->] (-2.5cm,0cm) -- (2.5cm,0cm);
    \draw[->] (0cm,-2.5cm) -- (0cm,2.5cm);

    \coordinate (center) at (0.cm,0.cm) ;
    \coordinate (A) at (1.5cm,1.cm);
    \filldraw [black] (center) circle (0.04cm) node [left] {$Ο$};

    \draw let  
      \p1 = ($(A)-(center)$),
      \n1 = {veclen(\x1,\y1)},
      \n2 = {atan2(\x1,\y1)}
    in
      (center) circle (\n1)
      (A) circle  (0.1cm)[fill color = black]
      (0,0) |- (A) [dashed]
      (center)  -- (A);

  \end{tikzpicture}
\end{center}

在此处输入图片描述

答案1

let操作只能在\path(或\draw\fill...) 命令中使用。绘图选项(如line widthdashed或颜色)无法在单个路径中更改,因此无法在let命令中更改它们。

在您的具体示例中,您不需要将两个圆和直线置于与命令相同的路径中let:只有大圆实际上使用计算结果let。在这种情况下,最简单的方法就是将其他部分移动到它们自己的\paths 中。

但一般来说,let对于具有不同绘制样式的路径,使用操作结果基本上有两种不同的方法:

  • 您可以使用关键字命名坐标。然后可以在其他命令coordinate (<name>) at (<coordinate>)中使用这些坐标。\path
  • 您可以使用edge关键字,它告诉 TikZ 不要立即绘制路径段,而是在主路径完成后将其作为单独的路径执行,这使得可以使用不同的绘图样式。对于直线,它就像替换一样简单(A) -- (B)(A) edge [red] (B)对于更复杂的构造,您必须调整to path键的值:正交路径(A) -| (B)可以表示为(A) edge [to path=(\tikztostart) |- (\tikztotarget), red] (B)

答案2

Jake 的回答很完美。下一个答案适用于需要进行更复杂的计算而无法通过简单表达式轻松完成的情况

我认为同时进行计算和绘图操作不太好。而且如果使用多个计算和多个绘图,会使代码变得复杂。

A)路径与绘图

path开始\draw(精确地\path[draw])并以 结束;。绘制一条路径意味着您使用一支颜色相同的铅笔。您无法更换路径内的铅笔。

因此,如果您想绘制两个不同颜色的圆圈,则需要使用两条路径,例如:

\documentclass[11pt]{article}
\usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
    \draw    [blue] (0,0) circle (1 cm);
    \draw    [red]  (2,0) circle (1 cm);
    \end{tikzpicture}
\end{document}

但如果你写

\draw [red]   (0,0) circle (1 cm) [blue,fill=green!20]
              (2,0) circle (2 cm);

然后圆圈变成蓝色,圆盘变成绿色。蓝色是因为它是最后一个颜色选项,并且填充颜色应用于路径。

B)路径和计算

现在如果你需要做一些计算来画圆

在 pgfmanual 中有这个例子:我使用了更长的名称,但我必须使用花括号\p{AB}而不是\p1。代码更具可读性。备注:在下一个例子中,您可以避免let使用该through库的操作。

    \documentclass[11pt]{article}
    \usepackage{tikz}
    \usetikzlibrary{calc} 
    \begin{document}
        \begin{tikzpicture}
          \coordinate [label=left:$A$]  (A) at (0,0);
          \coordinate [label=right:$B$] (B) at (1.25,0.25);
          \draw let \p{AB}        = ($ (B) - (A) $),
                    \n{radius} = {veclen(\x{AB},\y{AB})}
                in
                  (A) circle (\n{radius})
                  (B) circle (\n{radius});
        \end{tikzpicture}
        \end{document}

如果我想要第一个圆是红色的,第二个圆是蓝色的,并且如果我想要计算一次 AB,那么这两个圆现在是黑色的,我需要这样做

    \documentclass[11pt]{article}
    \usepackage{tikz}
    \usetikzlibrary{calc} 
    \begin{document}
    \begin{tikzpicture}
      \coordinate [label=left:$A$]  (A) at (0,0);
      \coordinate [label=right:$B$] (B) at (1.25,0.25);
      \draw let 
                \p{AB} = ($ (B) - (A) $),
                \n{radius} = {veclen(\x{AB},\y{AB})}
            in 
            \pgfextra{\xdef\sameradius{\n{radius}}}
               [red]  (A)  circle (\n{radius}) ;
        \draw  [blue] (B)  circle (\sameradius) ;
    \end{tikzpicture}
    \end{document}

解释:\p{AB}是路径操作的本地操作,您可以在第一个路径之外使用结果。您需要将 tikz 寄存器传递\n{radius}给 tex。但您需要使用全局宏来跳出组。这就是我使用的原因\xdef

C)你的情况

在你的情况下(如果myradius是大圆的半径),你写道

\draw   (center) circle (\myradius pt)
        (A) circle  (0.1cm) 
        (0,0) |- (A) [dashed]
        (center)  -- (A);

这里你只有一条路径。(开始\draw相当于\path[draw],结束相当于;)。

所有路径都使用“虚线”选项绘制。如果要更改选项,则需要三条路径

\draw   (center) circle (\myradius pt);
\fill   (A) circle  (0.1cm) ; % fill the little circle
\draw [dashed]  (0,0) |- (A) % dash the lines
        (center)  -- (A);

D) 在过去,let operation

也许了解在“let”操作之前需要做什么很有趣。此操作现在用于避免下一个 TeX 代码。当您想要创建复杂的操作并且想要更灵活、更快速的代码时,这种代码有时很有用

首先我们需要获取向量的坐标$(A)-(center)$。我们需要使用宏\pgfpointdiff。结果在\pgf@x和之内\pgf@y。我们需要在\makeatletter和之间进行操作,\makeatother因为我们需要像使用@一个简单的字母一样使用。

然后我们用 计算长度 (A)--(中心) \pgfmathveclen。结果为\pgfmathresult。(统一为)。这是原始代码,在使用、和pt时最好采取一些预防措施。\pgf@x}\pgf@y\pgfmathresult

\makeatletter
\pgfpointdiff{\pgfpointanchor{A}{center}}%
             {\pgfpointanchor{center}{center}}%
\pgfmathveclen{\pgf@x}{\pgf@y}
 \makeatother

\pgf@x}这是原始代码,在使用、\pgf@y和时最好采取一些预防措施\pgfmathresult

现在我们可以将数学结果存储在宏中\myradius,这样使用和阅读代码就更加容易了

\makeatletter
\pgfpointdiff{\pgfpointanchor{A}{center}}%
             {\pgfpointanchor{center}{center}}%
\pgfmathsetmacro{\myradius}{veclen(\xdim,\ydim)}
\makeatother

但我们可以做得更好,因为现在我们pgflastxy可以避免makeatletter

首先,我们创建\xdimydim储存尺寸,然后用它\pgfgetlastxy来获取向量的尺寸。

\newdimen\xdim\newdimen\ydim
\pgfpointdiff{\pgfpointanchor{A}{center}}%
             {\pgfpointanchor{center}{center}}%
\pgfgetlastxy{\xdim}{\ydim}
\pgfmathsetmacro{\myradius}{veclen(\xdim,\ydim)}

完整代码

\documentclass[11pt]{article}
\usepackage{tikz}

\begin{document}

\begin{center}
  \begin{tikzpicture}[scale=1.25,cap=round,>=latex]
    \draw[step=.5cm,gray,very thin] (-3.0cm,-3.0cm) grid (3.0cm,3.0cm);
    \draw[->] (-2.5cm,0cm) -- (2.5cm,0cm);
    \draw[->] (0cm,-2.5cm) -- (0cm,2.5cm);

    \coordinate (center) at (0.cm,0.cm) ;
    \coordinate (A) at (1.5cm,1.cm);
    \filldraw [black] (center) circle (0.04cm) node [left] {$Ο$};
% calculation (the let part)
\newdimen\xdim\newdimen\ydim
\pgfpointdiff{\pgfpointanchor{A}{center}}%
             {\pgfpointanchor{center}{center}}%
\pgfgetlastxy{\xdim}{\ydim}
\pgfmathsetmacro{\myradius}{veclen(\xdim,\ydim)}

\draw   (center) circle (\myradius pt);
\fill   (A) circle  (0.1cm) ;
\draw [dashed]  (0,0) |- (A) 
        (center)  -- (A);
  \end{tikzpicture}
\end{center}
\end{document}

代替

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc} 
\begin{document}

\begin{center}
  \begin{tikzpicture}[scale=1.25,cap=round,>=latex]
    \draw[step=.5cm,gray,very thin] (-3.0cm,-3.0cm) grid (3.0cm,3.0cm);
    \draw[->] (-2.5cm,0cm) -- (2.5cm,0cm);
    \draw[->] (0cm,-2.5cm) -- (0cm,2.5cm);

    \coordinate (center) at (0.cm,0.cm) ;
    \coordinate (A) at (1.5cm,1.cm);
    \filldraw [black] (center) circle (0.04cm) node [left] {$Ο$};
    \draw  
       let 
           \p{Acenter}        = ($ (A) - (center) $),
           \n{radius} = {veclen(\x{Acenter},\y{Acenter})}
        in
     (center) circle (\n{radius});
    \fill   (A) circle  (0.1cm) ;
    \draw [dashed]  (0,0) |- (A) 
        (center)  -- (A);
  \end{tikzpicture}
\end{center}
\end{document}

在此处输入图片描述

相关内容