LuaTeX에서 특정 배열 요소를 선택하시겠습니까?

LuaTeX에서 특정 배열 요소를 선택하시겠습니까?

\MyCommand{x,y}or \MyCommand{x,y,z}(두 가지 방법 모두 가능해야 함) 로 가는 명령을 만들어야 합니다 . 여기서 x, y, 및 z은 세 개의 숫자입니다. 각각 \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{....}전체 인수를 넣을 수 있지만 테이블의 요소는 '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

또 다른 간단한 버전(그러나 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. 환경 내에서는 luacodeTeX의 "특수" 문자 대부분( #, $, %, ^, , &, {, }-- ~)을 직접 입력할 수 있습니다. (이것은 %Lua의 일부 패턴 일치 및 수학 관련 기능에서 고유한 특별한 의미로 문자에 특히 유용합니다. 특수 처리가 필요한 TeX의 "특수" 문자 중 유일한 것은 백슬래시 문자입니다 \. \\이중 백슬래시를 입력하려면 를 입력해야 합니다 \\\\. 마지막으로 환경 내에서 Lua 스타일 줄 주석이 가능합니다 luacode.

별도 참고 사항: LaTeX 매크로의 인수를 Lua 함수에 전달하기 위해 패키지 \luastringN에서도 제공되는 매크로의 사용을 관찰하세요. luacode내 생각에는 실제 \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}

관련 정보