在下面的 MWE 中,我首先定义\command(A|B|C|D)
哪些扩展为\cmd(A|B|C|D)
哪些都扩展为THE COMMAND
。这些都没有使用\edef
,所以我应该不会对\commandX
首先定义有任何问题。但我注意到,如果我使用函数lua
首先token.set_macro
定义\commandB -> \cmdB
然后\cmdB -> THE COMMAND
,结果并不相同,并且\
似乎被忽略了。但是,如果我交换顺序,它会按预期工作。也许这是一个错误?请注意,我也在单独的.lua
文件中测试了这一点,这不是luacode
问题。
\documentclass{article}
\usepackage{luacode}
\begin{document}
% \edef\commandA{\cmdE} % error, because \cmd is not defined yet
% \edef\cmdE{THE COMMAND} %
\gdef\commandA{\cmdA}
\gdef\cmdA{THE COMMAND}
\begin{luacode*}
-- the problem: the \\ seems to be ignored
token.set_macro('commandB', '\\cmdB', 'global')
token.set_macro('cmdB', 'THE COMMAND', 'global')
-- but if I do define \cmdC first, it accepts it as I like
token.set_macro('cmdC', 'THE COMMAND', 'global')
token.set_macro('commandC', '\\cmdC', 'global')
-- should I forego token.set_macro and just do this?
tex.print('\\gdef\\commandD{\\cmdD}')
tex.print('\\gdef\\cmdD{THE COMMAND}')
\end{luacode*}
\commandA\\
\commandB\\
\commandC\\
\commandD
% https://www.pragma-ade.com/general/manuals/luatex.pdf
% manual page 217 says "the results are like \gdef
\end{document}
答案1
luatex 手册中的某处有关于此问题的警告。token.set_macro
确实需要令牌已经存在于哈希表中。
如果你拆分你的代码
\documentclass{article}
\usepackage{luacode}
\begin{document}
% \edef\commandA{\cmdE} % error, because \cmd is not defined yet
% \edef\cmdE{THE COMMAND} %
\gdef\commandA{\cmdA}
\gdef\cmdA{THE COMMAND}
\begin{luacode*}
-- the problem: the \\ seems to be ignored
token.set_macro('commandB', '\\cmdB', 'global')
\end{luacode*}
\show\commandB
然后它报告
> \commandB=macro:
->BADcmdB.
l.16 \show\commandB
?
as\cmdB
并未引用 csnames 哈希表中的条目。
如果您早些时候使用该 csname 执行或多或少的任何事情,\cmdB
那么它会按您预期的方式工作:
\documentclass{article}
\usepackage{luacode}
\begin{document}
% \edef\commandA{\cmdE} % error, because \cmd is not defined yet
% \edef\cmdE{THE COMMAND} %
\gdef\commandA{\cmdA}
\gdef\cmdA{THE COMMAND}
\def\wibble{\cmdB}
\begin{luacode*}
-- the problem: the \\ seems to be ignored
token.set_macro('commandB', '\\cmdB', 'global')
\end{luacode*}
\show\commandB
使
> \commandB=macro:
->\cmdB .
l.17 \show\commandB
?