修正 TikZ 代码

修正 TikZ 代码

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}

输出 (\maxLineLength = 3

在此处输入图片描述

输出 (\maxLineLength = 10

在此处输入图片描述

相关内容