Выбор определенного элемента массива в LuaTeX?

Выбор определенного элемента массива в LuaTeX?

Мне нужно создать команду, которая идет \MyCommand{x,y}или \MyCommand{x,y,z}(оба пути должны быть возможны), где x, y, и z— три числа. Она должна выдавать на выходе \begin{matrix}x\\y\end{matrix}и \begin{matrix}x\\y\\z\end{matrix}, соответственно.

И команда должна иметь только один аргумент, разделенный запятыми, как показано.

Я не очень хорошо знаком с использованием кода Lua в LaTeX. Но я попробовал следующее любым способом.

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

Пожалуйста, дайте мне знать, где я ошибаюсь, или как мне развить эту команду.

Я использую дистрибутив MikTeX и режим вывода LuaLaTeX.

Вот 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}

решение1

Я бы просто сделал это в TeX (обратите внимание, вы пропустили 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}

Для версии Lua вам нужно помнить, что макросы расширяются до передачи в lua, чтобы вы могли разместить \unexpanded{....}вокруг полный аргумент, но тогда вам также понадобится, чтобы элементы вашей таблицы были строкой lua, 'x'а не (как у вас) неопределенной переменной lua x, поэтому вам понадобится дополнительный уровень цитирования строк, если вы сделаете это таким образом. Или, проще говоря, обрабатывайте все как строку и просто заменяйте, ,используя \\замену 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}

решение2

Еще одна простая версия (но с expl3). Для изображения я заменил matrixна pmatrix. Она также расширяема (количество элементов списка запятых не указано).

матрица

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

решение3

Следующий ответ очень похож наДэвида. Главное отличие — это использованиеluacodeпакет, который предоставляет среду под названием luacode. Внутри luacodeсреды большинство «специальных» символов TeX — #, $, %, ^, &, {, }, ~— можно вводить напрямую. (Это особенно полезно для %символа , который имеет свое собственное особое значение в некоторых функциях Lua по сопоставлению с образцом и математических операциях. Единственный из «специальных» символов TeX, который требует, ну, особого обращения, — это символ обратной косой черты : \его нужно вводить как \\. Чтобы ввести двойную обратную косую черту, нужно набрать \\\\. Наконец, внутри среды возможны комментарии в стиле Lua luacode.

Отдельное примечание: Обратите внимание на использование макроса \luastringN, который также предоставляется пакетом luacode, для передачи аргумента макроса LaTeX в функцию Lua. На мой взгляд, \luastringN{#1}его легче запомнить (и, конечно, легче для глаз...), чем '\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}

Связанный контент