在 Plain-TeX 中将空格改为破折号

在 Plain-TeX 中将空格改为破折号

在 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

如果不可能的话,你可以使用\scantokensetex (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

在此处输入图片描述

相关内容