我希望用tikz
宏绘制一个对象,因此我必须计算如下表达式:
被定义为:
\newcommand{\myhexagon}{2}{...}
\newcommand{\myobject}{2}{
\myheaxgon{#1}{0.5*#2}
\myhexagon{0.89*#1-4mm}{0.79*(#1-(0.89*#1-4mm))+#2}}
}
被调用者(例如):
\myobject{2cm}{3mm}
\myobject{12mm}{3mm}
我试过解决
\newcommand{\myobject}{2}{
\def\const{0.89}
\def\constII{0.79}
\myheaxgon{#1}{0.5*#2}
\myheaxgon{\the\dimexpr \const#1 -4mm\relax}{\the\dimexpr\constII\the\dimexpr#1-\the\dimexpr\const#1-4mm\relax\relax+#2\relax}
}
(即用 '\const' 替换 '0.89*',用 ' 替换 '()' \the\dimexpr ... \relax
)但我失败了。有人知道吗?
答案1
让我们分析一下发生了什么\myobject{2cm}{3mm}
。首先是内部的\dimexpr
:
\the\dimexpr\const#1-4mm\relax
宏参数替换就是:文本替换。因此,当#1=2cm
这变成
\the\dimexpr\0.892cm-4mm\relax
不是乘法。如果要\const
与相乘#1
,请使用\const\dimexpr#1\relax
,就像对 所做的那样\constII
。因此内部的 变成:
\the\dimexpr\const\dimexpr#1\relax-4mm\relax
有了这些参数,值就变成了39.26477pt
。
现在我们代入外部表达式。这将变成:
\the\dimexpr\constII\the\dimexpr#1-39.26477pt\relax+#2\relax
现在代入参数,您将获得:
\the\dimexpr0.79\the\dimexpr2cm-39.26477pt\relax+3mm\relax
现在我们又有一个内在的表达:
\the\dimexpr2cm-39.26477pt\relax
这将得到42.9589pt
。但请注意:因为您使用了\the
,所以您得到的是文本,而不是长度值。因此,使用外部表达式中的文本替换,您将得到:
\the\dimexpr0.7942.9589pt+3mm\relax
你得到的不是乘法,而是一个带有两个小数的非法数字。教训:不要使用\the
内部表达式。
经过这些修正后,最终表达式变为:
\the\dimexpr\constII\dimexpr#1-\dimexpr\const\dimexpr#1\relax-4mm\relax\relax+#2\relax
结果是22.47186pt
。我不知道这是否是预期的答案。
答案2
xparse
具有和的解决方案expl3
,其具有强大且可扩展的浮点计算模块。
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\fpdim}{m}
{
\fp_to_dim:n { round(#1,5) }
}
\ExplSyntaxOff
\newcommand{\const}{0.89}
\newcommand{\constII}{0.79}
\setlength\parindent{0pt}
\begin{document}
\section{Henri}
\newcommand\henriobject[2]{%
\henrihexagon{#1}{0.5*#2}%
\henrihexagon{\const*#1-4mm}{\constII*(#1-(\const*#1-4mm))+#2}%
}
\newcommand\henrihexagon[2]{%
\pgfmathparse{#1}\pgfmathresult\
and
\pgfmathparse{#2}\pgfmathresult\par
}
\henriobject{2cm}{3mm}
\henriobject{12mm}{3mm}
\section{Piet}
\newcommand{\pietobject}[2]{%
\piethexagon{\the\dimexpr#1\relax}{\the\dimexpr0.5\dimexpr#2\relax\relax}%
\piethexagon{%
\the\dimexpr\const\dimexpr#1\relax-4mm\relax
}{%
\the\dimexpr\constII\dimexpr#1-(\const\dimexpr#1\relax-4mm)\relax+#2\relax
}%
}
\newcommand{\piethexagon}[2]{%
#1 and #2\par
}
\pietobject{2cm}{3mm}
\pietobject{12mm}{3mm}
\section{\texttt{expl3}}
\newcommand{\myobject}[2]{%
\myhexagon{\fpdim{#1}}{\fpdim{0.5*#2}}%
\myhexagon
{\fpdim{\const*#1-4mm}}
{\fpdim{\constII*(#1-(\const*#1-4mm))+#2}}%
}
\newcommand{\myhexagon}[2]{%
#1 and #2\par
}
\myobject{2cm}{3mm}
\myobject{12mm}{3mm}
\end{document}
请注意,结果非常相似,仅在小数点后第四位有差异。
最大的区别是,和 的解决方案xparse
是\dimexpr
完全可扩展的,而 的解决方案则\pgfmathparse
不能。
语法xparse
比 更加友好\dimexpr
,基本与 的语法相同\pgfmathparse
。
答案3
pgfmath
如果您正在使用 TikZ,则只需使用。只需在 (甚至包括维度) 中插入您的数学表达式,然后从(在 中)\pgfmathparse
中检索结果。\pgfmathresult
pt
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand\myhexagon[2]{%
\pgfmathparse{#1}\pgfmathresult\
and
\pgfmathparse{#2}\pgfmathresult\par
}
\newcommand\myobject[2]{%
\myhexagon{#1}{0.5*#2}%
\myhexagon{0.89*#1-4mm}{0.79*(#1-(0.89*#1-4mm))+#2}%
}
\myobject{2cm}{3mm}
\myobject{12mm}{3mm}
\end{document}