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