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
, X
y -
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}
Una versión más clásica, con -xX
personajes 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é Q
and q
en lugar de X
and x
, ya que un activo x
interferiría con pmatrix
la 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}
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}