我已经陷入了永不扩展的宏的困境,并且觉得没有任何帮助我将无法爬出来。
总的来说,我认为我的问题可以表述如下:
当我有一个宏 \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}