添加存储在数组中的值

添加存储在数组中的值
\documentclass[a4paper,10pt]{article}
\usepackage{arrayjob}
\begin{document}
\newarray\cws
\cws(0)=3pt
\cws(1)=4pt
\let\a\dimexpr\cws(0)+\cws(1)\relax
\a
\end{document}

错误:!您不能在水平模式下使用“\dimexpr”。

这也不起作用:

\let\a\z@
\advance\a\cws(0)
\advance\a\cws(1)
\a

如何创建数组中元素的总和(arrayjob)?

答案1

数组符号实际上并没有帮助,特别是在你的问题中实现它不可扩展,所以不能在很多地方使用,例如\dimexpr

这是一个可扩展的版本:

在此处输入图片描述

\documentclass[a4paper,10pt]{article}

\def\set#1#2#3{\expandafter\def\csname#1#2\endcsname{#3}}
\def\use#1#2{\csname#1#2\endcsname}
\begin{document}

\set{cws}{0}{3pt}
\set{cws}{1}{4pt}


\the\dimexpr\use{cws}{0}+\use{cws}{1}\relax


\end{document}

答案2

这是一份工作expl3

\documentclass{article}
\pagestyle{empty}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_nagylzs_cws_seq

\NewDocumentCommand \ArraySet { m }
 {
  \seq_set_from_clist:Nn \l_nagylzs_cws_seq { #1 }
 }

\NewDocumentCommand \ArraySum { m }
 {
  \dim_zero:N \l_tmpa_dim
  \seq_map_inline:Nn \l_nagylzs_cws_seq
  {
   \dim_add:Nn \l_tmpa_dim { ##1 }
  }
  #1 = \l_tmpa_dim
}
\ExplSyntaxOff
\begin{document}
\ArraySet{3pt,4pt,4ex,1in}
\ArraySum{\dimen0}
\the\dimen0
\end{document}

在此处输入图片描述


这是上述代码的完全不可读的版本,它违反了所有expl3标准,但却满足了最少行标准。

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\def\ArraySet#1{\seq_set_from_clist:Nn\cws{#1}}
\def\ArraySum#1{\dim_zero:N\l_tmpa_dim
  \seq_map_inline:Nn\cws{\dim_add:Nn\l_tmpa_dim{##1}}
  #1=\l_tmpa_dim}
\ExplSyntaxOff
\begin{document}
\ArraySet{3pt,4pt,4ex,1in}
\ArraySum{\dimen0}
\the\dimen0
\end{document}

答案3

首先你应该使用arrayjobx而不是arrayjob(后者与 LaTeX 并不真正兼容)。

其次,\let\a\dimexpr\a相当于\dimexpr并尝试打印\cws(0)+\cws(1)\relax;然后\a会产生错误,就像

\dimexpr
\end{document}

您应该使用\newcommand而不是\let,但无论如何它都不会起作用,因为\cws(0)在`\dimexpr 内部并不好,因为它需要在该上下文中未执行的分配。

expl3这是使用及其属性列表的不同实现。

\documentclass[a4paper,10pt]{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DeclareArray}{m}
 {
  \prop_new:c { l_nagylzs_array_#1_prop }
  \cs_new:cpn { #1 } ##1 { \prop_item:cn { l_nagylzs_array_#1_prop } { ##1 } }
 }
\NewDocumentCommand{\setarray}{mmm}
 {
  \prop_put:cnn { l_nagylzs_array_#1_prop } { #2 } { #3 }
 }
\ExplSyntaxOff


\begin{document}
\DeclareArray{cws}
\setarray{cws}{0}{3pt}
\setarray{cws}{1}{4pt}
\setarray{cws}{2}{1in}

\newcommand\foo{\dimexpr\cws{0}+\cws{1}+\cws{2}\relax}

A\hspace{\foo}B

A\hspace{\dimexpr\cws{0}+\cws{1}\relax}B

A\hspace{\dimexpr\cws{0}\relax}B

\end{document}

在此处输入图片描述

无软件包版本,但灵活性较差。

\documentclass[a4paper,10pt]{article}

\makeatletter
\newcommand\newarray[1]{%
  \newcommand{#1}[1]{\@nameuse{nagylzs@\string#1@##1}}%
}
\newcommand{\set}[3]{\@namedef{nagylzs@\string#1@#2}{#3}}
\makeatother

\begin{document}
\newarray{\cws}
\set\cws{0}{3pt}
\set\cws{1}{4pt}
\set\cws{2}{1in}

\newcommand\foo{\dimexpr\cws{0}+\cws{1}+\cws{2}\relax}

A\hspace{\foo}B

A\hspace{\dimexpr\cws{0}+\cws{1}\relax}B

A\hspace{\dimexpr\cws{0}\relax}B

\end{document}

解释:TeX 中没有数组数据类型,因此必须自行构建。此实现使用\csname一种关联内存。

定义数组只是定义一个使用 存储的值的命令\set。该命令\cws{0}扩展为

\@nameuse{nagylzs@\string\cws@0}

这与

\csname nagylzs@\string\cws@0\endcsname

请注意,它\cws是“字符串化的”,因此它可以出现在中\csname...\endcsname。该命令执行\set关联:\set\cws{0}{3pt}

\@namedef{nagylzs@\string\cws@0}{4pt}

这与

\expandafter\def\csname nagylzs@\string\cws@0\endcsname{4pt}

因此,关联以宏的名称表示。宏名称很复杂,以避免与其他宏发生冲突。

答案4

已编辑:这是使用该包的不同方法listofitems。已编辑以演示数组中不同单位集的功能。

\documentclass[a4paper,10pt]{article}
\usepackage{listofitems}
\setsepchar{ }
\begin{document}
\def\data{3pt 4ex 1in}% space separated data
\readlist\cws{\data}% reads \data into list named "cws" 

A\hspace{\dimexpr\cws[1]+\cws[2]+\cws[3]}B

A\hspace{\dimexpr\cws[1]+\cws[2]}B

A\hspace{\dimexpr\cws[1]}B
\end{document}

在此处输入图片描述

相关内容