TeX-Bedingungszeichen in Lua

TeX-Bedingungszeichen in Lua

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, \iftruedass es sich um ein erweiterbares Primitiv handelt.

bearbeiten

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

Antwort1

\startluacode<code>\stopluacodelä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 \expandedPrimitiv) und noch einmal durch \directlua.

Die erste funktioniert, weil \normalexpandedSie 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 \noexpandmit verschwindet \normalexpandedund Sie mit übrig bleiben \directlua{context.mymacro([[\iftrue]])}und dann das zu früh \directluaerweitert . 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 \unexpandedist in ConTeXt das \protectedPrimitiv, nicht \unexpanded. Sie brauchen \normalunexpandedhier. Zweitens \startluacodeist in den Klammern Catcode 12, also \normalunexpandedwird 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, \luaescapestringsehen also nie, was {sie brauchen, und werfen einen Missing { insertedFehler 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

verwandte Informationen