更改 foreach 内部数组的值不会影响 foreach 外部的数组

更改 foreach 内部数组的值不会影响 foreach 外部的数组
  • 編輯: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}

在此处输入图片描述

相关内容