Preciso criar um comando que vá \MyCommand{x,y}
ou \MyCommand{x,y,z}
(ambas as formas devem ser possíveis), onde x
, y
e z
sã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, x
entã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í matrix
por pmatrix
. Também é extensível (a contagem de elementos da lista de vírgulas não é especificada).
\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 luacode
ambiente, 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 luacode
ambiente.
Em uma nota separada: observe o uso da macro \luastringN
, que também é fornecida pelo luacode
pacote, 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}}'
é. :-)
% !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}