TikZ:\foreach 在括号参数中

TikZ:\foreach 在括号参数中

我正在尝试使用 Ti 在基本方向上有效地绘制两个同心椭圆,其中四个点间距相等Z. 目前,我有以下代码,它可以生成以下图像。

\documentclass[tikz,border=2mm]{standalone}

\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}
    \foreach \s in {1,0.3} {
        \draw [blue,thick,scale=\s,decoration={markings,
            mark=at position 0    with {\fill circle (2pt);},
            mark=at position 0.25 with {\fill circle (2pt);},
            mark=at position 0.5  with {\fill circle (2pt);},
            mark=at position 0.75 with {\fill circle (2pt);}
        },postaction={decorate}] ellipse (2cm and 1.4cm);
    }
\end{tikzpicture}
\end{document}

在此处输入图片描述

我发现\foreach可以使用循环来减少麻烦并同时绘制两个椭圆。但是,我想知道是否可以对这四个mark参数做类似的事情,因为它们之间唯一改变的是值position

我已尝试\foreach如下方法,但似乎不起作用。

\documentclass[tikz,border=2mm]{standalone}

\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}
    \foreach \s in {1,0.3} {
        \draw [blue,thick,scale=\s,decoration={markings,
            \foreach \x in {0,0.25,0.5,0.75} {
                mark=at position \x with {\fill circle (2pt);}
            }
        },postaction={decorate}] ellipse (2cm and 1.4cm);
    }
\end{tikzpicture}
\end{document}

有没有办法让这样的事情发生?

答案1

绝对如此。这就是关键/.list所在。您只需定义一个以位置为参数的样式(cmark如下例所示),然后将其应用于带有的位置列表cmark/.list={0,0.25,0.5,0.75}。它理解所有\foreach可以理解的内容,因此cmark/.list={0,0.25,...,0.75}也会起作用(但在这种情况下,对我们并没有太大帮助)。

\documentclass[tikz,border=2mm]{standalone}

\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}[cmark/.style={decoration={markings,
              mark=at position #1 with {\fill circle (2pt);}
            },postaction={decorate}}]
    \foreach \s in {1,0.3} {
      \draw [blue,thick,scale=\s,cmark/.list={0,0.25,0.5,0.75}] ellipse (2cm and 1.4cm);
    }
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

无需重新发明轮子,标记库允许您使用 3.1.4b 手册第 639 页上描述的语法进行本地循环,我引用:

/pgf/decoration/mark=betweenpositions < 起始位置 > 和 < 结束位置 > 与 < 代码 > 一起进行步骤(无默认值)

\documentclass[tikz,border=2mm]{standalone}

\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}
    \foreach \s in {1,0.3} {
        \draw [blue,thick,scale=\s,decoration={markings,
         mark= between positions 0 and .9 step 0.25
         with {\fill circle (2pt);}
        },postaction={decorate}] 
        ellipse (2cm and 1.4cm);
    }
\end{tikzpicture}
\end{document}

截屏

答案3

为了好玩,pstricks解决方案是使用以下pst-eucl软件包:

 \documentclass[svgnames, border=6pt]{standalone}

\usepackage{pst-eucl}
 \usepackage{auto-pst-pdf} %% To compile with pdflatex --enablewrite18 (MiKTeX) or pdflatex --shell-escape (TeX Live, MacTeX)

\begin{document}
\psset{linecolor=RoyalBlue, linewidth=1.2pt, plotstyle=curve}
\begin{pspicture}(-5,-3.5)(5,3.5)
\multido{\na=2.4+2.1,\nb=1.6+1.4}{2}{\pstEllipse(0,0)(\na,\nb)%
\multido{\i=0+90}{4}{\pstEllipseRotNode[PointName=none, RotAngle=\i](0,0)(\na,\nb){A\i}}%
}%
\end{pspicture}

\end{document} 

在此处输入图片描述

相关内容