如何在数组中存储值?

如何在数组中存储值?

如何将计算值存储在数组中?

zz(1) = ( xx(1) + yy(1) )/2

\fpeval\zz(\counter){(\xx(\counter)+\yy(\counter))/2}不工作

\documentclass{beamer}
\usepackage{siunitx,amsmath}
\usepackage{xparse,xfp}

\ExplSyntaxOn
\NewDocumentCommand{\newarray}{m}
 {
  \seq_new:c { l_hafid_array_#1_seq }
  \cs_new:cpn { #1 } ##1
   {
    \seq_item:cn { l_hafid_array_#1_seq } { ##1 }
   }
 }
\NewDocumentCommand{\readarray}{mm}
 {
  \seq_set_split:cnn { l_hafid_array_#1_seq } { & } { #2 }
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { c }

\NewExpandableDocumentCommand{\sumarray}{O{15}m}
 {
  \fp_eval:n { round( \seq_use:cn { l_hafid_array_#2_seq } { + }, #1 ) }
 }

\ExplSyntaxOff

\begin{document}

\newarray{xx}
\readarray{xx}{1&2&3&4&5}

\newarray{yy}
\readarray{yy}{6&7&8&9&10}

\begin{frame}
\begin{table}[]
\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \xx{1} & \yy{1} &  \fpeval{(\xx{1}+\yy{1})/2}  \\
2 & \xx{2} & \yy{2} &  \fpeval{(\xx{2}+\yy{2})/2}  \\
3 & \xx{3} & \yy{3} &    \\
4 & \xx{4} & \yy{4} &    \\
5 & \xx{5} & \yy{5} &    \\ \hline
\end{tabular}
\end{table}
\end{frame}

%\newarray{zz}
%\readarray{xx}{0&0&0&0&0}
\newcount\counter
\counter=5
\loop
\fpeval\zz(\counter){(\xx(\counter)+\yy(\counter))/2}
\advance \counter by -1
\unless\ifnum \counter<1
\repeat

\end{document}

答案1

您不能通过这种方式为数组分配值:其中的值可以通过数字地址检索,但不能这样分配。

您可以使用模块通过索引来寻址数组,以便检索和分配值fparray

数组具有固定长度;\newarray{<name>}指定的长度为 100;如果需要更小或更大的数组,可以调用\newarray{<name>}[<length>]

\documentclass{article}
\usepackage{xparse,xfp}

\ExplSyntaxOn

\NewDocumentCommand{\newarray}{mO{100}}
 {
  \fparray_new:cn { g_sandu_#1_fparray } { #2 }
  \cs_new:cpn { #1 } ##1
   {
    \fparray_item:cn { g_sandu_#1_fparray } { ##1 }
   }
 }

\NewDocumentCommand{\readarray}{mm}
 {
  \seq_set_split:Nnn \l__sandu_temp_seq { & } { #2 }
  \int_step_inline:nn { \seq_count:N \l__sandu_temp_seq }
   {
    \fparray_gset:cne { g_sandu_#1_fparray } { ##1 }
     { \seq_item:Nn \l__sandu_temp_seq { ##1 } }
   }
 }

\NewDocumentCommand{\setarrayitem}{mmm}
 {
  \fparray_gset:cne { g_sandu_#1_fparray } { #2 } { #3 }
 }

\cs_generate_variant:Nn \fparray_new:Nn { c }
\cs_generate_variant:Nn \fparray_item:Nn { c }
\cs_generate_variant:Nn \fparray_gset:Nnn { cnn, cne }

\ExplSyntaxOff

\newarray{xx}
\readarray{xx}{1&2&3&4&5}

\newarray{yy}
\readarray{yy}{6&7&8&9&10}

\begin{document}

\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \xx{1} & \yy{1} &  \fpeval{(\xx{1}+\yy{1})/2}  \\
2 & \xx{2} & \yy{2} &  \fpeval{(\xx{2}+\yy{2})/2}  \\
3 & \xx{3} & \yy{3} &    \\
4 & \xx{4} & \yy{4} &    \\
5 & \xx{5} & \yy{5} &    \\ \hline
\end{tabular}

\newarray{zz}

\bigskip

\newcount\counter
\counter=5
\loop
  \setarrayitem{zz}{\counter}{\fpeval{(\xx{\counter}+\yy{\counter})/2}}
  \advance \counter by -1
  \unless\ifnum \counter<1
\repeat

\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \xx{1} & \yy{1} &  \zz{1} \\
2 & \xx{2} & \yy{2} &  \zz{2} \\
3 & \xx{3} & \yy{3} &  \zz{3} \\
4 & \xx{4} & \yy{4} &  \zz{4} \\
5 & \xx{5} & \yy{5} &  \zz{5} \\ \hline
\end{tabular}

\end{document}

在此处输入图片描述

答案2

我并没有真正尝试让你的例子发挥作用,但想提出一种我认为你想做的事情的替代方法。

\documentclass{beamer}
\usepackage{pgfmath}

\begin{document}

\def\xx{{1,2,3,4,5}}
\def\yy{{6,7,8,9,10}}

\newcommand{\Parse}[1]{\pgfmathparse{#1}\pgfmathresult}

\begin{frame}
\begin{table}[]
\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \Parse{\xx[0]} & \Parse{\yy[0]} & \Parse{\xx[0]/2+\yy[0]/2}\\ 
2 & \Parse{\xx[1]} & \Parse{\yy[1]} & \Parse{\xx[1]/2+\yy[1]/2}\\ 
3 & \Parse{\xx[2]} & \Parse{\yy[2]} & \Parse{\xx[2]/2+\yy[2]/2}\\ 
4 & \Parse{\xx[3]} & \Parse{\yy[3]} & \Parse{\xx[3]/2+\yy[3]/2}\\ 
5 & \Parse{\xx[4]} & \Parse{\yy[4]} & \Parse{\xx[4]/2+\yy[4]/2}\\ 
\hline
\end{tabular}
\end{table}

\newcounter{counter}
\setcounter{counter}{4}
\loop
\Parse{\xx[\number\value{counter}]/2+\yy[\number\value{counter}]/2} 
\addtocounter{counter}{-1}
\unless\ifnum\number\value{counter}=-1
\repeat
\end{frame}
\end{document}

在此处输入图片描述

当然,您也可以将结果存储在数组中。(请注意,我\foreach在这里使用它来更容易处理。)

\documentclass{beamer}
\usepackage{pgfmath,pgffor}

\begin{document}

\def\xx{{1,2,3,4,5}}
\def\yy{{6,7,8,9,10}}

\newcommand{\Parse}[1]{\pgfmathparse{#1}\pgfmathresult}

\begin{frame}
\begin{table}[]
\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \Parse{\xx[0]} & \Parse{\yy[0]} & \Parse{\xx[0]/2+\yy[0]/2}\\ 
2 & \Parse{\xx[1]} & \Parse{\yy[1]} & \Parse{\xx[1]/2+\yy[1]/2}\\ 
3 & \Parse{\xx[2]} & \Parse{\yy[2]} & \Parse{\xx[2]/2+\yy[2]/2}\\ 
4 & \Parse{\xx[3]} & \Parse{\yy[3]} & \Parse{\xx[3]/2+\yy[3]/2}\\ 
5 & \Parse{\xx[4]} & \Parse{\yy[4]} & \Parse{\xx[4]/2+\yy[4]/2}\\ 
\hline
\end{tabular}
\end{table}

\foreach \X in {4,3,...,0}
{%
 \pgfmathparse{\xx[\X]/2+\yy[\X]/2}
 \ifnum\X=4
    \xdef\zz{\pgfmathresult}
 \else
    \xdef\zz{\zz,\pgfmathresult}
 \fi     
}
\xdef\zz{{\zz}}
\Parse{\zz[2]}
\end{frame}
\end{document}

答案3

listofitems包可能至少能为您提供存储数组方面所需的一些功能。

\documentclass{beamer}
\usepackage{siunitx,amsmath,xparse,xfp}
\usepackage{listofitems}
\begin{document}
\setsepchar{&}
\readlist\xx{1&2&3&4&5}
\readlist\yy{6&7&8&9&10}
\begin{frame}[fragile]
\begin{table}[]
\begin{tabular}{cccc}
No & xx & yy & zz   \\ \hline
1 & \xx[1] & \yy[1] &  \fpeval{(\xx[1]+\yy[1])/2}  \\
2 & \xx[2] & \yy[2] &  \fpeval{(\xx[2]+\yy[2])/2}  \\
3 & \xx[3] & \yy[3] &    \\
4 & \xx[4] & \yy[4] &    \\
5 & \xx[5] & \yy[5] &    \\ \hline
\end{tabular}
\end{table}
\makeatletter
\def\tmp{}
\foreachitem\z\in\xx[]{%
  \ifnum\zcnt=1\relax\else\g@addto@macro\tmp{&}\fi%
  \edef\tmpA{\fpeval{(\z+\yy[\zcnt])/2}}%
  \expandafter\g@addto@macro\expandafter\tmp\expandafter{\tmpA}}
\makeatother
\readlist\zz{\tmp}
\foreachitem\z\in\zz[]{\zz[-\zcnt] }
\end{frame}
\end{document}

在此处输入图片描述

相关内容