将宏作为另一个宏的参数调用

将宏作为另一个宏的参数调用

如何在另一个宏的参数中调用一个宏?我在运行以下LaTeX代码时遇到困难。我以前\fpeval能够处理浮点数。

\documentclass[tikz, border=0mm]{standalone}
\usepackage{tikz,xfp}
\newcommand{\singleBox}[4]
{
    \fill(\fpeval{#1}mm,\fpeval{#2}mm) rectangle (\fpeval{#1} mm + \fpeval{#3} mm,\fpeval{#2} mm - \fpeval{#4} mm);
}

\newcommand{\subtractOne}[1]{
    \number\numexpr#1-1\relax%
}

\newcommand{\convertNum}[5] 
{
    \def\offsetOne{\fpeval{\subtractOne{#1}}}
    \def\offsetTwo{\fpeval{\subtractOne{#2}}}
    \ifnum #1<6
        \fpeval{#3 + 9 + (#4 + #5)*\offsetOne + \offsetTwo}
    \else
        % to be completed...
    \fi
}

\begin{document}
    \begin{tikzpicture}
    \draw[draw=black] (0mm,0mm) rectangle (300 mm, 400 mm);
    \singleBox{100}{200}{24}{13} % This works just fine
    \singleBox{\convertNum{1}{1}{0}{2}{1.46}}{200}{24}{13}  
    \end{tikzpicture}
\end{document}

我收到以下错误消息:

Undefined control sequence. ...convertNum{1}{1}{0}{2}{1.46}}{200}{24}{13}
You can't use `\def' after \the. ...convertNum{1}{1}{0}{2}{1.46}}{200}{24}{13}

答案1

您不能使用不可扩展的指令(例如\def该宏)。但您可以简单地在表达式中减去 1。

你甚至可以做得更好:

\documentclass[tikz, border=0mm]{standalone}
\usepackage{tikz,xfp}

\newcommand{\singleBox}[4]{%
  \fill(\fpeval{#1}mm,\fpeval{#2}mm) rectangle
    (\fpeval{#1} mm + \fpeval{#3} mm,\fpeval{#2} mm - \fpeval{#4} mm);
}

\newcommand{\convertNum}[5]{%
  \fpeval{#1<6 ? #3 + 9 + (#4 + #5)*(#1-1) + (#2-1) : 0}
}

\begin{document}

\begin{tikzpicture}
  \draw[draw=black] (0mm,0mm) rectangle (300 mm, 400 mm);
  \singleBox{100}{200}{24}{13} % This works just fine
  \singleBox{\convertNum{1}{1}{0}{2}{1.46}}{200}{24}{13}
\end{tikzpicture}

\end{document}

请注意,\fpeval接受以下形式的表达式

<fp expression><comparator><fp expression> ? <fp expression> : <fp expression>

比较器可以是<><=或;如果比较返回真,>=则使用!=后面的表达式,如果比较返回假,则使用?后面的表达式。:

在代码中我留下了0错误的分支。

相关内容