
У меня есть сетка/таблица/матрица с отдельнымиэтикеткидля строк и столбцов. Однако я также хочу маркировать сами эти метки (указывая «тип» меток, например, единицы СИ и т. д.)
Вот MWE с тремя вариантами (проверьте запись abc/def
в верхнем левом положении, описывающую метки строк abc
и метки столбцов def
):
\documentclass{article}
\begin{document}
\begin{table}
\caption{Forward slash.}
\[\begin{array}{c|ccccc}
abc/def & 1 & 2 & 3 & 4 & 5\\
\hline
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\end{array}\]
\end{table}
\begin{table}
\caption{Vertical bar.}
\[\begin{array}{c|ccccc}
abc|def & 1 & 2 & 3 & 4 & 5\\
\hline
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\end{array}\]
\end{table}
\begin{table}
\caption{Backslash.}
\[\begin{array}{c|ccccc}
abc\backslash def & 1 & 2 & 3 & 4 & 5\\
\hline
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\end{array}\]
\end{table}
\end{document}
Однако этот MWE страдает (как минимум) от следующих двух проблем: первый столбец (маркирующий строки) слишком широкий, а центрированные метки находятся далеко от ядра самого массива (выравнивание по правому краю могло бы помочь, но... это создает другие проблемы). Во-вторых, интервал вокруг abc/def выглядит неправильным.
Вопрос, в основном, в том, как мне красиво набрать этот массив? Что мне следует поместить в верхнюю левую позицию вместо abc/def
? Я не хочу помещать abc
и def
в два отдельных (много)столбца. Возможно, размещение abc
сверху (или снизу?) def
— это начало, но тогда мне все равно понадобится какой-то визуальный разделитель (берущий на себя роль символов \|/
) внутри этой ячейки. Я, вероятно, должен также пояснить, что обе метки abc
и def
на практикеочень короткий, обычно я бы написал x/y
или n/m
или n/k
, то есть односимвольные математические переменные, а не длинные тексты.
Связанный:Как создать таблицу с метками (первая строка и первый столбец)
решение1
Я собираюсь предложить "ни один из трех вариантов". Вместо этого рассмотрите возможность использования классической настройки "таблицы" с четкой иерархической структурой в заголовке. Такая настройка помогает избежать создания "тесного" вида, который почти неизбежен с любой из трех предложенных вами возможностей.
\documentclass{article}
\usepackage{booktabs}% for \toprule, \midrule, \bottomrule, and \cmidrule macros
\usepackage{amsmath} % for \text macro
\begin{document}
\begin{table}
\caption{Still another approach}
\[
\begin{array}{@{}l*{5}{c}@{}}
\toprule
\text{abc} & \multicolumn{5}{c@{}}{\text{def}}\\
\cmidrule(l){2-6}
& 1 & 2 & 3 & 4 & 5\\
\midrule
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\bottomrule
\end{array}
\]
\end{table}
\end{document}
решение2
Также возможно использование TiкZ непосредственно внутри таблицы, для получения длин не требуется никакого поля сохранения:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{table}
\caption{Diagonal Split}
\[\begin{array}{c|ccccc}
\tikz{\node[below left, inner sep=1pt] (def) {def};%
\node[above right,inner sep=1pt] (abc) {abc};%
\draw (def.north west|-abc.north west) -- (def.south east-|abc.south east);}
& 1 & 2 & 3 & 4 & 5\\
\hline
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\end{array}\]
\end{table}
\end{document}
Затем, внутри\tikz
команды у вас есть TiкZ power позволяет делать все, что угодно... Вот версия с измененным расположением узлов, very thin
shorten
линией разделения ED и шрифтами в формате \footnotesize
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{table}
\caption{Diagonal Split}
\[\begin{array}{c|ccccc}
\tikz[diag text/.style={inner sep=0pt, font=\footnotesize},
shorten/.style={shorten <=#1,shorten >=#1}]{%
\node[below left, diag text] (def) {def};
\node[above right=2pt and -2pt, diag text] (abc) {abc};
\draw[shorten=4pt, very thin] (def.north west|-abc.north west) -- (def.south east-|abc.south east);}
& 1 & 2 & 3 & 4 & 5\\
\hline
1 & a & b & c & d & e\\
2 & f & g & h & i & j\\
3 & k & l & m & n & o\\
\end{array}\]
\end{table}
\end{document}
решение3
Вот два варианта:
\documentclass{article}
\usepackage{mathtools,eqparbox}
\newcommand{\indices}[2]{{% \indices{<rows>}{<columns>}
\begin{array}{@{}r@{}}
\scriptstyle #2~\smash{\eqmakebox[ind]{$\scriptstyle\rightarrow$}} \\[-\jot]
\scriptstyle #1~\smash{\eqmakebox[ind]{$\scriptstyle\downarrow$}}
\end{array}}}
\begin{document}
\[
\begin{array}{c|ccccc}
\indices{\text{abc}}{\text{def}}
& 1 & 2 & 3 & 4 & 5 \\
\hline
1 & a & b & c & d & e \\
2 & f & g & h & i & j \\
3 & k & l & m & n & o
\end{array}
\]
\[
\begin{array}{cc|ccccc}
&\multicolumn{1}{c}{} & \multicolumn{5}{c}{\text{def}} \\
&& 1 & 2 & 3 & 4 & 5 \\
\cline{2-7}
& 1 & a & b & c & d & e \\
\smash{\rotatebox[origin=c]{90}{\text{abc}}} & 2 & f & g & h & i & j \\
& 3 & k & l & m & n & o
\end{array}
\]
\end{document}
Если вас интересуют команды, подобные матрицам, то несколько примеров можно найти здесь:Где\matrix
команда?. Это включает в себя использование \bordermatrix
,kbordermatrix
иblkarray
, все это позволяет размещать индексы для идентификации строк/столбцов.
решение4
Иногда я использую диагональные линии или черные квадраты:
\documentclass{article}
\usepackage{fp}
\usepackage{graphicx}
\newbox\MytempboxA
\newbox\MytempboxB
\newcommand\myTempA{}
\newcommand\myTempB{}
\newcommand\myTempC{}
\newcommand\myTempD{}
\begin{document}
\begin{table}%
\caption{Diagonal line approach}%
\[%
\setbox\MytempboxA\hbox{\mbox{abc}}%
\setbox\MytempboxB\hbox{\mbox{def}}%
\begin{array}{@{}|r|*{5}{c}|}
\hline
\multicolumn{1}{|l}{%
\edef\myTempA{%
\number\numexpr\dimexpr\wd\MytempboxA+2\arraycolsep\relax\relax
}%
\edef\myTempB{%
\number
\numexpr
\dimexpr\dp\csname @arstrutbox\endcsname+%
\ht\csname @arstrutbox\endcsname+%
\arrayrulewidth
\relax
\relax
}%
\FPpow\myTempC\myTempA{2}%
\FPpow\myTempD\myTempB{2}%
\FPadd\myTempC\myTempC\myTempD
\FProot\myTempC\myTempC{2}% length of diagonal line in sp
\FPdiv\myTempD\myTempB\myTempA
\FParctan\myTempD\myTempD% angle of diagonal line in rad
\smash{%
\kern-\arraycolsep
\rlap{%
\lower
\dimexpr
\dp\csname @arstrutbox\endcsname+\arrayrulewidth
\relax
\hbox{%
\rotatebox[units=-6.283185,origin=br]{\myTempD}{%
\rule{\myTempC sp}{\arrayrulewidth}%
}%
}%
}%
}%
}&\multicolumn{5}{c|}{\copy\MytempboxB}\\%
\cline{2-6}%
\copy\MytempboxA& 1 & 2 & 3 & 4 & 5\\%
\hline
1 & a & b & c & d & e\\%
2 & f & g & h & i & j\\%
3 & k & l & m & n & o\\%
\hline
\end{array}%
\]%
\end{table}
\begin{table}
\caption{Black box approach}%
\setbox\MytempboxA\hbox{\mbox{abc}}%
\setbox\MytempboxB\hbox{\mbox{def}}%
\[%
\begin{array}{@{}|r|*{5}{c}|}%
\hline
\multicolumn{1}{|l|}{%
\smash{%
\kern-\arraycolsep
\rlap{%
\rule[{-\dp\csname @arstrutbox\endcsname}]%
{\dimexpr\wd\MytempboxA+2\arraycolsep\relax}%
{%
\dimexpr
\dp\csname @arstrutbox\endcsname+%
\ht\csname @arstrutbox\endcsname
\relax
}%
}%
}%
}&\multicolumn{5}{c|}{\copy\MytempboxB}\\
\hline
\copy\MytempboxA& 1 & 2 & 3 & 4 & 5\\%
\hline
1 & a & b & c & d & e\\%
2 & f & g & h & i & j\\%
3 & k & l & m & n & o\\%
\hline
\end{array}%
\]%
\end{table}
\begin{table}%
\caption{Tangram puzzle approach}%
\[%
\setbox\MytempboxA\hbox{\mbox{abc}}%
\setbox\MytempboxB\hbox{\mbox{def}}%
\begin{array}{@{}|r|*{5}{c}|}
\hline
\multicolumn{1}{|l}{%
\edef\myTempA{%
\number\numexpr\dimexpr\wd\MytempboxA+2\arraycolsep\relax\relax
}%
\edef\myTempB{%
\number
\numexpr
\dimexpr\dp\csname @arstrutbox\endcsname+%
\ht\csname @arstrutbox\endcsname+%
\arrayrulewidth
\relax
\relax
}%
\FPpow\myTempC\myTempA{2}%
\FPpow\myTempD\myTempB{2}%
\FPadd\myTempC\myTempC\myTempD
\FProot\myTempC\myTempC{2}% length of diagonal line in sp
\FPdiv\myTempD\myTempB\myTempA
\FParctan\myTempD\myTempD% angle of diagonal line in rad
\smash{%
\kern-\arraycolsep
\rlap{%
\lower
\dimexpr
\dp\csname @arstrutbox\endcsname+\arrayrulewidth
\relax
\hbox{%
\rotatebox[units=-6.283185,origin=br]{\myTempD}{%
\rule{\myTempC sp}{\arrayrulewidth}%
}%
}%
}%
}%
}&\multicolumn{5}{c|}{\copy\MytempboxB}\\%
\copy\MytempboxA& 1 & 2 & 3 & 4 & 5\\%
\cline{2-6}%
1 & a & b & c & d & e\\%
2 & f & g & h & i & j\\%
3 & k & l & m & n & o\\%
\hline
\end{array}%
\]%
\end{table}
\begin{table}
\caption{squares approach}%
\setbox\MytempboxA\hbox{\mbox{abc}}%
\setbox\MytempboxB\hbox{\mbox{def}}%
\[%
\begin{array}{@{}|r|*{5}{c}|}%
\hline
\multicolumn{1}{|l|}{}&\multicolumn{5}{c|}{\copy\MytempboxB}\\
\copy\MytempboxA& 1 & 2 & 3 & 4 & 5\\%
\cline{2-6}%
1 & a & b & c & d & e\\%
2 & f & g & h & i & j\\%
3 & k & l & m & n & o\\%
\hline
\end{array}%
\]%
\end{table}
\end{document}
А иногда я использую что-то вроде угловых стрелок:
\documentclass{article}
\usepackage{tikz}
\newbox\MytempboxA
\newbox\MytempboxB
\newbox\MytempboxC
\newcommand\Upbox[1]{%
\lower\dimexpr-\ht\MytempboxA+\ht\MytempboxB\relax\hbox{#1}%
%#1%
}%
\newcommand\leftbox[1]{%
\hbox to\wd\MytempboxC{\hss#1\hss}\hbox to\wd\MytempboxB{\hfill}%
}%
\begin{document}
\begin{table}%
\caption{Angle arrow.}%
\setbox\MytempboxB=\hbox{\mbox{def}}%
\setbox\MytempboxC=\hbox{\mbox{abc}}%
\setbox\MytempboxA=\hbox{\lower\dp\MytempboxC\vbox{%
\hbox{%
\begin{tikzpicture}[x=.25cm, y=.25cm, inner sep=0pt]
\draw[->,thin] (0,0) -- (1,0) node[right]{\copy\MytempboxB};
\draw[->,thin] (0,0) -- (0,-1) node[below]{\copy\MytempboxC};
\end{tikzpicture}%
}%
}}%
\[%
\begin{array}{c|ccccc}%
\copy\MytempboxA&\Upbox{1}&\Upbox{2}&\Upbox{3}&\Upbox{4}&\Upbox{5}\\%
\hline
\leftbox{1}& a & b & c & d & e\\%
\leftbox{2} & f & g & h & i & j\\%
\leftbox{3} & k & l & m & n & o\\%
\end{array}%
\]
\end{table}
\begin{table}
\caption{Another angle arrow.}%
\setbox\MytempboxB=\hbox{\mbox{def}}%
\setbox\MytempboxC=\hbox{\mbox{abc}}%
\[%
\begin{array}{c@{}c|ccccc}%
\smash{%
\hbox{%
\kern.5\wd\MytempboxC
\lower.75\ht\MytempboxB
\hbox{%
\begin{tikzpicture}[x=.25cm, y=.25cm, inner sep=0pt]
\draw[->,thin] (0,0) -- (1,0) node[right]{};
\draw[->,thin] (0,0) -- (0,-1) node[below]{};
\end{tikzpicture}%
}%
}%
}&\copy\MytempboxB&1&2&3&4&5\\%
\copy\MytempboxC&&\\%
\hline
1&& a & b & c & d & e\\%
2&& f & g & h & i & j\\%
3&& k & l & m & n & o\\%
\end{array}%
\]%
\end{table}
\end{document}
Вы также можете создать внешний вид осей системы координат с помощью горизонтальных и вертикальных линий массива:
\documentclass{article}
\usepackage{tikz}
\newbox\MytempboxA
\newbox\MytempboxB
\newbox\MytempboxC
\begin{document}
\begin{table}%
\caption{Coordinate axes approach.}%
\setbox\MytempboxC=\hbox{\mbox{abc}}%
\setbox\MytempboxB=\hbox{\mbox{def}}%
\setbox\MytempboxA\hbox{%
\lower\arrayrulewidth\hbox{%
\begin{tikzpicture}[x=.25cm, y=.05cm, inner sep=0pt]%
\draw[->,line width=\arrayrulewidth] (0,1) -- (1,1) node[right]{};
\end{tikzpicture}%
}%
}%
\[%
\begin{array}{c|cccccl}%
&1&2&3&4&5&\\%
\cline{1-6}%
1& a & b & c & d & e&%
\kern\dimexpr-\arraycolsep-.5\arrayrulewidth\relax\null
\smash{%
\lower\dimexpr-\ht\csname @arstrutbox\endcsname+.75\arrayrulewidth+0pt\relax\copy\MytempboxA
\lower\dimexpr-\ht\csname @arstrutbox\endcsname+0.5ex+.75\arrayrulewidth\relax\copy\MytempboxB
}%
\\%
2 & f & g & h & i & j&\\%
3 & k & l & m & n & o&\\%
\multicolumn{1}{r}{}&%
\multicolumn{6}{l}{%
\kern\dimexpr-.5\wd\MytempboxC-\arraycolsep\relax\null
\vbox{%
\kern\dimexpr-.5\arrayrulewidth\relax\hbox{%
\begin{tikzpicture}[x=.25cm, y=.075cm, inner sep=0pt]%
\draw[->,line width=\arrayrulewidth] (0,1) -- (0,-1) node[below]{\copy\MytempboxC};
\end{tikzpicture}%
}%
}%
}%
\\%
\end{array}%
\]
\end{table}
\end{document}