Мне нужно создать команду, которая идет \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}