在我正在處理的文件中,我需要排版大量以下形式的矩陣
\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
。-
然而,棘手的一點是管理它們應該擴展到什麼——具體來說,如何管理&
.因為,我們只想&
在下一個標記不是 a 時擴展 a \\
。
答案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
我仍在考慮如何解決額外的列...我還使用了Q
andq
而不是X
and x
,因為 activex
會幹擾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}