Условный оператор TeX в Lua

Условный оператор TeX в Lua

Почему я могу использовать

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

Но нет

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

Или нет

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

Или нет

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

Где, как я считаю, \iftrueнаходится расширяемый примитив.

редактировать

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

решение1

\startluacode<code>\stopluacodeпереводится примерно как:

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

и что вас здесь кусает, так это то, что <code>расширендважды: один раз \normalexpanded( \expandedпримитивным), и еще раз \directlua.

Первый вариант работает, потому что после завершения расширения \normalexpandedу вас остается \directlua{context.mymacro("\\iftrue")}, что делает то, что вам нужно. Обратите внимание, что поскольку \\определено, чтобы расширить до , вам это не нужно , поэтому вы можете упростить первый пример до:\12\12\noexpand

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

Второй:

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

не работает, потому что \noexpandисчезает с \normalexpanded, и вы остаетесь с \directlua{context.mymacro([[\iftrue]])}, а затем \directluaрасширяет \iftrueслишком рано. Вам понадобится два раунда \noexpand:

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

Третий:

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

не работает по трем причинам: во-первых, в ConTeXt \unexpandedесть \protectedпримитив, а не \unexpanded. Вам нужно \normalunexpandedздесь. Во-вторых, внутри \startluacodeскобок находится catcode 12, поэтому \normalunexpandedвыдаст Missing { insertedошибку. И третье то же самое, что и выше: у вас есть два раунда расширения, поэтому вам нужно два \normalunexpanded:

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

Четвертый:

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

не работает по той же причине, что и выше: скобки — это catcode 12, поэтому \luaescapestringникогда не видит то, {что нужно, и выдает Missing { insertedошибку. Сначала нужно установить правильные catcodes:

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

Связанный контент