我制作了一个简单的宏,名为 ,\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{}}