\documentclass{article}
\usepackage{forarray}
\begin{document}
\newcommand{\mytext}[1]{\gdef\themytext{#1}}
\newcommand{\mytest}[1]{\ForEach{,}{\typeout{\thislevelitem}}{#1}}
% this one works, it prints
% x
% y
% z
\mytest{x,y,z}
% this one doesn't work, it prints
% x,y,z
\mytext{x,y,z}
\mytest{\themytext}
\end{document}
\ForEach
这是我编写 LaTeX 类文件时遇到的问题的简化示例。当列表参数通过全局宏定义传入时,我无法工作。
我怎样才能修改的定义\mytex
以使示例能够正常工作?
谢谢
答案1
这对我有用:
\documentclass{article}
\usepackage{forarray}
\begin{document}
\newcommand{\mytext}[1]{\gdef\themytext{#1}}
\newcommand{\mytest}[1]{\ForEachX{,}{\typeout{\thislevelitem}}{#1}}
% this one works, it prints
% x
% y
% z
\mytest{x,y,z}
% this one works, it prints
% x
% y
% z
\mytext{x,y,z}
\mytest{\themytext}
\end{document}
请注意使用\ForEachX
,它扩展了第三个参数,而不是\ForEach
。
答案2
如果你愿意修改你的呼叫方式\mytest
,那么
\expandafter\mytest\expandafter{\themytext}
给出
X
是
是
或者你可以定义\mytest
不同
\makeatletter
\newcommand{\mytest}[1]{\edef\mylist{#1}%
\expandafter\@mytest\expandafter{\mylist}}%
\newcommand{\@mytest}[1]{\ForEach{,}{\typeout{\thislevelitem}}{#1}}
\makeatother