我想用命令生成一个表\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
是\eappto
(x
代表 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{\\}
}