Ein bestimmtes Array-Element in LuaTeX auswählen?

Ein bestimmtes Array-Element in LuaTeX auswählen?

Ich muss einen Befehl erstellen, der \MyCommand{x,y}„oder “ lautet \MyCommand{x,y,z}(beide Richtungen sollten möglich sein), wobei x, y, und zdrei Zahlen sind. Er sollte jeweils die Ausgabe „ \begin{matrix}x\\y\end{matrix}und“ liefern \begin{matrix}x\\y\\z\end{matrix}.

Und der Befehl sollte nur ein Argument in einer durch Kommas getrennten Form haben, wie dargestellt.

Ich bin nicht sehr vertraut mit der Verwendung von Lua-Code in LaTeX. Aber ich habe trotzdem Folgendes versucht.

\newcommand*{\MyCommand}[1]{%
\directlua {
  str={#1}
    if str[3]==nil then
       tex.sprint([[\begin{matrix}]] .. str[1] .. [[\\]] .. str[2] .. [[\\]] .. [[\end{matrix}]])
    else
       tex.sprint([[\begin{matrix}]] .. str[1] .. [[\\]] .. str[2] .. [[\\]] .. str[3] .. [[\end{matrix}]])
    end
}
}%

Bitte lassen Sie mich wissen, wo ich falsch liege oder wie ich diesen Befehl weiterentwickeln kann.

Ich verwende die MikTeX-Distribution und den LuaLaTeX-Ausgabemodus.

Hier ist ein MWE

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\MyCommand}[1]{%
\directlua {
  str={#1}
    if str[3]==nil then
       tex.sprint([[\begin{matrix}]] .. str[1] .. [[\\]] .. str[2] .. [[\\]] .. [[\end{matrix}]])
    else
       tex.sprint([[\begin{matrix}]] .. str[1] .. [[\\]] .. str[2] .. [[\\]] .. str[3] .. [[\end{matrix}]])
    end
}
}%

\begin{document}

$\MyCommand{x,y}$\\
$\MyCommand{x,y,z}$

\end{document}

Antwort1

Ich würde das einfach in TeX machen (beachten Sie, dass Sie es ausgelassen haben amsmath)

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\MyCommand}[1]{\begin{matrix}\relax\zz#1,\end{matrix}}
\def\zz#1,#2{#1\ifx\end#2\else\expandafter\\\expandafter\zz\fi#2}

\begin{document}


$\MyCommand{x,y}$

$\MyCommand{x,y,z}$

\end{document}

Bei der Lua-Version müssen Sie bedenken, dass Makros erweitert werden, bevor sie an Lua übergeben werden. Sie könnten also \unexpanded{....}das vollständige Argument einfügen, aber dann müssten die Elemente Ihrer Tabelle auch die Lua-Zeichenfolge sein und 'x'nicht (wie Sie es haben) die undefinierte Lua-Variable. xWenn Sie das so machen, benötigen Sie also eine zusätzliche Ebene von Zeichenfolgenanführungen. Oder behandeln Sie das Ganze einfach als Zeichenfolge und ersetzen Sie es ,mit \\einem Lua-Ersetzungsbefehl .

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\MyCommand}[1]{%
\begin{matrix}%
\directlua{
s=string.gsub('\luaescapestring{#1}',',','\string\\\string\\')
tex.sprint(s)}%
\end{matrix}}

\begin{document}



$\MyCommand{x,y}$

$\MyCommand{x,y,z}$

\end{document}

Antwort2

Eine weitere einfache Version (aber mit expl3). Für das Bild habe ich matrixdurch ersetzt pmatrix. Es ist auch erweiterbar (die Anzahl der Elemente der Kommaliste ist nicht angegeben).

Matrix

\documentclass{article}
\usepackage{amsmath}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand { \MyCommand } { m }
    {
        \begin{matrix}
            \seq_set_from_clist:Nn \l_tmpa_seq { #1 }
            \seq_use:Nn \l_tmpa_seq { \\ }
        \end{matrix}
    }
\ExplSyntaxOff

\begin{document}

$\MyCommand{x,y}$

$\MyCommand{x,y,z}$

$\MyCommand{x,y,z,a,b}$

\end{document}

Antwort3

Die folgende Antwort ist sehr ähnlich zuDavidsDer Hauptunterschied ist die Verwendung derluacodePaket, das eine Umgebung namens bereitstellt luacode. Innerhalb einer Umgebung können luacodedie meisten „Sonderzeichen“ von TeX – #, $, %, ^, , &, {, }, – direkt eingegeben werden. (Dies ist besonders nützlich für das Zeichen, das in einigen der Mustervergleichs- und mathematischen Funktionen von Lua eine eigene Sonderbedeutung hat. Das einzige „Sonderzeichen“ von TeX, das, nun ja, eine Sonderbehandlung benötigt, ist der Backslash, : er muss als eingegeben werden . Um einen doppelten Backslash einzugeben, muss man eingeben . Schließlich sind Zeilenkommentare im Lua-Stil innerhalb einer Umgebung möglich.~%\\\\\\\luacode

Eine separate Anmerkung: Beachten Sie die Verwendung des Makros \luastringN, das ebenfalls vom luacodePaket bereitgestellt wird, um das Argument des LaTeX-Makros an die Lua-Funktion zu übergeben. Meiner Ansicht nach \luastringN{#1}ist es leichter zu merken (und sicherlich angenehmer für die Augen...) als '\luaescapestring{\unexpanded{#1}}'es ist. :-)

Bildbeschreibung hier eingeben

% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' env. and '\luastringN' macro

%% Lua-side code
\begin{luacode}
function comma2double_backslash ( s )
   -- replace all commas with double-backslashes
   tex.sprint ((s:gsub ( ',' , '\\\\' )))
end
\end{luacode}
%% TeX-side code
\newcommand*{\MyCommand}[1]{%
   \begin{array}{@{}c@{}}
   \directlua{comma2double_backslash ( \luastringN{#1} )}
   \end{array}%
}

\begin{document}
$\MyCommand{x,y}$

$\MyCommand{x,y,z}$
\end{document}

verwandte Informationen