マトリックス環境内のアクティブなキャラクター

マトリックス環境内のアクティブなキャラクター

私が取り組んでいる文書では、次のような形式のマトリックスを大量にタイプセットする必要があります。

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

アクティブ文字を使用すると、 、 、 が環境内でどのように展開されるかを簡単に変更できますxXただし-、難しいのは、それらを何に展開するかを管理すること、具体的には をどのように管理するかです。次のトークンが でない場合にのみ&を展開します。&\\

答え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

余分な列を解決する方法をまだ考えています...また、アクティブが呼び出しを妨げるため、 andの代わりにQand を使用しました。qXxxpmatrix

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

ここに画像の説明を入力してください

関連情報