我想使我正在使用的 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
这只是为了指出 Ti钾Z 有自己的方法来定义此类缩写。您的命令可以用两种样式来表示,horizontal to
和horizontal 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}