
Por que posso usar
\startluacode
context.mymacro("\noexpand\\iftrue")
\stopluacode
Mas não
\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode
Ou não
\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode
Ou não
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode
Onde acredito \iftrue
ser um primitivo expansível.
editar
\def\mymacro#1{%
\let\mycond#1%
\show\mycond}
Responder1
\startluacode<code>\stopluacode
traduz aproximadamente para:
\begingroup
<catcode settings> (basically verbatim, but \ is catcode 0)
<shorthands> (\\ is defined to be the two backslash characters, as
well as \|, \-, \(, \), \{, \}, etc.)
\normalexpanded {\endgroup \noexpand \directlua {<code>}}
e o que está incomodando você aqui é que o <code>
está expandidoduas vezes: uma vez por \normalexpanded
(o \expanded
primitivo) e mais uma vez por \directlua
.
O primeiro funciona porque terminada a expansão \normalexpanded
, você fica com \directlua{context.mymacro("\\iftrue")}
, que faz o que você quiser. Observe que como \\
está definido para expandir para , você não precisa disso, então você pode simplificar o primeiro exemplo para:\12\12
\noexpand
\startluacode
context.mymacro("\\iftrue")
\stopluacode
O segundo:
\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode
não funciona porque \noexpand
desaparece com \normalexpanded
e você fica com \directlua{context.mymacro([[\iftrue]])}
e depois \directlua
expande \iftrue
muito cedo. Você precisaria de duas rodadas de \noexpand
:
\startluacode
context.mymacro([[\noexpand\noexpand\noexpand\iftrue]])
\stopluacode
O terceiro:
\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode
não funciona por três motivos: primeiro, no ConTeXt \unexpanded
é o \protected
primitivo, não o \unexpanded
. Você precisa \normalunexpanded
aqui. Em segundo lugar, entre \startluacode
colchetes está o código de gato 12, portanto \normalunexpanded
ocorrerá um Missing { inserted
erro. E o terceiro é igual ao anterior: você tem duas rodadas de expansão, então precisa de duas \normalunexpanded
:
\everyluacode\expandafter{\the\everyluacode
\catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro([[\normalunexpanded{\normalunexpanded{\iftrue}}]])
\stopluacode
O quarto:
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode
não funciona pelo mesmo motivo acima: os colchetes são catcode 12, então \luaescapestring
nunca vê o {
que precisa e gera um Missing { inserted
erro. Você precisa definir os catcodes corretos primeiro:
\everyluacode\expandafter{\the\everyluacode
\catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode