宏中是否可以有未确定的字符长度参数?

宏中是否可以有未确定的字符长度参数?

我有以下宏,

\def\RCS$ $#1: #2 $ ${\expandafter\def\csname RCS#1\endcsname{#2}}

用于修订版本控制,即

\RCS$ $Revision: 1.2 $ $
\RCS$ $Date: 2010/04/02 18:20:00 $ $
\lhead{Revision \RCSRevision, \RCSDate}
\pagestyle{fancy}

效果很好。但是,如果我随后使用 latexdiff 处理另一个修订版本,diff 文件无法正确展开宏,

\RCS$ $Revision: \DIFdelbegin \DIFdel{1.2 }\DIFdelend \DIFaddbegin \DIFadd{1.8 }\DIFaddend $ $

有没有办法让它将第二个参数扩展为单个文本块?

(这与我的问题有关latexdiff-cvs 可以处理 RCS 标签吗?

答案1

总编辑:实际上,您需要\edef,它在定义宏之前完全扩展其内容。但是,有一个问题:latexdiff定义\DIFadd\DIFend打印涉及颜色的内容,这对于像您想要的那样解析为文本来说并不是很好的材料。最重要的是,它对\protect它们足够谨慎,并且 的整个目的\protect是干扰正常扩展。因此尝试\edef直接使用会给您一个错误(显然,“TeX 容量超出”)。

然后,我所做的就是临时重新定义这两个宏,让它们按照“逻辑”执行:包含或忽略其内容。由于这不应该是永久性更改,因此我会以组的形式执行,这就要求我使用\xdef,即 的全局版本\edef

这个小程序的工作方式是,它像您\RCS一样抓取美元符号之间的材料,然后将其输入到\edef以生成扩展文本\expandedRCS。然后它将内容放在\expandedRCS另一个宏之后\innerRCS,该宏执行您习惯的操作\RCS\expandedRCS如上所述,它是在一个组中创建的,但是一旦它被定义,我就不再需要\DIFadd和的新定义\DIFend,所以我可以(并且应该)扩展\innerRCS 外部群组。

这是一份完整的文档。latexdiff为了逼真,我附上了序言。

\documentclass{article}
\def\RCS$ $#1$ ${%
 {%
  \renewcommand{\DIFadd}[1]{##1}%
  \renewcommand{\DIFdel}[1]{}%
  \xdef\expandedRCS{#1}%
 }%
 \expandafter\innerRCS\expandedRCS
}
\def\innerRCS#1: #2 {\expandafter\def\csname RCS#1\endcsname{#2}}

%DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF UNDERLINE PREAMBLE %DIF PREAMBLE
\RequirePackage[normalem]{ulem} %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\providecommand{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red}\sout{#1}}}                      %DIF PREAMBLE
%DIF SAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddbegin}{} %DIF PREAMBLE
\providecommand{\DIFaddend}{} %DIF PREAMBLE
\providecommand{\DIFdelbegin}{} %DIF PREAMBLE
\providecommand{\DIFdelend}{} %DIF PREAMBLE
%DIF FLOATSAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddFL}[1]{\DIFadd{#1}} %DIF PREAMBLE
\providecommand{\DIFdelFL}[1]{\DIFdel{#1}} %DIF PREAMBLE
\providecommand{\DIFaddbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFaddendFL}{} %DIF PREAMBLE
\providecommand{\DIFdelbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFdelendFL}{} %DIF PREAMBLE
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF

\begin{document}
\RCS$ $Revision: \DIFdelbegin \DIFdel{1.2 }\DIFdelend \DIFaddbegin \DIFadd{1.8 }\DIFaddend $ $
Revision \RCSRevision.
\end{document}

相关内容