如何在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
相关产品推荐
相关产品推荐

