
Warum kann ich
\startluacode
context.mymacro("\noexpand\\iftrue")
\stopluacode
Aber nicht
\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode
Oder nicht
\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode
Oder nicht
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode
Wobei ich glaube, \iftrue
dass es sich um ein erweiterbares Primitiv handelt.
bearbeiten
\def\mymacro#1{%
\let\mycond#1%
\show\mycond}
Antwort1
\startluacode<code>\stopluacode
lässt sich etwa übersetzen mit:
\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>}}
und was Sie hier stört, ist, dass die <code>
erweitert istzweimal: einmal durch \normalexpanded
(das \expanded
Primitiv) und noch einmal durch \directlua
.
Die erste funktioniert, weil \normalexpanded
Sie nach Abschluss der Erweiterung von übrig bleiben, \directlua{context.mymacro("\\iftrue")}
was das gewünschte Ergebnis liefert. Beachten Sie, dass Sie dort nichts benötigen , da \\
für die Erweiterung auf definiert ist . Sie können das erste Beispiel also folgendermaßen vereinfachen:\12\12
\noexpand
\startluacode
context.mymacro("\\iftrue")
\stopluacode
Der zweite:
\startluacode
context.mymacro([[\noexpand\iftrue]])
\stopluacode
funktioniert nicht, da das \noexpand
mit verschwindet \normalexpanded
und Sie mit übrig bleiben \directlua{context.mymacro([[\iftrue]])}
und dann das zu früh \directlua
erweitert . Sie würden zwei Runden von benötigen :\iftrue
\noexpand
\startluacode
context.mymacro([[\noexpand\noexpand\noexpand\iftrue]])
\stopluacode
Der dritte:
\startluacode
context.mymacro([[\unexpanded{\iftrue}]])
\stopluacode
funktioniert aus drei Gründen nicht: Erstens \unexpanded
ist in ConTeXt das \protected
Primitiv, nicht \unexpanded
. Sie brauchen \normalunexpanded
hier. Zweitens \startluacode
ist in den Klammern Catcode 12, also \normalunexpanded
wird ein Fehler ausgegeben Missing { inserted
. Und drittens ist es dasselbe wie oben: Sie haben zwei Erweiterungsrunden, also brauchen Sie zwei \normalunexpanded
:
\everyluacode\expandafter{\the\everyluacode
\catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro([[\normalunexpanded{\normalunexpanded{\iftrue}}]])
\stopluacode
Der vierte:
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode
funktioniert aus demselben Grund wie oben nicht: Klammern haben den Catcode 12, \luaescapestring
sehen also nie, was {
sie brauchen, und werfen einen Missing { inserted
Fehler aus. Sie müssen zuerst die richtigen Catcodes festlegen:
\everyluacode\expandafter{\the\everyluacode
\catcode`\{=1 \catcode`\}=2\relax} % catcode setting to have braces be braces
\startluacode
context.mymacro("\luaescapestring{\normalunexpanded{\iftrue}}")
\stopluacode