为什么 \NewDocumentCommand 或者 Hobby (部分) 忽略了这个论点?

为什么 \NewDocumentCommand 或者 Hobby (部分) 忽略了这个论点?

我正在尝试编写一个命令来绘制轮廓(在我的文件中称为云轮廓),以便我可以在一个图形中放置它的几个副本。此外,我更愿意避免在文档的序言中定义命令,因为我想在书中的不同章节中使用它的不同版本,其中章节“包含”在一个带有一个序言的主文件中。我希望能够在使用它的同一个文件中编辑命令,而不是在主文件中。

下面的文件绘制了所需形状的轮廓,并且确实根据与指定点 #2 固定关系的点绘制了所有轮廓。但是,更改 #2 的值只会部分改变副本的相对位置。具体而言,即使节点和曲线的所有坐标都是通过与单个值 #2 的关系指定的,不同的 #2 值也会导致节点 A 相对于曲线的不同位置。不同的 #2 值不会使曲线的位置不同。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,cd}
\usetikzlibrary{calc,intersections,through}
\usetikzlibrary{external,hobby}
\usetikzlibrary{arrows,trees}
\usetikzlibrary{shapes,backgrounds,patterns}

\usepackage{xparse}

\begin{document}
   \NewDocumentCommand\Cloudoutline{ O{} r()}{\begin{tikzpicture}[use Hobby shortcut]
\node at (#2) (A) {A};
\draw[#1] (#2) to[curve through={($(#2)+(4,.5)$)..($(#2)+(8,0)$)..($(#2)+(8,-8)$)..($(#2)+(4,-8)$)..($(#2)+(0,-8)$) }] (#2);
\end{tikzpicture}}
\Cloudoutline[scale=.33](0,0)
\Cloudoutline[scale=.33](8,-2)
\end{document}

我该如何重写这个以便我可以选择两个轮廓相对于彼此的位置?

也许更好的解决方案是在每个包含的文件中都包含某种本地前言。目前我对此一无所知。

答案1

目前还不清楚您期望发生什么,或者您认为 xparse 参与的原因。tex 宏根本不解释 tikzcode,它只是用提供的值替换占位符。您从命令中获得的输出与直接调用 tikz 时获得的输出相同,参数不会被忽略:

xparse本文档根本没有使用:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,cd}
\usetikzlibrary{calc,intersections,through}
\usetikzlibrary{external,hobby}
\usetikzlibrary{arrows,trees}
\usetikzlibrary{shapes,backgrounds,patterns}



\begin{document}



\begin{tikzpicture}[use Hobby shortcut]
\node at (0,0) (A) {A};
\draw[scale=.33] (0,0) to[curve through={($(0,0)+(4,.5)$)..($(0,0)+(8,0)$)..($(0,0)+(8,-8)$)..($(0,0)+(4,-8)$)..($(0,0)+(0,-8)$) }] (0,0);
\end{tikzpicture}
\begin{tikzpicture}[use Hobby shortcut]
\node at (8,-2) (A) {A};
\draw[scale=.33] (8,-2) to[curve through={($(8,-2)+(4,.5)$)..($(8,-2)+(8,0)$)..($(8,-2)+(8,-8)$)..($(8,-2)+(4,-8)$)..($(8,-2)+(0,-8)$) }] (8,-2);
\end{tikzpicture}
\end{document}

答案2

抱歉,我说得不够清楚。我真正想要的答案确实使用了 xparse,而且我找到了问题所在。这个文件满足了我的要求。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,cd}
\usetikzlibrary{calc,intersections,through}
\usetikzlibrary{external,hobby}
\usetikzlibrary{arrows,trees}
\usetikzlibrary{shapes,backgrounds,patterns}
\usepackage{xparse}
\begin{document}
\NewDocumentCommand\Cloudoutline{ O{} r()}{
\draw[#1] (#2) to[curve through={($(#2)+(4,.5)$)..($(#2)+(8,0)$)..($(#2)+(8,-8)$)..($(#2)+(4,-8)$)..($(#2)+(0,-8)$) }] (#2);}
\begin{tikzpicture}[use Hobby shortcut]
\Cloudoutline[scale=.25,rotate=20](0,0)
\Cloudoutline[scale=.25,rotate=10](18,-2)
\Cloudoutline[scale=.25,rotate=-20](9,12)
\end{tikzpicture}
\end{document}

如果版主因为这个问题太混乱而删除它我一点也不介意。

相关内容