¿Seleccionar un elemento de matriz específico en LuaTeX?

¿Seleccionar un elemento de matriz específico en LuaTeX?

Necesito crear un comando que vaya \MyCommand{x,y}o \MyCommand{x,y,z}(debería ser posible en ambas direcciones), donde x, yy zson tres números. Debería dar la salida \begin{matrix}x\\y\end{matrix}y \begin{matrix}x\\y\\z\end{matrix}, respectivamente.

Y el comando debe tener solo un argumento separado por comas como se representa.

No estoy muy familiarizado con el uso del código Lua en LaTeX. Pero intenté lo siguiente de cualquier manera.

\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
}
}%

Déjeme saber dónde me equivoco o cómo puedo desarrollar este comando.

Estoy usando la distribución MikTeX y el modo de salida LuaLaTeX.

Aquí hay un 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}

Respuesta1

Simplemente haría esto en TeX (nota que omitiste 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}

Para la versión de Lua, debe recordar que las macros se expanden antes de pasarse a lua, por lo que podría incluir \unexpanded{....}el argumento completo, pero también necesitaría que los elementos de su tabla sean la cadena de lua 'x'y no (como la tiene) la lua indefinida. variable x, por lo que necesitaría una capa adicional de comillas de cadena si se hiciera de esa manera. O más simplemente trate todo como una cadena y simplemente reemplácelo ,usando \\un reemplazo de Lua.

\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}

Respuesta2

Otra versión sencilla (pero con expl3). Para la imagen que he reemplazado matrixcon pmatrix. También es extensible (no se especifica el recuento de elementos de la lista de comas).

matriz

\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}

Respuesta3

La siguiente respuesta es muy similar aDavid. La principal diferencia es el uso delcódigo luacopaquete, que proporciona un entorno llamado luacode. Dentro de un entorno, la mayoría de luacodelos caracteres "especiales" de TeX (,,,,,,,, ) #se pueden ingresar directamente. (Esto es particularmente útil para el carácter, que tiene su propio significado especial en algunas de las funciones matemáticas y de coincidencia de patrones de Lua. El único de los caracteres "especiales" de TeX que necesita, bueno, un tratamiento especial es el carácter de barra invertida : debe ingresarse como . Para ingresar una doble barra invertida, uno debe escribir Finalmente, los comentarios de línea estilo Lua son posibles dentro de un entorno.$%^&{}~%\\\\\\\luacode

En una nota aparte: observe el uso de la macro \luastringN, que también proporciona el luacodepaquete, para pasar el argumento de la macro LaTeX a la función Lua. En mi opinión, \luastringN{#1}es más fácil de recordar (y ciertamente más agradable a la vista...) que lo '\luaescapestring{\unexpanded{#1}}'que es. :-)

ingrese la descripción de la imagen aquí

% !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}

información relacionada