这是我能想到的最简单的文件,它演示了我的问题:我只是想画两个半填充的圆圈:
\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
答案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
你需要照顾不同的方式 Ti钾Z 解析并扩展输入。似乎在不同的上下文中,事情并没有像预期的那样扩展。
例如,虽然这有效(感谢 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}
似乎虽然at
as 关键字(如\coordinate (x) at ...
)只喜欢显式坐标,但使用at
as 选项应该可以在这里工作(至少在当前版本的 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}