TeX condicional en Lua

TeX condicional en Lua

¿Por qué puedo usar

\startluacode
context.mymacro("\noexpand\\iftrue")
\stopluacode

Pero no

\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode

O no

\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode

O no

\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode

Donde creo \iftrueque es un primitivo expandible.

editar

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

Respuesta1

\startluacode<code>\stopluacodese traduce aproximadamente a:

\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>}}

y lo que te muerde aquí es que <code>se expandedos veces: una vez por \normalexpanded(la \expandedprimitiva) y una vez más por \directlua.

El primero funciona porque una vez \normalexpandedterminada la expansión de, te queda \directlua{context.mymacro("\\iftrue")}, que hace lo que quieres. Tenga en cuenta que since \\está definido para expandirse a , no es necesario que esté allí, por lo que puede simplificar el primer ejemplo para:\12\12\noexpand

\startluacode
context.mymacro("\\iftrue")
\stopluacode

El segundo:

\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode

no funciona porque \noexpanddesaparece con \normalexpandedy te quedas con \directlua{context.mymacro([[\iftrue]])}y luego \directluase expande \iftruedemasiado pronto. Necesitarías dos rondas de \noexpand:

\startluacode
context.mymacro([[\noexpand\noexpand\noexpand\iftrue]])
\stopluacode

El tercero:

\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode

no funciona por tres razones: primero, en ConTeXt \unexpandedes la \protectedprimitiva, no \unexpanded. Necesitas \normalunexpandedaquí. En segundo lugar, las llaves interiores \startluacodeson catcode 12, por lo que \normalunexpandedgenerarán un Missing { insertederror. Y el tercero es lo mismo que el anterior: tienes dos rondas de expansión, por lo que necesitas dos \normalunexpanded:

\everyluacode\expandafter{\the\everyluacode
  \catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro([[\normalunexpanded{\normalunexpanded{\iftrue}}]])
\stopluacode

El cuarto:

\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode

no funciona por el mismo motivo que el anterior: las llaves son catcode 12, por lo que \luaescapestringnunca ve lo {que necesita y arroja un Missing { insertederror. Primero debes configurar los catcodes correctos:

\everyluacode\expandafter{\the\everyluacode
  \catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode

información relacionada