매트릭스 환경 내부의 활성 캐릭터

매트릭스 환경 내부의 활성 캐릭터

작업 중인 문서에서 다음 형식의 많은 행렬을 조판해야 합니다.

\def\x{\mathrm{x}}
\def\X{\mathbf{x}}

\begin{pmatrix}
 & \x & \X & \x & \x\\
 &    & \X & \x & \x\\
 &    & \X & \x & \x\\
 &    & \X &    & \x\\
 &    &    &    &   \\
\end{pmatrix}

여기서 각 항목은 공백, \x 또는 \X입니다. 글을 쓸 수 있는 환경을 정의하는 가장 좋은 방법이 무엇인지 궁금합니다.

\begin{mymatrix}
 xXxx\\-Xxx\\-X-x\\-X--\\
\end{mymatrix}

활성 문자를 사용하면 환경 내부에서 x, X및 확장 방법을 쉽게 변경할 수 있습니다 . -그러나 까다로운 부분은 확장 대상을 관리하는 것, 특히 &. 마찬가지로, &다음 토큰이 a가 아닌 경우에만 a를 확장하려고 합니다 \\.

답변1

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\tl_new:N \l_freddie_xxmatrix_tl
\seq_new:N \l_freddie_xxmatrix_seq

\NewDocumentCommand{\Xxmatrix}{m}
 {
  % clear the variable that becomes the body of the matrix
  \tl_clear:N \l_freddie_xxmatrix_tl
  % split at \\
  \seq_set_split:Nnn \l_freddie_xxmatrix_seq { \\ } { #1 }
  % insert & between each item
  \seq_map_inline:Nn \l_freddie_xxmatrix_seq
   {
    % split at each item
    \seq_set_split:Nnn \l_tmpa_seq { } { ##1 }
    % reconstitute the row with &
    \tl_put_right:Nx \l_freddie_xxmatrix_tl
     {
      \seq_use:Nn \l_tmpa_seq { & }
     }
    % add the row to the body
    \tl_put_right:Nn \l_freddie_xxmatrix_tl { \\ }
   }
  % replace - with nothing, x with \mathrm{x}, X with \mathbf{x}
  \tl_replace_all:Nnn \l_freddie_xxmatrix_tl { - } { }
  \tl_replace_all:Nnn \l_freddie_xxmatrix_tl { x } { \mathrm{x} }
  \tl_replace_all:Nnn \l_freddie_xxmatrix_tl { X } { \mathbf{x} }
  % print the matrix
  \freddie_printmatrix:V \l_freddie_xxmatrix_tl
 }
\cs_new_protected:Nn \freddie_printmatrix:n
 {
  \begin{pmatrix} #1 \end{pmatrix}
 }
\cs_generate_variant:Nn \freddie_printmatrix:n { V }
\ExplSyntaxOff

\begin{document}
\[
\Xxmatrix{
 xXxx \\
 -Xxx \\
 ---- \\
 -X-x
}
\]
\end{document}

여기에 이미지 설명을 입력하세요

-xX수학 활성 문자로 만들어진 보다 고전적인 버전입니다 . 후행을 기억하십시오 \\.

\documentclass{article}
\usepackage{amsmath}

\newcommand{\Xxmatrix}[1]{%
  \begingroup
  \makemathactive{x}{\freddiex}%
  \makemathactive{X}{\freddieX}%
  \makemathactive{-}{\freddienothing}%
  \begin{pmatrix}#1\end{pmatrix}%
  \endgroup
}
\mathchardef\standardx=\mathcode`x
\newcommand{\makemathactive}[2]{%
  \begingroup\lccode`~=`#1\lowercase{\endgroup\def~}{#2}%
  \mathcode`#1="8000
}
\makeatletter
\newcommand{\freddiecheck}{\kernel@ifnextchar\\{}{&}}
\makeatother

\newcommand{\freddiex}{\mathrm{\standardx}\freddiecheck}
\newcommand{\freddieX}{\mathbf{\standardx}\freddiecheck}
\newcommand{\freddienothing}{\freddiecheck}

\begin{document}
\[
\Xxmatrix{
 xXxx \\
 -Xxx \\
 ---- \\
 -X-x \\
}
\]
\end{document}

답변2

나는 여전히 추가 열을 해결하는 방법을 생각하고 있습니다. 활성이 호출을 방해할 수 있기 때문에 Qand q대신 Xand 도 사용했습니다 .xxpmatrix

\documentclass{article}
\usepackage{amsmath}
\def\x{\mathrm{x}}
\def\X{\mathbf{x}}
\begin{document}
\[
\catcode`-=\active
\catcode`Q=\active
\catcode`q=\active
\def-{&}
\def Q{\X&}
\def q{\x&}
\begin{pmatrix}
qQqq\\-Qqq\\-Q-q\\-Q--\\
\end{pmatrix}
\]
\end{document}

여기에 이미지 설명을 입력하세요

다음 접근 방식은 음수 커른을 사용하여 추가 열에 대한 배경 무늬를 적용합니다.

\documentclass{article}
\usepackage{amsmath}
\def\x{\mathrm{x}}
\def\X{\mathbf{x}}
\def\backup{\kern-9pt}
\begin{document}
\[
\catcode`-=\active
\catcode`Q=\active
\catcode`q=\active
\def-{&}
\def Q{\X&}
\def q{\x&}
\left(
\begin{matrix}
qQqq\\-Qqq\\-Q-q\\-Q--\\
\end{matrix}
\backup\right)
\]
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보