
¿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 \iftrue
que es un primitivo expandible.
editar
\def\mymacro#1{%
\let\mycond#1%
\show\mycond}
Respuesta1
\startluacode<code>\stopluacode
se 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 \expanded
primitiva) y una vez más por \directlua
.
El primero funciona porque una vez \normalexpanded
terminada 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 \noexpand
desaparece con \normalexpanded
y te quedas con \directlua{context.mymacro([[\iftrue]])}
y luego \directlua
se expande \iftrue
demasiado 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 \unexpanded
es la \protected
primitiva, no \unexpanded
. Necesitas \normalunexpanded
aquí. En segundo lugar, las llaves interiores \startluacode
son catcode 12, por lo que \normalunexpanded
generarán un Missing { inserted
error. 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 \luaescapestring
nunca ve lo {
que necesita y arroja un Missing { inserted
error. 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