不完整的 \iffalse 與 \pgfmathsetmacro

不完整的 \iffalse 與 \pgfmathsetmacro

我想使用該\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不可擴展,因此它不會在 an 中「求值」\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代表 eXpand)\tl_put_right:Nn是 的模擬\appto。不需要全域定義,因為\int_step_inline:nnnn不使用循環分組:目前索引可直接用作#1(或##1在內循環中)。

答案2

為了避免使用 that ,您可以使用內部循環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{\\}
}

相關內容