在 Plain-TeX 中,我如何更改存储在宏中的字符串,以便该字符串中的每个空格都变成破折号?例如,如果\def\a{This little example}
,我希望有一些应用于\a
返回“This-little-example”的过程。我知道我可以用来\obeyspaces
对文字字符串进行技巧,
\def\a{This little example}
{\obeyspaces\let =-%
1. This is a test, only a test.
2. \a
}
\bye
但是这个技巧对存储在宏中的字符串不起作用\a
(也就是说,上面的扩展\a
没有被修改,但是第一行确实变成了“1.-This-is-a-test,-only-a---test。”)。
我也尝试过改变空间的 catcode,就像这样
\begingroup
\catcode` =\active
\gdef\swapSpace{%
\catcode` =\active
\def {-}%
}
\endgroup
My test text...% plain text not to be changed...
{\swapSpace
3. My test text... It works, for a literal string...
}
{\swapSpace
4. \a
Yet it fails for the macro above.
}
\bye
但这种方法\a
在所有其他事情扩展之后也失败了。
答案1
您可以替换已由另一个标记(或标记列表)定义的宏中的空格。
\def\replspaces#1#2{\expandafter\replspacesA\expandafter#2#1 \end}
\def\replspacesA#1#2 #3{#2\ifx\end#3\else#1\afterfi{\replspacesA#1#3}\fi}
\def\afterfi#1#2\fi{\fi#1}
% usage: \replspaces\macro{what}
% example:
\def\a{This little example}
\replspaces\a{-}
此宏\replspaces
是可扩展的。您可以通过以下方式将所有空格替换为另一个标记:
\def\a{This little example}
\edef\a{\replspaces\a{?}}
\meaning\a % macro:->This?little?example
答案2
\a
如果在空间处于活动状态时定义,则您的原始内容将起作用,因此
{\obeyspaces\let =-%
\def\a{This little example}
1. This is a test, only a test.
2. \a
}
\bye
或者
{\obeyspaces
\gdef\a{This little example}
}
{\obeyspaces\let =-%
1. This is a test, only a test.
2. \a
}
\bye
如果不可能的话,你可以使用\scantokens
etex (pdftex 或 etex 二进制文件)
\def\a{This little example}
{\obeyspaces\let =-%
1. This is a test, only a test.
2. \scantokens\expandafter{\a}%
}
\bye
答案3
\swapSpace
您可以定义要在其中显示的字符串\scantokens
。
\def\specialdef#1#2{%
\def#1{%
\ifnum\catcode`\ =\active
\scantokens{#2\noexpand\empty}%
\else
#2%
\fi
}%
}
\begingroup
\catcode` =\active
\gdef\swapSpace{%
\catcode` =\active
\def {-}%
}
\endgroup
\specialdef\a{This little example}
My test text...% plain text not to be changed...
\a\ is good
{\swapSpace
3. My test text... It works, for a literal string...
}
{\swapSpace
4. \a is good
}
\bye