我正在编写我的第一个 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}