![\pgfmathsetmacro による不完全な \iffalse](https://rvso.com/image/353034/%5Cpgfmathsetmacro%20%E3%81%AB%E3%82%88%E3%82%8B%E4%B8%8D%E5%AE%8C%E5%85%A8%E3%81%AA%20%5Ciffalse.png)
\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のアナログであることに注意\eappto
(x
eは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{\\}
}