`\path` 箭头不合要求地向外收缩

`\path` 箭头不合要求地向外收缩

我正在尝试绘制一张地图,将 $1\mapsto 1/2$、$1/2\mapsto 1/3$、$1/3\mapsto 1/4$ 等发送出去。

我的代码如下:

% page setup
\documentclass[11pt]{article}
\usepackage[a4paper, total={6in, 8in}]{geometry}

% basic packages
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{color}
\usepackage{titlesec}
\usepackage{enumitem}
\usepackage{changepage}
\usepackage[makeroom]{cancel}

% tikz
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{calc}

% main document
\begin{document}

\begin{center}
    \begin{tikzpicture}[scale=5]
        % Draw the real line and the interval (0, 1]
        \draw[->] (-0.5, 0) -- (1.5, 0);
        \node at (0, 0) {$($};
        \node at (0, -0.08) {$0$};
        \node at (1, 0) {$]$};
        \node at (1, -0.08) {$1$};
        
        % Draw the points and arrows
        \filldraw (1, 0) circle (0.3pt);
        
        \foreach \x [evaluate=\x as \y using \x-1] [evaluate=\x as \z using (1/\x + 1/\y)/2] in {2, 3, 4, 5}
        {
            \filldraw (1/\x, 0) circle (0.3pt);
            \node at (1/\x, -0.08) {$\tfrac{1}{\x}$};
            
            \path[-] ($(1/\y, 0.06)-(0.00, 0)$) edge[out=90, in=0] ($(\z, 0.2)$);
            \path[->] ($(\z, 0.2)$) edge[out=180, in=90] ($(1/\x, 0.06)+(0.00, 0)$);
        }
        
        \node at (0.1, -0.08) {$\cdots$};
    \end{tikzpicture}
\end{center}

\end{document}

这给了我下面的图像。

在此处输入图片描述

我的问题是,最后几支箭开始向外“收缩”并向外弯曲,这对我来说是不可取的。我认为下面的图画展示了我想要的和不想要的。

在此处输入图片描述

有没有办法让箭头看起来像左边的箭头而不是右边的箭头?欢迎提出任何建议。

另外,我把每个箭头路径都画成两条线

\path[-] ($(1/\y, 0.04)$) edge[out=90, in=0] ($(\z, 0.2)$);
\path[->] ($(\z, 0.2)$) edge[out=180, in=90] ($(1/\x, 0.04)$);

是因为我希望每个箭头都达到完全相同的高度。如果我为每个箭头编写一行代码,就不会发生这种情况。我不确定这是否是好的做法,但这是主要问题的第三级。

答案1

松紧调节

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usepackage{amsmath}

\begin{document}


\begin{tikzpicture}[scale=5]
    % Draw the real line and the interval (0, 1]
    \draw[->] (-0.5, 0) -- (1.5, 0);
    \node at (0, 0) {$($};
    \node at (0, -0.08) {$0$};
    \node at (1, 0) {$]$};
    \node at (1, -0.08) {$1$};
    
    % Draw the points and arrows
    \filldraw (1, 0) circle (0.3pt);
    
    \foreach \x [evaluate=\x as \y using \x-1] [evaluate=\x as \z using (1/\x + 1/\y)/2] [count=\i from 0] in {2, 3, 4, 5}
    {
        \filldraw (1/\x, 0) circle (0.3pt);
        \node at (1/\x, -0.08) {$\frac{1}{\x}$};
        
        \path[-] ($(1/\y, 0.04)$) edge[out=90, in=0, looseness=1-0.15*\i] ($(\z, 0.2)$);
        \path[->] ($(\z, 0.2)$) edge[out=180, in=90, looseness=1-0.15*\i] ($(1/\x, 0.04)$);
    }
\end{tikzpicture}
\end{document}

当然,如果您愿意的话,可以进行更精确的调整。

答案2

我认为你做得太复杂了。

您可以只使用一条路径,这里bend right = 90它创建一条与连接起点和目标节点/坐标的线正交(90°)的曲线。

然而,这并不是全部,请参阅

\tikz
  \foreach[count=\ii from 1] \i in {2,...,5}
    \draw (5/\ii,0) to[bend right=90] (5/\i,0);

在此处输入图片描述

幸运的是,TikZ 提供了distance钥匙这会按照您希望的方式改变曲线:

\tikz
  \foreach[count=\ii from 1] \i in {2,...,5}
    \draw (5/\ii,0) to[bend right=90, distance=1cm] (5/\i,0);

在此处输入图片描述


不幸的是,PGF/TikZ 会将这些曲线的控制点包含到图表的边界框中,并在顶部添加一些垂直空白。

在这个简单的情况下,我会将路径实际设置为overlay,但我将在中间放置一个坐标,该坐标将是这些曲线上的最高点,稍后会将此坐标添加到边界框。
这并不完全相同,因为它忽略了线宽,但我认为这不会成为问题。您可以随时使用bbox图书馆或者看看相关问题绘制曲线路径时边界框比预期的大


在您的代码中,您只需执行

\draw[->] (1/\y, 0.06) to[bend right=90, distance=.2cm] (1/\x, 0.06);

以获得正确的曲线。(0.2 厘米将缩放为 1 厘米,就像您0.2在将其转换为画布坐标系后所做的那样。)


在下面的代码中,我主要使用chains没有放置规则的库(going {=}),因为我想手动放置点at (1/\i, 0),但想使用库在链上连接节点的功能。为此,样式arr设置如上所述。

替代方案(适用于我的代码)

除了贝塞尔曲线,您还可以绘制椭圆弧:

arr/.style={
  to path={
    (\tikztostart.north) arc [x radius={.5/(\i-1)-.5/(\i)},
                              y radius=.75,
                              start angle=0, delta angle=180]}}

其得出的曲线几乎相同。

替代方案(适用于您的代码)

您可以使用顶部的中间点,但分别调整in distanceout distance

然而,由于这些只能在画布坐标系中给出(即带有单位),但点之间的距离在坐标坐标系(无单位),你需要以calc某种方式计算距离,或者简单地使用控制点,你可以在其中指定距离坐标坐标系:

\draw[->] (1/\y, 0.06)
  to [controls=+(up:.1) and +(right:{.25*(1/\y-1/\x)})] (\z, 0.2)
  to [controls=+(left:{.25*(1/\y-1/\x)}) and +(up:.1)] (1/\x, 0.06);

这里顶点的距离是点之间距离的四分之一,即点和顶点之间的一半。

代码

% page setup
%\documentclass[11pt]{article}
%\usepackage[a4paper, total={6in, 8in}]{geometry}
\documentclass[tikz, border=3mm]{standalone}
% tikz
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{chains}
% main document
\begin{document}
\begin{tikzpicture}[
  x=5cm, % better than scale
  start chain=going {=}, % no-op for placement
  label position=below,
  arr/.style={
    ->, bend right=90, distance=1cm,
    overlay, edge node=coordinate(@) % for bounding box fix
  }]
% Draw the real line and the interval (0, 1]
\draw[->] (-0.5, 0) -- (1.5, 0);
\node[label={[name=l-0]$0$}] at (0, 0) {$($}
 node[label=$1$]             at (1, 0) {$]$};

\scoped[disable label 1/.style=coordinate]
\foreach \i in {1, ..., 5}
  \node[% the dot
    circle, inner sep=+0pt, outer sep=+5pt,
    minimum size=+3pt, fill, draw,
    on chain, join=by arr] at (1/\i,0) {}
   node[% the fraction
    disable label \i/.try, % no label for 1/1
    anchor=base] (l-\i)
    at (l-0.base-|chain-end) {$\frac{1}{\i}$};
\path(@); % enlage bounding box

\node[base left, inner sep=+0pt] at (l-5.base west) {$\dots$};
\end{tikzpicture}
\tikz
  \foreach[count=\ii from 1] \i in {2,...,5}
    \draw (5/\ii,0) to[bend right=90] (5/\i,0);
    
\tikz
  \foreach[count=\ii from 1] \i in {2,...,5}
    \draw (5/\ii,0) to[bend right=90, distance=1cm] (5/\i,0);
\end{document}

输出

在此处输入图片描述

相关内容