\pgfmathsetmacro 中的 \iffalse 不完整

\pgfmathsetmacro 中的 \iffalse 不完整

我想用命令生成一个表\foreach,使得表的条目取决于行和列。我想测试以下代码:

\documentclass{article}
\usepackage{pgffor,etoolbox}   
\newcommand*\tas[2]{
\pgfmathsetmacro{\sat}{#1+#2}
\sat
}    
\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
\foreach \j in {1,...,7}{
    \xappto\mytablecontents{\tas{\i}{\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}    
\begin{document}    
\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}   
\end{document}

这会出现错误“不完整 \iffalse”。我读到这个错误的原因是使用了\pgfmathsetmacro。有人知道如何处理吗?

答案1

\pgfmathsetmacro是不可扩展的,所以它不会被“评估” (在变体中\edef就是这样做的)。\xappto\xdef

您可以先计算总和,将其存储到宏中,然后附加扩展版本:

\documentclass{article}
\usepackage{pgffor,etoolbox}

\newcommand*\tas[2]{%
  \pgfmathsetmacro{\sat}{#1+#2}%
}
\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{%
\foreach \j in {1,...,7}{%
    \tas{\i}{\j}%
    \xappto\mytablecontents{\sat &}
  }%
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

在此处输入图片描述

或者,您可以使用可扩展算术:expl3提供它,xfp以及\fpeval

\documentclass{article}
\usepackage{pgffor,etoolbox,xfp}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{%
\foreach \j in {1,...,7}{%
    \xappto\mytablecontents{\fpeval{\i+\j}&}
  }%
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

在此处输入图片描述

只是为了展示功能(pgfmath虽然不是所有功能都可用),如果你\xappto将调用改为

\xappto\mytablecontents{\fpeval{round(\i*sqrt(\j),2)}&}

输出将是

在此处输入图片描述

完整代码的结果相同expl3

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\tl_clear:N \l_tmpa_tl
\int_step_inline:nnnn { 1 } { 1 } { 7 }
 { % outer cycle: #1
  \int_step_inline:nnnn { 1 } { 1 } { 7 }
   { % inner cycle: ##1
    \tl_put_right:Nx \l_tmpa_tl { \fp_eval:n {round(#1*sqrt(##1),2)} & }
   }
  \tl_put_right:Nn \l_tmpa_tl { \\ }
 }
\tl_set_eq:NN \mytablecontents \l_tmpa_tl
\ExplSyntaxOff

\begin{document}    

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}   

\end{document}

注意,\tl_put_right:Nx\eapptox代表 eX扩展)\tl_put_right:Nn是的类似物\appto。不需要全局定义,因为\int_step_inline:nnnn不使用循环分组:当前索引可直接用作#1(或##1在内循环中)。

答案2

为了避免使用它,您可以使用内循环newcommand选项计算相同的结果。[evaluate = \j as \c using int(\i+\j)]\foreach

\documentclass{article}
\usepackage{pgffor,etoolbox}

\newcommand*\mytablecontents{}
\foreach \i in {0,...,7}{
  \foreach \j [evaluate = \j as \c using int(\i+\j)] in {0,...,7}{
    \xappto\mytablecontents{\c}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

在此处输入图片描述

您还可以使用:

\newcommand*\mytablecontents{}
\foreach \i in {0,...,7}{
  \foreach \j in {0,...,7}{
    \pgfmathtruncatemacro\c{\i+\j}
    \xappto\mytablecontents{\c}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}%
}

答案3

你执行

\xappto\mytablecontents{\tas{\i}{\j}}

假设\tas{.}{.}是可扩展的。但是,由于它包含一个赋值(\pgfmathsetmacro),所以它不是。因此,您必须先评估(扩展)表达式,然后才能将其作为 的一部分包含在内app\mytablecontents由于表达式相当简单(两个数字相加),您只需使用\number\numexpr#1+#2

在此处输入图片描述

\documentclass{article}

\usepackage{pgffor,etoolbox}

\newcommand*\tas[2]{%
  \number\numexpr#1+#2\relax
}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
  \foreach \j in {1,...,7}{
    \xappto\mytablecontents{\tas{\i}{\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

通过 LaTeX2e 接口可以轻松实现可扩展计算,适用\fp_eval于 LaTeX3 中的xfp包裹

\usepackage{pgffor,xfp,etoolbox}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
  \foreach \j in {1,...,7}{
    \xappto\mytablecontents{\fpeval{\i+\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

相关内容