如何在另一个宏的参数中调用一个宏?我在运行以下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
错误的分支。