\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}

これにより、「Incomplete \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はeのアナログであることに注意\eapptoxeはeを表す)バツはパンドされ、\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を含める前に、まず式を評価 (展開) する必要があります。式は非常に単純 (2 つの数値の加算) なので、 を使用できます。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{\\}
}

関連情報