tikzpicture 中的宏

tikzpicture 中的宏

我想使我正在使用的 tex 代码更具可读性,在这方面,我想以某种方式对以下代码使用宏:

\draw (10 mm,10 mm) -- (20 mm,10 mm);

我创建了以下新命令:

\newcommand*\horizontalLineCoor[3]{  \draw (#1 mm,#2 mm) -- (#3 mm,#2 mm);   }
\newcommand*\horizontalLineLength[3]{\draw (#1 mm,#2 mm) -- (#1+#3 mm,#2 mm);}

我收到了此类错误:

! Package PGF Math Error: Unknown function `mm' (in '( mm').

See the PGF Math package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.31 \horizontalLineLength(10
                             , 20, 10);
? 

你能帮我使用这些宏吗:)谢谢!R

测试文件(这应该画出2条水平线):

\documentclass[a4paper,10pt,fleqn]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\newcommand*\horizontalLineCoor[3]{  \draw (#1 mm,#2 mm) -- (#3 mm,#2 mm);   }
\newcommand*\horizontalLineLength[3]{\draw (#1 mm,#2 mm) -- (#1+#3 mm,#2 mm);}

\begin{document}
\begin{figure}
\begin{tikzpicture}[
  xscale=2,
  yscale=2,
  virtual/.style={thin,dashed}
  ]
\horizontalLineCoor(10, 10, 20);    %%%\draw (10 mm,10 mm) -- (20 mm,10 mm);   
\horizontalLineLength(10, 20, 10);  %%%\draw (10 mm,20 mm) -- (20 mm,20 mm);
\end{tikzpicture}
\caption{Interesting caption}
\end{figure}
\end{document}

答案1

您没有提供测试文件,但错误显示您使用了语法

\horizontalLineLength(10, 20, 10);

但是您已经用三个 TeX 参数定义了该命令,它们提供;

\horizontalLineLength{10}{20}{10}

答案2

如果你喜欢,可以使用语法\horizontalLineCoor(10, 10, 20)。然而,这有点尴尬,因为 TeX 不像 C 或其他编程语言那样处理多个参数;如果你定义

\newcommand{\foo}[3]{...}

调用应该是这样的

\foo{x}{y}{z}

每个参数都包含在大括号

但是,可以使用设置带括号的语法xparse,它提供了输入参数的相当通用的方法。

\documentclass[a4paper,10pt,fleqn]{article}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{positioning}

\NewDocumentCommand{\horizontalLineCoor}{>{\SplitArgument{2}{,}}r()}{%
  \horizontalLineCoorDo#1%
}
\NewDocumentCommand{\horizontalLineLength}{>{\SplitArgument{2}{,}}r()}{%
  \horizontalLineLengthDo#1%
}
\NewDocumentCommand{\horizontalLineCoorDo}{mmm}{%
  \horizontalLineDo{#1}{#2}{#3}%
}
\NewDocumentCommand{\horizontalLineLengthDo}{mmm}{%
  \horizontalLineDo{#1}{#2}{#1+#3}%
}
\NewDocumentCommand{\horizontalLineDo}{mmm}{%
  \draw (#1 mm,#2 mm) -- (#3 mm,#2 mm)%
}


\begin{document}

\begin{figure}[htp]
\centering

\begin{tikzpicture}[
  xscale=2,
  yscale=2,
  virtual/.style={thin,dashed}
  ]
\horizontalLineCoor(10, 10, 20);    %%%\draw (10 mm,10 mm) -- (20 mm,10 mm);   
\horizontalLineLength(10, 20, 10);  %%%\draw (10 mm,20 mm) -- (20 mm,20 mm);
\end{tikzpicture}
\caption{Interesting caption}

\end{figure}

\end{document}

定义

\NewDocumentCommand{\horizontalLineCoor}{>{\SplitArgument{2}{,}}r()}{%
  \horizontalLineCoorDo#1%
}

\horizontalLineCoor接受参数括在括号中;但我们可以告诉 LaTeX 用逗号(应该有两个)来分割这个参数,所以最后调用如下

\horizontalLineCoor(10, 10, 20)

结果是

\horizontalLineCoorDo{10}{10}{20}

因此参数是“TeX 标准化的”。现在需要定义\horizontalLineCoorDo,我以间接的方式进行定义,以避免主代码的代码重复,因为\horizontalLineCoor\horizontalLineLength执行的任务非常相似。

在此处输入图片描述

答案3

这只是为了指出 TiZ 有自己的方法来定义此类缩写。您的命令可以用两种样式来表示,horizontal tohorizontal add,它们的作用与您的命令应该做的事情相同(如果我理解正确的话)。

\documentclass[a4paper,10pt,fleqn]{article}
\usepackage{tikz}

\begin{document}
\begin{figure}
\begin{tikzpicture}[
  xscale=2,
  yscale=2,
 horizontal to/.style={insert path={coordinate(aux) -- (#1mm,0 |-aux)}},
 horizontal add/.style={insert path={-- ++ (#1mm,0)}}, 
  ]
\draw (10mm,10mm) [horizontal to=20];
\draw (10mm,20mm) [horizontal add=10];
\end{tikzpicture}
\caption{Interesting caption.}
\end{figure}
\end{document}

在此处输入图片描述

相关内容