- 編輯:TexMaker
- Tex 分布:Latex
我有一个 foreach 语句,并且正在更改 foreach 块内某些数组单元格的值。
但是当我在 foreach 语句块之后使用数组时,似乎更改尚未应用于数组,我很困惑为什么?
这是我的代码:
\documentclass{article}
\usepackage{readarray}
\usepackage{tikz}
\def\mdata{%
top bottom center top bottom
}
\readarray\mdata\mdataA[1,5]
\def\myvar{2}
\begin{document}
\foreach \x [count=\xi] in {1, ..., 5}{
\setvalue\mdataA[1,\xi]{something}
\x . mydata[\xi] = \mdataA[1,\xi] \\
}
-------------------------
\foreach \x [count=\xi] in {1, ..., 5}{
\x . mydata[\xi] = \mdataA[1,\xi] \\
}
\end{document}
输出:
1. mydata[1] = something
2. mydata[2] = something
3. mydata[3] = something
4. mydata[4] = something
5. mydata[5] = something
-------------------------
1. mydata[1] = top
2. mydata[2] = bottom
3. mydata[3] = center
4. mydata[4] = top
5. mydata[5] = bottom
我该如何解决这个问题?我的意思是,我如何才能让一个数组在 foreach 语句中发生变化并产生全局影响?
答案1
循环中的代码\foreach
在组内执行。因此,如果你这样做
\documentclass{article}
\usepackage{pgffor}
\def\testA{A}
\def\testB{B}
\begin{document}
\foreach \x [count=\xi] in {A,B} {%
\expandafter\edef\csname test\x\endcsname{\xi}%
}
testA is \testA
testB is \testB
\end{document}
希望得到
testA 为 1
testB 为 2
那么,对不起,你不会。你会得到
testA 是 A
testB 是 B
\csname
抱歉,和的代码很复杂\expandafter
,但这只是您想要执行的操作的简化版本,与完全readarray
无关。\ifnum
我不确定你是否可以全球做\setvalue
。检查的文档readarray
。另一方面,有很多更好的方法来处理数据数组:也许你应该更清楚你想要做什么。
答案2
我\global
之前只是\setvalue
这样添加的:
\global\setvalue\mdataA[1,\xi]{something}
foreach
现在我也可以看到或块外面的数组单元的变化if-else
。
我不知道这是否是最好的方法,但它足以满足我的要求。
答案3
我不会回答您关于循环范围的具体问题,而是通过合并数组来\foreach
展示仅使用包本身的功能来实现您的目标的方法。readarray
在这里,我将 的默认单元格值设置\initarray
为粗体something
。我可以使用\initarray
创建一个数组,其大小与我希望替换到我的“主”数组中的大小相同(这里\mdataA
,顺便说一下,它是从文件读取而不是从 创建的\def
)。然后,我可以使用\mergearray
将 ed 数组的内容覆盖\initarray
在 master 数组之上。我演示了两次,以便您可以看到可以覆盖部分行或完整行。事实上,如果需要,只需通过 ing 一个 mxn 数组就可以覆盖 mxn 数组\initarray
,尽管我没有在我的 MWE 中展示它。
\begin{filecontents*}[overwrite]{mdata.dat}
a b c d e
top bottom center top bottom
f g h i j
\end{filecontents*}
\documentclass{article}
\usepackage{readarray}
\renewcommand\readarrayinitvalue{\noexpand\textbf{something}}
\begin{document}
\readdef{mdata.dat}\mdata
\readarray\mdata\mdataA[-,\ncols]
\typesetarray\mdataA
\bigskip
\initarray\replacement[1,2]
\mergearray\replacement\mdataA[2,2]
\typesetarray\mdataA
\bigskip
\initarray\replacement[1,5]
\mergearray\replacement\mdataA[2,1]
\typesetarray\mdataA
\end{document}