我有一个宏可以帮助我使用 lua 以各种方式打印出(或做任何事情)源代码:
宏是
\def\SourceCode{%
\begingroup%
\endlinechar`\^^J%
\catcode`\\=12\catcode`\^^M=12\catcode`\#=12\catcode`\~=12\catcode`\%=12\catcode`\^=12\catcode`\_=12\catcode`\@=12\catcode`\ =12\catcode`\|=12%
\SourceCodeAux}%
\def\SourceCodeAux#1#2{\endgroup\directlua{print("\luaescapestring{#1}")}}%
在这种情况下,我们只需将代码打印到控制台来查看它是否正确。
问题是\detokenize
在宏后面添加了一个空格。有什么方法可以阻止或逆转此行为吗?(我在想,如果我们可以使用不同的、不可见的或未在源代码块中使用的转义字符,那么也许可以吗?)
\documentclass{minimal}
\usepackage{luatex}\directlua{tex.enableprimitives('',tex.extraprimitives())}
\def\SourceCode{%
\begingroup%
\endlinechar`\^^J%
\catcode`\\=12\catcode`\^^M=12\catcode`\#=12\catcode`\~=12\catcode`\%=12\catcode`\^=12\catcode`\_=12\catcode`\@=12\catcode`\ =12\catcode`\|=12%
\SourceCodeAux}%
\def\SourceCodeAux#1#2{\endgroup\directlua{print("\luaescapestring{#1}")}}%
\begin{document}
\SourceCode{
\documentclass{minimal}
\def\SourceCode{%
\begingroup%
\obeyspaces%
\endlinechar`\^^J%
\catcode`\^^M=13%
\SourceCodeAux}%
\def\SourceCodeAux#1#2{\directlua{print("\luaescapestring\expandafter{\detokenize{#1}}")}\endgroup}%
}
\end{document}
答案1
通过使用\catcode'\\=12
和删除\detokenizer
似乎可以有效地对代码块进行去标记化:
\def\SourceCode{%
\begingroup%
\endlinechar`\^^J%
\catcode`\\=12\catcode`\^^M=12\catcode`\#=12\catcode`\~=12\catcode`\%=12\catcode`\^=12\catcode`\_=12\catcode`\@=12\catcode`\ =12\catcode`\|=12%
\SourceCodeAux}%
\def\SourceCodeAux#1#2{\endgroup\directlua{print("\luaescapestring{#1}")}}%