\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
확장할 수 없으므로 an ( \xappto
variant에서는 평가됨 ) 에서 "평가"되지 않습니다 \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}
는 ( e를 의미함 )과 \tl_put_right:Nx
유사하다는 점에 유의하십시오.\eappto
x
엑스panded) 와 \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}
\fp_eval
LaTeX3에서 LaTeX2e 인터페이스를 통해 확장 가능한 계산이 쉽게 가능합니다.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{\\}
}