You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plain TeX中实现类数组结构遍历与forEach循环?

Plain TeX实现类数组结构与遍历的方案

Plain TeX本身没有内置的数组和foreach循环语法,但可以通过自定义递归宏实现完全等价的效果,符合DRY原则。

基础实现代码

以下是可直接运行的完整代码,输出效果和你手动调用三次\f完全一致:

% 定义通用遍历宏:\foreach<元素列表>{<每个元素执行的操作>},默认用逗号分隔元素
\def\foreach#1#2{\docycle#1,\endcycle,{#2}}
\def\docycle#1,{%
  \ifx\endcycle#1\else
    \docycledo{#1}%
    \expandafter\docycle
  \fi
}
\def\docycledo#1#2{#2{#1}}

% 自定义业务逻辑函数,和你原来的定义完全一致
\def\f#1{This is #1 \par}

% 定义类数组:把所有参数存在一个宏里,后续修改仅需调整此处
\def\paramList{param1,param2,param3}

% 一行调用遍历,无需重复写\f
\expandafter\foreach\expandafter{\paramList}{\f}

\end

核心特性说明

  • 如果你不需要单独保存参数列表,也可以直接把元素写在遍历调用里:\foreach{param1,param2,param3}{\f},效果相同。
  • 支持嵌套循环,和Python里的嵌套for逻辑一致,仅需注意内层循环的参数用##1避免和外层冲突,示例如下:
    \def\f#1#2{第一个参数:#1,第二个参数:#2 \par}
    \def\listA{val1,val2,val3}
    \def\listB{opt1,opt2,opt3}
    
    % 两层循环做笛卡尔积调用\f
    \expandafter\foreach\expandafter{\listA}{
      \def\outerVal{##1}
      \expandafter\foreach\expandafter{\listB}{
        \f{\outerVal}{##1}
      }
    }
    
  • 可以自行修改宏定义里的分隔符,把逗号换成空格、分号等其他符号适配不同的使用场景。

实现优势

  • 仅需定义一次业务函数,后续遍历直接调用通用宏即可
  • 参数列表统一维护,修改参数不需要调整调用逻辑,完全符合DRY原则
  • 支持任意层级的循环嵌套,适配复杂的批量调用场景

内容的提问来源于stack exchange,提问作者user32882

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:06:03