我试图结合人们提出的两个不同建议我之前问过的一个问题。我得到了一堆错误,但我不确定问题是什么。代码是:
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\mycurve#1{(0,0) to[out=70, in=180] (5,1.8)#1}
\begin{document}
\begin{tikzpicture}
\clip (-0.1,-0.1) rectangle (5,3);
\draw[help lines,->] (0,0) -- (4.2,0);
\draw[help lines,->] (0,0) -- (0,3); % draw axis lines
\draw[gray,dashed] (0,2) -- (4.2,2); % draw asymptote
\draw[domain=0.5:4.6,very thick,red,->,samples=400] \mycurve;% draw plot
\foreach \x in {0.25,0.5,...,4}
{
\draw[help lines,->] (\x,0) -- ($(\x,\mycurve)-(0,0.6pt)$);
}
\end{tikzpicture}
\end{document}
我认为问题出在最后,我尝试制作与曲线相关的垂直线;如果曲线定义为双曲线,则可行,如\def\mycurve#1{{1/(-(\x+#1))+2}}
,但如果我定义任意曲线,则不行。我不能这样做吗,还是我在某个地方犯了代码错误?
答案1
TikZ 通过读取流中的字符来检查路径上的待办事项列表,将宏单独放置几乎总是有问题的。在这里,您交织了一些问题;
当你定义\mycurve#1{}
一个宏时,它会不断寻找参数,直到找到能让 TeX 平静下来的东西。用 pacman 符号表示
\mycurveᗧ••••••••ᗣ{other definition stuff}
它会一直吃东西,直到碰到那些幽灵。如果东西没有分组,那么\mycurve{lots of things that will replace #1}
它会卡在第一个)
。我确信某处有重复的内容可以更好地解释它,所以我跳过了它。例如,你正在用你的定义延迟;
;
\mycurve;
因为#1
被替换为;
如果你用以下方式定义宏,结果是一样的
\def\mycurve{same definition without #1}
但是你使用
\mycurve)
然后它会延迟括号,而你将to
路径放在坐标声明中。你可以简单地尝试
\draw (0,0) -- (1,to (3,5));
这是不允许的,而且我甚至不知道这意味着什么。但是!
当你将其定义为
\def\mycurve#1{{1/(-(\x+#1))+2}}
那么 TikZ 就足够聪明了,能够理解这可能是一个计算,计算结果将是一个数字,它会将其用作该坐标的 y 项。但是你仍然为 提供了一个括号\mycurve
,因此它变成了
{1/(-(\x+)))+2}
而且它不应该起作用。所以我认为这不是你以前用过的东西。