我想画一条曲线,在 处是实线$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
这是一个用于比较的渐近线解。这里的功能times
和subpath
。
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}
笔记:
- 这是可行的,因为您想要切换行为的点(rho 上方)是曲线上指定的顶点之一。
- 我实际上会用 TikZ 来做这件事。无论如何你都会加载 TikZ,因此使用图片环境来减少占用空间的说法是站不住脚的。即使你没有这样做,使用更强大的绘图包(无论是 TikZ 还是 asymptote 或 pstricks)所带来的灵活性也远远超过了这一点。