Personajes activos dentro de un entorno Matrix

Personajes activos dentro de un entorno Matrix

En un documento en el que estoy trabajando necesito componer una gran cantidad de matrices de la forma

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

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

donde cada entrada está en blanco, \x o \X. Me pregunto cuál es la mejor manera de definir un entorno tal que pueda escribir

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

Usando personajes activos puedo cambiar fácilmente cómo x, Xy -expandirme dentro del entorno. Sin embargo, lo complicado es gestionar a qué deberían expandirse, específicamente, cómo gestionar el archivo &. Como, solo queremos expandir a &si el siguiente token no es a \\.

Respuesta1

\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}

ingrese la descripción de la imagen aquí

Una versión más clásica, con -xXpersonajes activos matemáticos. Recuerda el seguimiento \\.

\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}

Respuesta2

Todavía estoy pensando cómo resolver la columna adicional... También usé Qand qen lugar de Xand x, ya que un activo xinterferiría con pmatrixla invocación.

\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}

ingrese la descripción de la imagen aquí

El siguiente enfoque empapela la columna adicional, utilizando un kern negativo.

\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}

ingrese la descripción de la imagen aquí

información relacionada