detokenize 在命令序列后产生不需要的空格

detokenize 在命令序列后产生不需要的空格

我制作了一个简单的宏,名为 ,\cmd{}它可以对输入进行去标记化。我想准确打印所示内容,并且它按我的要求工作,只是它似乎在输入的命令序列和花括号之间产生了一个空格。

\documentclass{article}
\newcommand{\cmd}[1]{\texttt{\detokenize{#1}}}
\begin{document}
\cmd{\test{}}
\end{document}

结果是\test {}

在此处输入图片描述

编辑:我想要一个逐字的宏,\cmd{}它执行以下操作:

\cmd{\test{}}\test{}

编辑:我确实尝试了提出的解决方案去标记化不需要额外的空格吗?,但没有成功。我正在使用 LuaLaTeX。

答案1

当扫描参数时\test{},它会被标记为三个标记:\test{}\detokenize原语总是打印标记,该标记是由空格分隔的控制序列,因此,它会打印\test {}

如果要保留参数中写入的间距,则必须以逐字模式读取它。 这意味着文本中的{和必须读作正常字符。 但是参数由和分隔,在这种情况下它们不能是正常字符。 这几乎不可能将内部读取为正常字符并在参数周围使用。 因此,我建议对参数分隔符使用不同的括号:}\test{}{}{}{...}

\def\cmd{\bgroup\def\do##1{\catcode`##1=12}\dospecials \cmdA}
\def\cmdA[#1]{\egroup{\tt#1}}

\cmd[\test{}]

\另一种方法是仅将和设置为普通字符,读取参数(带有匹配的括号)并\detokenize在其后执行:

\def\cmd{\bgroup\catcode`\\=12 \catcode`\ =12 \cmdA}
\def\cmdA#1{\egroup{\tt\detokenize{#1}}}

second test: \cmd{\test{}}

相关内容