Активные персонажи внутри матричной среды

Активные персонажи внутри матричной среды

В документе, над которым я работаю, мне нужно набрать большое количество матриц вида

\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, и -расширяются внутри среды. Однако, сложная часть заключается в управлении тем, во что они должны расширяться, в частности, как управлять &. Так как мы хотим расширять только &если следующий токен не является \\.

решение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 x, поскольку активный элемент xпомешал бы pmatrixвызову.

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

введите описание изображения здесь

Связанный контент