在 LuaTeX 中選擇特定的陣列元素?

在 LuaTeX 中選擇特定的陣列元素?

我需要建立一個執行\MyCommand{x,y}or \MyCommand{x,y,z}(兩種方式都應該可行)的指令,其中xyz是三個數字。它應該分別給出輸出\begin{matrix}x\\y\end{matrix}\begin{matrix}x\\y\\z\end{matrix}

而該指令應該只有一個以逗號分隔的形式表示的參數。

我不太熟悉在 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{....}完整的參數,但是您還需要表的元素是 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環境中,大多數 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}

相關內容