问:循环遍历宏主体中的所有标记

问:循环遍历宏主体中的所有标记

我正在寻找循环遍历宏定义中的所有标记的 TeX 代码。 \meaning将所有内容转换为“其他”(catcode 12)字符,因此不直接适合(有或没有\@strip@prefix)。

有任何想法吗?

答案1

穷人的方式。如果我理解正确的话,你想要全部含义中遇到的宏(即使在括号内)。

\documentclass{article}

\makeatletter
\def\fetchsubmacros#1{\def\fsm@temp{#1}\expandafter\fsm@i\meaning\fsm@temp~}
\catcode`& 7
\def\fsm@i#1->#2~%
   {\begingroup\ttfamily\catcode`\{=9 \catcode`\}=9 \everyeof{&}%
    \makeatletter\scantokens{\fsm@ii#2}}
\def\fsm@ii#1{\ifx&#1\endgroup\expandafter\@gobbletwo\fi\fsm@iii#1}
\catcode`& 4
\def\fsm@iii#1{\ifcat\relax\noexpand#1Found: \string#1\par\fi\fsm@ii}
\makeatother                       

\begin{document}


\fetchsubmacros{What \textit{\foo macros} are \bar contained \textbf{in \emph{this argument}} \relax??}

\end{document}

在此处输入图片描述

答案2

回应 OP 的评论,“最终,我想列出 的定义中的所有宏\zz。”

编辑:我重新制定了与软件包相关的答案tokcycle,因为我发现 3.5 年前的原始答案无法很好地处理控制序列嵌入到宏内的组内的情况。现在,嵌套组对任务不构成挑战。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tokcycle}
\newcommand\looptokens[1]{\expandafter\looptokensaux\expandafter{#1}{#1}}
\newcommand\looptokensaux[2]{%
  The macro \detokenize{#2}contains these control sequences:
  \tokcycle{}{\processtoks{##1}}{\detokenize{##1}}{}{#1}}
\begin{document}
\def\zz{What \textit{\textsc{macros like \today}} are contained 
  \textbf{in this argument} \relax??}
\looptokens{\zz}
\end{document}

在此处输入图片描述

相关内容