Selecionando um elemento específico do array no LuaTeX?

Selecionando um elemento específico do array no LuaTeX?

Preciso criar um comando que vá \MyCommand{x,y}ou \MyCommand{x,y,z}(ambas as formas devem ser possíveis), onde x, ye zsão três números. Deve fornecer a saída \begin{matrix}x\\y\end{matrix}e \begin{matrix}x\\y\\z\end{matrix}, respectivamente.

E o comando deve ter apenas um argumento separado por vírgula, conforme representado.

Não estou muito familiarizado com o uso do código Lua em LaTeX. Mas tentei o seguinte de qualquer maneira.

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

Por favor, deixe-me saber onde estou enganado ou como posso desenvolver este comando.

Estou usando a distribuição MikTeX e o modo de saída LuaLaTeX.

Aqui está um 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}

Responder1

Eu faria isso apenas no TeX (observe que você omitiu 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 a versão Lua você precisa lembrar que as macros se expandem antes de serem passadas para lua para que você possa colocar \unexpanded{....}o argumento completo, mas você também precisaria que os elementos da sua tabela fossem a string lua 'x'e não (como você a possui) a lua indefinida variável, xentão você precisaria de uma camada extra de citação de string, se feito dessa maneira. Ou simplesmente trate tudo como uma string e apenas substitua ,usando \\uma substituição 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}

Responder2

Outra versão simples (mas com expl3). Para a imagem que substituí matrixpor pmatrix. Também é extensível (a contagem de elementos da lista de vírgulas não é especificada).

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}

Responder3

A resposta a seguir é muito semelhante aDavid. A principal diferença é o uso doluacodepacote, que fornece um ambiente chamado luacode. Dentro de um luacodeambiente, a maioria dos caracteres "especiais" do TeX - #, $, %, ^, , &, {, }- ~podem ser inseridos diretamente. (Isso é particularmente útil para o %caractere, que tem seu próprio significado especial em algumas das funções de correspondência de padrões e matemática de Lua. O único dos caracteres "especiais" do TeX que precisa, bem, de tratamento especial é o caractere de barra invertida, \: deve ser inserido como \\. Para inserir uma barra invertida dupla, é necessário digitar \\\\. Finalmente, comentários de linha no estilo Lua são possíveis dentro de um luacodeambiente.

Em uma nota separada: observe o uso da macro \luastringN, que também é fornecida pelo luacodepacote, para passar o argumento da macro LaTeX para a função Lua. Na minha opinião, \luastringN{#1}é mais fácil de lembrar (e certamente mais fácil para os olhos...) do que '\luaescapestring{\unexpanded{#1}}'é. :-)

insira a descrição da imagem aqui

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

informação relacionada