foreach 如何修复下面的代码,以便图形的中心位于原点 (0,0)?
\begin{tikzpicture}
\fill[blue] circle (2pt) node[right] {$(0,0)$};
\draw (-3,1) -- (3,1);
\draw[blue] (-3,-2) -- (3,4);
\foreach \x in {1,2,3}{
\foreach \y in {1,...,\x}{
\draw[|-|] (\x,\y) -- ++(0,1);
};
};
\foreach \x in {1,2,3}{
\foreach \y in {1,...,\x}{
\draw[|-|] (-\x,-\y+1) -- ++(0,1);
};
};
\end{tikzpicture}
如何最小化代码?我最小化代码了吗?参见:
\begin{tikzpicture}
\fill[blue] circle (2pt) node[below right] {$(0,0)$};
\begin{scope}[yshift=-1cm]
\draw (-3,1) -- (3,1);
\draw[blue] (-3,-2) -- (3,4);
\foreach \x in {1,2,3}{
\foreach \y in {1,...,\x}{
\draw[|-|] (\x,\y) -- ++(0,1);
\draw[|-|] (-\x,-\y+1) -- ++(0,1);
};
};
\end{scope}
\end{tikzpicture}
答案1
假设您不想更改单个坐标,您可以将代码放在 a 内scope
并将所有内容向下移动 1cm,如下所示:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[blue] circle (2pt) node[right] {$(0,0)$};
\begin{scope}[yshift=-1cm]% Everything within here is shifted down 1cm
\draw (-3,1) -- (3,1);
\draw[blue] (-3,-2) -- (3,4);
\foreach \x in {1,2,3}{
\foreach \y in {1,...,\x}{
\draw[|-|] (\x,\y) -- ++(0,1);
};
};
\foreach \x in {1,2,3}{
\foreach \y in {1,...,\x}{
\draw[|-|] (-\x,-\y+1) -- ++(0,1);
};
};
\end{scope}
\end{tikzpicture}
\end{document}
否则,您可以调整每个点的 y 坐标,使其减少 1 个单位。
答案2
可接受的解决方案会移动循环中的所有线条。相反,我建议只移动标记为 (0,0) 的点作为原点。因此,只需将您的原点代码行更改为
\draw[fill=blue] (0,1) circle (2pt) node[below right] {$(0,0)$};
您将获得以下代码:
答案3
修复:
箭头
|-|
有一个缺点:|
部分不在线的末端居中,而是与线的末端接触(所有箭头都是这样)。在一个简单的例子中\draw[|-|] (0,0) -- (1,0); \draw[|-|] (1,0) -- (2,0);
这变得非常明显(线宽设置为
2pt
):shorten >
这可以通过将和shorten <
键设置为-.5\pgflinewidth
……来解决。…但我想使用该库一次性绘制垂直线
decorations.markings
。我可以将起始位置1cm+.5\pgflinewidth
和结束位置设置为1
。步骤设置为1cm
。这
.5\pgflinewidth
与我在上一个修复中使用缩短键的原因相同。(该\arrows
宏使用与通常的行尾箭头相同的放置算法,如我在以下问题的答案中看到的那样TikZ-pgf 有向图:更改箭头颜色和位置和使用 TikZ 在线条中间添加双箭头)不幸的是,我无法将结尾设置为
1+.5\pgflinewidth
或<length of line>+.5\pgflinewidth
。这将表示甚至不在线本身上的标记。-|
这就是我毕竟使用箭头的原因,但是使用shorten >=-.5\pgflinewidth
,以便中间|
直接位于线末端。在线的开头没有
|
箭头(无论是否缩短),因为那里已经有一条水平线了。新的宏
\maxLineLength
保存了(一半)行数,即最长行的无单位长度。整个图片以
(0,0)
(蓝点)为中心,可以整体移动和变换。
代码
\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{decorations.markings}
\tikzset{
|-|-|/.style={
decoration={
markings,
mark=between positions {1cm+.5\pgflinewidth} and 1 step 1cm with {\arrow{|}},
},
postaction=decorate,
-|,
shorten >=-.5\pgflinewidth,
},
}
\newcommand*{\maxLineLength}{3}
\begin{document}
\begin{tikzpicture}
\draw (-\maxLineLength,0) -- (\maxLineLength,0);
\draw[blue] (-\maxLineLength,-\maxLineLength) -- (\maxLineLength,\maxLineLength);
\foreach \x in {1,...,\maxLineLength}{
\foreach \sign in {+,-}
\draw[|-|-|] (\sign\x,0) -- ++(0,\sign\x);
};
\fill[blue] circle (2pt) node[below right] {$(0,0)$};% uses (0,0)
\end{tikzpicture}
\end{document}