如何为矩阵的对角线着色/突出显示

如何为矩阵的对角线着色/突出显示

我有一张如下表

\begin{tiny}\begin{tabular}{|l|c|c|c|}
\hline
&\textbf{ciao}&\textbf{ciao2}&\textbf{ciao3}\\\hline
\textbf{ciao}&0.815&0.913&0.278\\\hline
\textbf{ciao2}&0.906&0.632&0.547\\\hline
\textbf{ciao3}&0.127&0.098&0.958\\\hline
\end{tabular}
\end{tiny}

如何使用不同的颜色突出显示对角线、第一行和第一列?

答案1

轻松使用colortbl(通过加载xcolor):

\documentclass{article}
\usepackage[table]{xcolor}

\begin{document}

\begin{tabular}{|>{\columncolor{red!20}}l|c|c|c|}
\hline
\rowcolor{blue!20}%
&\textbf{ciao}&\textbf{ciao2}&\textbf{ciao3}\\\hline
\textbf{ciao}&\cellcolor{green}0.815&0.913&0.278\\\hline
\textbf{ciao2}&0.906&\cellcolor{green}0.632&0.547\\\hline
\textbf{ciao3}&0.127&0.098&\cellcolor{green}0.958\\\hline
\end{tabular}

\end{document}

在此处输入图片描述

为了自动获取您想要的内容,您只需使用以下代码;但需要更改环境的名称。

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{xparse,environ}

\ExplSyntaxOn
\NewEnviron{matlabtabular}[1]
 {
  \tl_set:Nx \l_angelino_matlab_preamble_tl 
   {
    \tl_tail:n { #1 }
   }
  \tl_put_left:Nn \l_angelino_matlab_preamble_tl { | >{\columncolor{red!20}} }
  \angelino_matlabtab:VV \l_angelino_matlab_preamble_tl \BODY
 }

\cs_new_protected:Nn \angelino_matlabtab:nn
 {
  \seq_set_split:Nnn \l_angelino_matlabtab_rows_seq { \hline } { #2 }
  % the first item is empty
  \seq_pop_left:NN \l_angelino_matlabtab_rows_seq \l_angelino_matlabtab_body_tl
  % the last item is empty
  \seq_pop_right:NN \l_angelino_matlabtab_rows_seq \l_tmpa_tl
  % separate the first row
  \seq_pop_left:NN \l_angelino_matlabtab_rows_seq \l_angelino_matlabtab_body_tl
  % fix the first row
  \tl_put_left:Nn \l_angelino_matlabtab_body_tl { \hline\rowcolor{blue!20} }
  \tl_put_right:Nn \l_angelino_matlabtab_body_tl { \hline }
  \seq_map_inline:Nn \l_angelino_matlabtab_rows_seq
   {
    \int_incr:N \l_angelino_matlab_currentrow_int
    \int_zero:N \l_angelino_matlab_currentcol_int
    \seq_set_split:Nnn \l_angelino_matlabtab_row_seq { & } { ##1 }
    \seq_pop_left:NN \l_angelino_matlabtab_row_seq \l_angelino_matlabtab_first_tl
    \tl_put_right:NV \l_angelino_matlabtab_body_tl \l_angelino_matlabtab_first_tl
    \seq_map_inline:Nn \l_angelino_matlabtab_row_seq
     {
      \int_incr:N \l_angelino_matlab_currentcol_int
      \int_compare:nTF { \l_angelino_matlab_currentcol_int == \l_angelino_matlab_currentrow_int }
       {
        \tl_put_right:Nn \l_angelino_matlabtab_body_tl { & \cellcolor{green} ####1 }
       }
       {
        \tl_put_right:Nn \l_angelino_matlabtab_body_tl { & ####1 }
       }
     }
    \tl_put_right:Nn \l_angelino_matlabtab_body_tl { \hline }
   }
  \begin{tabular}{#1}
  \l_angelino_matlabtab_body_tl
  \end{tabular}
 }
\cs_generate_variant:Nn \angelino_matlabtab:nn { VV }
\int_new:N \l_angelino_matlab_currentcol_int
\int_new:N \l_angelino_matlab_currentrow_int
\seq_new:N \l_angelino_matlabtab_rows_seq
\seq_new:N \l_angelino_matlabtab_row_seq
\tl_new:N \l_angelino_matlabtab_body_tl
\tl_new:N \l_angelino_matlabtab_first_tl
\tl_new:N \l_angelino_matlab_preamble_tl
\ExplSyntaxOff

\begin{document}

\begin{matlabtabular}{|l|c|c|c|}
\hline
&\textbf{ciao}&\textbf{ciao2}&\textbf{ciao3}\\\hline
\textbf{ciao}&0.815&0.913&0.278\\\hline
\textbf{ciao2}&0.906&0.632&0.547\\\hline
\textbf{ciao3}&0.127&0.098&0.958\\\hline
\end{matlabtabular}

\end{document}

输出与以前相同。

请注意,这对环境的内容做出了一些假设。参数应以 开头,|现在改为|>{\columncolor{red!20}}。还假设每行都以 结尾\\\hline

答案2

为了进行比较,以下是在 ConTeXt 中执行此操作的方法。我认为 ConTeXt 为表格提供了更好的内容和显示分离。

\definecolor[lightblue]  [b=1,r=0.8,g=0.8]
\definecolor[lightred]   [r=1,b=0.8,g=0.8]
\definecolor[lightgreen] [g=1,r=0.8,b=0.8]

\startsetups diagonal
  \setupTABLE[offset=0.5em]
  \dorecurse{20}% Assuming there are no more than 20 rows
    {\setupTABLE[\recurselevel][\recurselevel][background=color,backgroundcolor=lightgreen]}
  \setupTABLE[column][first][background=color, backgroundcolor=lightred, style=bold]
  \setupTABLE[row][first][background=color, backgroundcolor=lightblue, style=bold]
\stopsetups

\starttext

\startTABLE[setups=diagonal]
  \NC       \NC ciao  \NC ciao2 \NC ciao3 \NC \NR
  \NC ciao  \NC 0.815 \NC 0.913 \NC 0.287 \NC \NR
  \NC ciao2 \NC 0.906 \NC 0.632 \NC 0.547 \NC \NR
  \NC ciao3 \NC 0.127 \NC 0.098 \NC 0.958 \NC \NR
\stopTABLE

\stoptext

在此处输入图片描述

答案3

这里提供一种利用环境自动完成这一操作{NiceTabular}的方法nicematrix

此外,您将获得完美的输出:在某些缩放级别下,规则似乎不会在某些 PDF 查看器中消失。

\documentclass{article}
\usepackage{xcolor}

\usepackage{nicematrix}
\usepackage{pgffor}

\NewDocumentEnvironment { matlabtabular } { O { } m ! O { } }
  { 
    \begin{NiceTabular}[#1, #3, hvlines] { #2 }
      \CodeBefore          
         \columncolor{red!15}{1}
         \rowcolor{blue!15}{1}
         \foreach \x in { 2,...,\arabic{iRow} } { \cellcolor{green!15}{\x-\x} } 
      \Body
  }
  { \end{NiceTabular} }


\begin{document}

\begin{matlabtabular}{lccc}
&\textbf{ciao}&\textbf{ciao2}&\textbf{ciao3}\\
\textbf{ciao}&0.815&0.913&0.278\\
\textbf{ciao2}&0.906&0.632&0.547\\
\textbf{ciao3}&0.127&0.098&0.958\\
\end{matlabtabular}

\end{document}

您需要进行多次编译,因为nicematrix在后台使用了 PGF/Tikz 节点。

上述代码的输出

相关内容