私が取り組んでいる文書では、次のような形式のマトリックスを大量にタイプセットする必要があります。
\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
余分な列を解決する方法をまだ考えています...また、アクティブが呼び出しを妨げるため、 andの代わりにQ
and を使用しました。q
X
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}