修改 `*` 和 `o` 样式的 tikz 箭头,使它们位于行尾的中心

修改 `*` 和 `o` 样式的 tikz 箭头,使它们位于行尾的中心

我想使用 tikz*o箭头来指示分段函数图中的包含/排除端点,例如以下示例:

样地

然而,似乎tikz总是将箭头的“尖端”与线的末端对齐,这样代码

\documentclass{article} 
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture}
   \draw[help lines] (-.1,-.1) grid (2.1,2.1);
   \draw[thick,-*] (0,1.5) -- (1,.5);
   \draw[thick,o-] (1,1.5) -- (2,.5);
\end{tikzpicture}
\end{document}

生产

tikz 箭头(对齐不正确)

我希望圆圈在网格线上垂直对齐。

是否有一个参数或代码可以修改以获得所需的行为?

答案1

shorten <和选项shorten >分别允许您从线的起点和终点缩短箭头长度。它还接受负值,然后将箭头向前延伸:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture}[shorten >=-3pt,shorten <=-3pt]
   \draw[help lines] (-.1,-.1) grid[step=.5] (2.1,2.1);
   \draw[thick,-*] (0,1.5) -- (1,.5);
   \draw[thick,o-] (1,1.5) -- (2,.5);
\end{tikzpicture}
\end{document}

3pt只是一个猜测,但似乎是这个箭头的正确值。

结果:

结果

答案2

如果您想避免猜测shorten <键的值,您可以定义新的箭头,将圆圈精确地放置在指定的坐标处:

\documentclass[]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\usepgflibrary{arrows}

\makeatletter
\pgfarrowsdeclare{center*}{center*}
{
  \pgfarrowsleftextend{+-.5\pgflinewidth}
  \pgfutil@tempdima=0.4pt%
  \advance\pgfutil@tempdima by.2\pgflinewidth%
  \pgfarrowsrightextend{4.5\pgfutil@tempdima}
}
{
  \pgfutil@tempdima=0.4pt%
  \advance\pgfutil@tempdima by.2\pgflinewidth%
  \pgfsetdash{}{+0pt}
  \pgfpathcircle{\pgfqpoint{4.5\pgfutil@tempdima}{0bp}}{4.5\pgfutil@tempdima}
  \pgfusepathqfillstroke
}

\pgfarrowsdeclare{centero}{centero}
{
  \pgfarrowsleftextend{+-.5\pgflinewidth}
  \pgfutil@tempdima=0.4pt%
  \advance\pgfutil@tempdima by.2\pgflinewidth%
  \pgfarrowsrightextend{4.5\pgfutil@tempdima}
}
{
  \pgfutil@tempdima=0.4pt%
  \advance\pgfutil@tempdima by.2\pgflinewidth%
  \pgfsetdash{}{+0pt}
  \pgfpathcircle{\pgfqpoint{4.5\pgfutil@tempdima}{0bp}}{4.5\pgfutil@tempdima}
  \pgfusepathqstroke
}
\makeatother

\begin{document}
\begin{tikzpicture}
   \draw[help lines] (-.1,-.1) grid (2.1,2.1);
   \draw[thick,-center*] (0,1.5) -- (1,.5);
   \draw[thin,centero-] (1,1.5) -- (2,.5);
\end{tikzpicture}
\end{document}

答案3

使用较新的arrows.meta库,可以通过将设置sep为箭头长度一半的负数来实现。由于长度的默认值箭头的 Circle尖端是

length  = +2.39365pt +3.191538

我们将使用

Circle[sep=-1.196825pt -1.595769]

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[
  */.tip={Circle[sep=-1.196825pt -1.595769]},
  o/.tip={Circle[sep=-1.196825pt -1.595769, open]},
]
   \draw[help lines] (-.1,-.1) grid (2.1,2.1);
   \draw[thick, -*] (0,1.5) -- (1,.5);
   \draw[thick, o-] (1,1.5) -- (2,.5);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容