TeX Condicional em Lua

TeX Condicional em Lua

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 \iftrueser um primitivo expansível.

editar

\def\mymacro#1{%
    \let\mycond#1%
    \show\mycond}

Responder1

\startluacode<code>\stopluacodetraduz 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 \expandedprimitivo) 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 \noexpanddesaparece com \normalexpandede você fica com \directlua{context.mymacro([[\iftrue]])}e depois \directluaexpande \iftruemuito 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 \protectedprimitivo, não o \unexpanded. Você precisa \normalunexpandedaqui. Em segundo lugar, entre \startluacodecolchetes está o código de gato 12, portanto \normalunexpandedocorrerá um Missing { insertederro. 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 \luaescapestringnunca vê o {que precisa e gera um Missing { insertederro. 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

informação relacionada