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 z
drei 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. x
Wenn 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 matrix
durch ersetzt pmatrix
. Es ist auch erweiterbar (die Anzahl der Elemente der Kommaliste ist nicht angegeben).
\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 luacode
die 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 luacode
Paket 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. :-)
% !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}