luatex:token.set_macro() 问题

luatex:token.set_macro() 问题

在下面的 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
                 
? 

相关内容