LuaTeX で特定の配列要素を選択しますか?

LuaTeX で特定の配列要素を選択しますか?

\MyCommand{x,y}または\MyCommand{x,y,z}(どちらの方法も可能) を実行するコマンドを作成する必要があります。ここでx、、、yは3 つの数値です。それぞれ、およびzが出力されます。\begin{matrix}x\\y\end{matrix}\begin{matrix}x\\y\\z\end{matrix}

また、コマンドには、示されているように、コンマ区切りの形式で引数が 1 つだけ含まれている必要があります。

私は LaTeX で Lua コードを使用することにあまり慣れていません。しかし、とにかく次の方法を試しました。

\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{....}そのため、引数全体を囲むことができますが、テーブルの要素は'x'(現在のように) 未定義の Lua 変数ではなく 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

もう 1 つのシンプルなバージョン (ただし を使用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。環境内では、TeX の「特殊」luacode文字のほとんど ( 、、、、、、、、#)を直接入力できます。(これは、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}

関連情報