如何扩展未扩展宏的参数?

如何扩展未扩展宏的参数?

我已经陷入了永不扩展的宏的困境,并且觉得没有任何帮助我将无法爬出来。

总的来说,我认为我的问题可以表述如下:

当我有一个宏 \x 时我该怎么办不是想要扩展,但想给它提供一个参数 \y,我想要扩大吗?

这不是一个真正定义明确的问题,所以我构建了一个 MWE,经过一些解释后将其完整打印出来。我将首先解释问题的背景,希望它能让我更清楚地明白我想做什么。我使用辅助文件创建了一种剪切和粘贴功能,以便能够在整个文档中复制文本(想法来自这个答案:https://tex.stackexchange.com/a/150839/214956

\makeatletter
\newcommand\ctrlC[1]{
  \immediate\write\@auxout{\unexpanded{\global\long\@namedef{aux_clipboard}{#1}}}%
  #1
}
\newcommand\ctrlV{
  \ifcsname aux_clipboard\endcsname
    \@nameuse{aux_clipboard}
  \else
    ``??''
  \fi
}
\makeatother

(我为这个 MWE 删除了很多功能。)这个想法是命令

ctrlC{This is a test}

将在 aux 文件中创建以下行:

\global \long \@namedef {aux_clipboard}{This is a test}

另一方面,ctrlV 函数可以在 aux 文件中搜索“csname: aux_clipboard”,如果找到则打印存储的文本。

效果很好。

但是,我希望能够从定理环境中复制文本,并且为了自动化此操作,我想出了以下内容(使用 environ-package 通过变量 \BODY 来控制环境的文本主体) - 这是我的问题的 MWE:

\documentclass{article}
\usepackage{environ}

\makeatletter
\newcommand\ctrlC[1]{
  \immediate\write\@auxout{\unexpanded{\global\long\@namedef{aux_clipboard}{#1}}}%
  #1
}
\newcommand\ctrlV{
  \ifcsname aux_clipboard\endcsname
    \@nameuse{aux_clipboard}
  \else
    ``??''
  \fi
}
\makeatother

\NewEnviron{foo}[1]{
\ctrlC{\BODY}
}
\begin{document}

\begin{foo}{a}
This is a test.
\end{foo}

\ctrlV

\end{document}

但是,由于 \BODY 未展开,因此此方法无效。辅助文件如下所示:

\global \long \@namedef {aux_clipboard}{\BODY }

导致错误(这是显而易见的,因为 ctrlV 不知道 \BODY 是什么):

! 未定义控制序列。\aux_clipboard ->\BODY

错误原因如下:

\immediate\write\@auxout{\unexpanded{\global\long\@namedef{aux_clipboard}{#1}}}

我想不是将 @namedef 扩展为 \def,但我将 #1(即 \BODY)展开为文本“This is a test”。总之,我觉得自己像个白痴,无法弄清楚如何在将 \BODY 写入辅助文件之前将其展开...

如果有人能告诉我如何解决这个具体问题,或者有人能对我最初的模糊问题给出一般性答案,我会非常高兴。提前谢谢!

答案1

您想\BODY在将其传递给之前进行扩展\ctrlC

\documentclass{article}
\usepackage{environ}

\makeatletter
\newcommand\ctrlC[1]{%
  \immediate\write\@auxout{%
    \unexpanded{\global\long\@namedef{aux_clipboard}{#1}}%
  }%
  #1%
}
\newcommand\ctrlV{%
  \ifcsname aux_clipboard\endcsname
    \@nameuse{aux_clipboard}%
  \else
    ``??''%
  \fi
}
\makeatother

\NewEnviron{foo}[1]{%
  \expandafter\ctrlC\expandafter{\BODY}%
}

\begin{document}

\begin{foo}{a}
This is a test.
\end{foo}

\ctrlV

\end{document}

这是生成的文件的内容.aux

\relax 
\global \long \@namedef {aux_clipboard}{This is a test.}

我添加了几个缺失的%字符。

一个expl3版本:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\ctrlC}{m}
 {
  \iow_now:cn { @auxout } 
   {
    \global\long\@namedef{aux_clipboard}{#1}
   }
  #1
}

\NewDocumentCommand{\ctrlV}{}
 {
  \cs_if_exist_use:cF { aux_clipboard } { ``??'' }
 }
\ExplSyntaxOff

\NewDocumentEnvironment{foo}{mb}
 {\ctrlC{#2}}
 {}

\begin{document}

\begin{foo}{a}
This is a test.
\end{foo}

\ctrlV

\end{document}

相关内容