Necesito crear un comando que vaya \MyCommand{x,y}
o \MyCommand{x,y,z}
(debería ser posible en ambas direcciones), donde x
, y
y z
son 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 matrix
con pmatrix
. También es extensible (no se especifica el recuento de elementos de la lista de comas).
\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 luacode
los 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 luacode
paquete, 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. :-)
% !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}