Em um documento em que estou trabalhando, preciso compor um grande número de matrizes na 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}
onde cada entrada está em branco, um \x ou um \X. Estou me perguntando qual a melhor forma de definir um ambiente tal que eu possa escrever
\begin{mymatrix}
xXxx\\-Xxx\\-X-x\\-X--\\
\end{mymatrix}
usando caracteres ativos, posso alterar facilmente como x
, X
e -
expandir dentro do ambiente. No entanto, a parte complicada é gerenciar para onde eles devem expandir – especificamente, como gerenciar o arquivo &
. Como só queremos expandir a &
se o próximo token não for a \\
.
Responder1
\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}
Uma versão mais clássica, com -xX
personagens ativos matemáticos. Lembre-se do final \\
.
\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}
Responder2
Ainda estou pensando em como resolver a coluna extra... Também usei Q
and q
em vez de X
and x
, pois um ativo x
interferiria na pmatrix
invocação.
\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}
A abordagem a seguir aplica papéis de parede sobre a coluna extra, usando um 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}