为什么我的宏没有在 \special{...} 内扩展?

为什么我的宏没有在 \special{...} 内扩展?

我正在编写我的第一个 LaTeX/TeX 宏,但还没有用到任何地方。您能告诉我下面代码中我做错了什么吗?

我有以下定义。

\def\defcolor#1#2{%
   \expandafter\def\csname #1\endcsname{#2}}

\def\colortext#1#2{%
   \special{ts: text fillcolor \csname#1\endcsname}{#2}%
}

我在我的 LaTeX 文件中使用它们如下:

\defcolor{red}{1.0,0.0,0.0}

现在当我使用时,\red我在文本中看到 1.0,0.0,0.0。这正是我所期望和高兴看到的!问题在于命令\colortext。当我\colortext像下面这样调用命令时

\colortext{red}{sometext}

我在 .dvi 文件中看到以下输出

ts: text fillcolor \red

而不是我想要的

ts: text fillcolor 1.0,0.0,0.0

\red未在\colortext宏的替换文本中展开。如何修复此问题?

答案1

首先确保\red在使用之前已定义\colortext,因为\csname UndefinedMacro\endcsname只会扩展到到目前为止\UndefinedMacro,而不会进一步扩展。

您可以为此添加一个测试:

\makeatletter
\def\colortext#1#2{%
   \@ifundefined{#1}
      {\PackageError{yourpackage}{Color '#1' not defined yet!}{}}
      {\special{ts: text fillcolor \csname#1\endcsname}{#2}}%
}
\makeatother

如果这不是问题,请手动扩展它:

\makeatletter
\def\colortext#1#2{%
   \@ifundefined{#1}
      {\PackageError{yourpackage}{Color '#1' not defined yet!}{}}
      {{\edef\@tempa{\noexpand\special{ts: text fillcolor \csname#1\endcsname}}\@tempa{#2}}%
}
\makeatother

然后您可以在\show\@tempa其定义后添加来调试它。

注意第二点{ },保持\@tempa本地化。我假设这里\special不介意组

答案2

试试这个方法

\documentclass{article}

\makeatletter
\def\defcolor#1#2{\@namedef{#1}{#2}}%
\def\colortext#1#2{\special{ts: text fillcolor \@nameuse{#1}}{#2}}
\makeatother
\begin{document}

\defcolor{red}{1.0,0.0,0.0}

\colortext{red}{sometext}

\end{document}

相关内容