图中曲线为实线,然后为虚线

图中曲线为实线,然后为虚线

我想画一条曲线,在 处是实线$0$$\rho_1$但在 处是虚线(或点线)。但是,尽管经过多次试验,我还是只能得到实线。任何想法都值得赞赏。

\documentclass[a4paper,font=12]{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,spy,positioning,snakes}
\usepackage{curves}
\usepackage{xcolor,colortbl}

\begin{document}

\begin{figure}
\begin{center}
\unitlength = 1mm
\begin{picture}(70,70)(0,0)
\put(0,0){\vector(1,0){70}}
\put(0,0){\vector(0,1){70}}
  \put(25,0){\circle*{1.7}}
    \put(25,-4){${\rho}_1$}
\put(-10,50){$m(0)$}
{ \curve(0,50, 25, 35, 50, 0) }
\end{picture}
\end{center}
\end{figure}

\end{document}

在此处输入图片描述

答案1

如果你愿意尝试lualatex,那么你可以使用元帖子, 像这样:

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);

    numeric u; u = 1mm;
    path xx, yy, ff;

    xx = origin -- (70u, 0);
    yy = xx rotated 90;
    ff = ((0, 50) .. (25, 35) .. (50, 0)) scaled u;
    
    draw subpath (0, 1) of ff withcolor 2/3 blue;
    draw subpath (1, 2) of ff dashed withdots scaled 1/2 withcolor 2/3 blue;

    drawarrow xx;
    drawarrow yy;

    dotlabel.lft("$m(0)$", point 0 of ff);
    dotlabel.bot("$\rho_1$", (xpart point 1 of ff, 0));

endfig;
\end{mplibcode}
\end{document}

lualatex用...编译它

在此处输入图片描述

答案2

这是一个用于比较的渐近线解。这里的功能timessubpath

real[] times(path p, real x)

返回路径p与垂直线相交的所有时间(x,0)

path subpath(path p, real a, real b);

p返回从路径时间a到路径时间的子路径b,意义为point(path, real)。如果a > b,子路径的方向将被反转。

在此处输入图片描述

// http://asymptote.ualberta.ca/
unitsize(8mm);
real a=2;
path m=(0, 5) .. (2.5, 3.5) .. (5,0);
real[] t=times(m,a);
pair A=(a,0);
pair M=point(m,t[0]);
path m1=subpath(m,0,t[0]);
path m2=subpath(m,t[0],length(m));
draw(A--M,gray);
draw(m1,blue);
draw(m2,red+dashed);
dot(M,red);
dot("$a$",align=S,A);
dot(scale(.6)*"$m(0)$",align=W,point(m,0));
import graph;
axes("$x$","$y$",min=(-.5,-.5),max=(6,6),Arrow(TeXHead));
shipout(bbox(5mm,invisible));

答案3

我想到了一个 TikZ 解决方案(因为这篇文章发布已经有一段时间了,现在有两个非图片解决方案),但要做到这一点,我必须弄清楚正在\curve做什么,这让我找到了curves你正在加载的包。在阅读时,我发现了\tagcurve省略 的第一段和最后一段的命令\curve,以便它们用于定义曲线但不渲染它。当应用于\curve只有三个定义点的曲线时,它只会忽略最后一个段。由于您的曲线只有三个定义点,因此这表明了一种巧妙的策略:使用\tagcurve两次 - 一次使用反向点 - 分别绘制曲线的每个段。

现在,您的问题中可能使用了一个非常简单的示例,而您的实际用例具有更复杂的曲线。但实际上,如果您使用\tagcurve而不是\curve整个,则可以扩展这一点,因为的目的\tagcurve是绘制每个段仿佛它是一条较大曲线的一部分。因此,将一条曲线分割\tagcurve成较短的线段(适当重复断裂两侧的顶点)应该只会产生一条较短的线段完全相同的曲线

这是您所要求的图片版本。

\documentclass[a4paper,12pt]{article}
%\url{https://tex.stackexchange.com/q/576435/86}
\usepackage{curves}

\begin{document}

\begin{figure}
\begin{center}
\unitlength = 1mm
\begin{picture}(70,70)(0,0)
\put(0,0){\vector(1,0){70}}
\put(0,0){\vector(0,1){70}}
  \put(25,0){\circle*{1.7}}
    \put(25,-4){${\rho}_1$}
\put(-10,50){$m(0)$}
{
  \curvedashes[1mm]{0.5,1.5}
  \tagcurve(0,50, 25, 35, 50, 0) }
{ \tagcurve(50,0, 25, 35, 0,50) }
\end{picture}
\end{center}
\end{figure}
\end{document}

曲线在半途变成虚线

笔记:

  1. 这是可行的,因为您想要切换行为的点(rho 上方)是曲线上指定的顶点之一。
  2. 我实际上会用 TikZ 来做这件事。无论如何你都会加载 TikZ,因此使用图片环境来减少占用空间的说法是站不住脚的。即使你没有这样做,使用更强大的绘图包(无论是 TikZ 还是 asymptote 或 pstricks)所带来的灵活性也远远超过了这一点。

相关内容