forarray 和 \gdef 列表参数

forarray 和 \gdef 列表参数
\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

相关内容