`\dimexpr` 与实数相乘并带有括号

`\dimexpr` 与实数相乘并带有括号

我希望用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中检索结果。\pgfmathresultpt

\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}

在此处输入图片描述

相关内容