如何在 TiKZ 中循环设置剪辑序列?

如何在 TiKZ 中循环设置剪辑序列?

这是我能想到的最简单的文件,它演示了我的问题:我只是想画两个半填充的圆圈:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \foreach \x in {(0,0), (2,0)}
  {
    \draw \x circle[radius = 1];
    \begin{scope}[shift = \x]
      \draw[clip] (0,0) circle[radius = 1];
      \fill[black!50] (-1,-1) rectangle (1,0);
    \end{scope};
  }  
\end{tikzpicture}

\end{document}

运行此程序后,你会看到,只有第一个圆圈是半满的。而且我收到很多错误:

Missing character: There is no ( in font nullfont!
Missing character: There is no 0 in font nullfont!
Missing character: There is no , in font nullfont!
Missing character: There is no 0 in font nullfont!
Missing character: There is no ) in font nullfont!

我对此有点困惑,因为我以前从未遇到过这种错误。

应该虽然这个特定问题可以通过其他方式轻松解决,但它实际上是更一般的图表的最简单情况,它将由(我希望)许多填充到不同深度的圆圈组成。

我尝试过在 周围加上括号\x;我尝试过省略 shift 参数并使用坐标变换,例如

\fill[black!50] \x + (-1,-1) rectangle \x + (1,0);

但那也不起作用。(事实上后者更糟糕,因为它只给了我第一个圆四分之一填充。)

任何建议都会受到热烈欢迎!

答案1

没有添加图像,因此我尝试这个:

在此处输入图片描述

代码:

\documentclass{article}

\usepackage{tikz}

\begin{document}
    
    \begin{tikzpicture}
        \foreach \x in {0,2}
        {
            \draw (\x,0) circle(1);
            \fill (\x+1,0) arc(0:-180:1);
        }  
    \end{tikzpicture}
    
\end{document}

答案2

代码

\documentclass[tikz]{standalone}
%\documentclass{article}
%\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x in {(0,0), (2,0)}{
  \tikzset{shift/.expanded = \x} % https://tex.stackexchange.com/a/655530/16595
  \begin{scope}
    \clip (0,0) circle[radius = 1];
    \fill[black!50] (-1,-1) rectangle (1,0);
  \end{scope}
  \draw (0,0) circle[radius = 1];
}
\end{tikzpicture}

\tikz
  \foreach \x in {(0,0), (2,0)}
    \draw \x circle[radius=1] [
      path picture={
        \fill[black!50] (path picture bounding box.south west)
              rectangle (path picture bounding box.east);}];

\tikz
  \foreach \x in {(0,0), (2,0)}
    \draw[shift=\x] (0,0) circle[radius=1] [
      path picture={\fill[black!50] (-1,-1) rectangle +(2,1);}];
\end{document}

答案3

你需要照顾不同的方式 TiZ 解析并扩展输入。似乎在不同的上下文中,事情并没有像预期的那样扩展。

例如,虽然这有效(感谢 Qrrbrbirlbel 的提示):

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \foreach \x in {(0,0), (2,0)} {
    \begin{scope}
        \draw[clip] \x circle[radius = 1];
        \fill[black!50] \x ++(-1,-1) rectangle +(2,1);
    \end{scope}
  }  
\end{tikzpicture}
\end{document}

这不会:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \foreach \x in {(0,0), (2,0)} {
    \coordinate (x) at \x;
    \begin{scope}[shift = {(x)}]
        \draw[clip] (0,0) circle[radius = 1];
        \fill[black!50] (-1,-1) rectangle (1,0);
    \end{scope}
  }  
\end{tikzpicture}
\end{document}

以下情况同样如此:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \foreach \x in {(0,0), (2,0)} {
    \coordinate (x) at \x;
    \draw (x) circle[radius = 1];
  }  
\end{tikzpicture}
\end{document}

因此,最安全的方法可能仍然是这样的:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \foreach \x in {{0,0}, {2,0}} {
    \draw (\x) circle[radius = 1];
    \begin{scope}[shift = {(\x)}]
      \draw[clip] (0,0) circle[radius = 1];
      \fill[black!50] (-1,-1) rectangle (1,0);
    \end{scope}
  }  
\end{tikzpicture}
\end{document}

在此处输入图片描述

似乎虽然atas 关键字(如\coordinate (x) at ...)只喜欢显式坐标,但使用atas 选项应该可以在这里工作(至少在当前版本的 Ti 中Z)。因此,上述内容的一个变体将是:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \foreach \x in {(0,0), (2,0)} {
    \coordinate[at=\x] (x);
    \begin{scope}[shift = {(x)}]
        \draw[clip] (0,0) circle[radius = 1];
        \fill[black!50] (-1,-1) rectangle (1,0);
    \end{scope}
  }  
\end{tikzpicture}
\end{document}

相关内容