
Почему я могу использовать
\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