
Как создать такую сравнительную таблицу?
В частности, наклонные надписи, которые экономят место, и круги/полузаполненные круги. Такого рода таблицы кажутся довольно распространенными --- есть ли специальный пакет для создания таких таблиц?
Кроме того, я думаю, что уже был вопрос о точно такой же таблице, но, к сожалению, у нее было такое же неопределенное название, как у этой, поэтому я не смог ее найти.
решение1
Вот частичная реконструкция таблицы.
\documentclass{article}
\usepackage{amsmath}
\usepackage{array}
\usepackage{booktabs}
\usepackage{fullpage}
\usepackage{graphicx}
\usepackage{threeparttable}
\usepackage{wasysym}
\begin{document}
\begin{table}
\footnotesize
\newcommand*\rot[1]{\hbox to1em{\hss\rotatebox[origin=br]{-60}{#1}}}
\newcommand*\feature[1]{\ifcase#1 -\or\LEFTcircle\or\CIRCLE\fi}
\newcommand*\f[3]{\feature#1&\feature#2&\feature#3}
\makeatletter
\newcommand*\ex[9]{#1\tnote{#2}&%
\f#4&\f#5&\f#6&\f#7&\f#8&\f#9&\expandafter\f\@firstofone
}
\makeatother
\newcolumntype{G}{c@{}c@{}c}
\begin{threeparttable}
\caption{Table caption here}
\label{tab:features}
\begin{tabular}{@{}lc GG !{\kern1em} GGG !{\kern1em} GG@{}}
\toprule
Scheme & Example & \multicolumn{6}{c}{Security Features} & \multicolumn{9}{c}{Usability} & \multicolumn{6}{c}{Adoption}\\
\midrule
% rotated items
&& \rot{Network MitM Prevented}
& \rot{Operator MitM Prevented}
& \rot{Operator MitM Detected}
%
& \rot{Operator Accountability}
& \rot{Key Revocation Possible}
& \rot{Privacy Preserving}
%
& \rot{Automatic Key Initialization}
& \rot{Low Key Maintenance}
& \rot{Easy Key Discovery}
%
& \rot{Easy Key Recover}
& \rot{In-Band}
& \rot{No Shared Secrets}
%
& \rot{Alert-less Key Renewal}
& \rot{Immediate Enrollment}
& \rot{Inattentive User Resistant}
%
& \rot{Multiple Key Support}
& \rot{No Service Provider}
& \rot{No Auditing Required}
%
& \rot{No Name Squatting}
& \rot{Asynchronous}
& \rot{Scalable}\\
\midrule
\ex{Opportunistic Encryption}{\dag*}{TCPCrypt} {000}{002} {222}{222}{222} {222}{222}\\
\ex{+TOFU (Strict)}{\dag}{-} {111}{102} {222}{022}{022} {022}{222}\\
\ex{+TOFU}{\dag*}{TextSecure} {111}{102} {222}{222}{020} {022}{222}\\
\midrule
\ex{Key Fringerprint Verification}{\dag*}{Threema} {222}{212} {000}{002}{000} {022}{222}\\
\ex{+Short Auth Strings (Out-of-Band}{\dag*}{SilentText} {222}{212} {000}{002}{000} {002}{202}\\
\ex{+Short Auth Strings (In-Band/Voice/Video}{\dag*}{ZRTP}{222}{212} {000}{012}{000} {022}{202}\\
\ex{+Socialist Millionaire (SMP)}{\dag*}{OTR} {222}{212} {000}{020}{000} {022}{202}\\
\ex{+Mandatory Verification}{\dag*}{SafeSlinger} {222}{212} {000}{020}{022} {022}{202}\\
\bottomrule
\end{tabular}
\begin{tablenotes}
\item \hfil$\feature2=\text{provides property}$; $\feature1=\text{partially provides property}$;
$\text{\feature0}=\text{does not provide property}$;
\item \hfil\textsuperscript{\dag}has academic publication;
\textsuperscript{*}end-user tool available
\end{tablenotes} \end{threeparttable}
\end{table}
See~\ref{tab:features}.
\end{document}
Некоторые комментарии.
- Я определил
\rot
, что нужно обрабатывать поворот наклонных этикеток. Он используется\rotatebox[origin=br]{-60}
для поворота этикетки на -60 градусов относительно нижнего правого угла. Он помещается внутри,\hbox
который имеет1em
ширину с бесконечной усадкой слева, так что этикетка выступает за левую сторону коробки. - Я не хотел снова и снова вводить
\LEFTcircle
and\CIRCLE
из пакета, поэтому я определил which, который принимает один аргумент (в данном случае 0, 1 или 2) и выдает соответствующий символ. (Судя по сноскам, мне, вероятно, следовало бы вместо этого назвать его .)wasysym
\feature
\property
- Основная часть таблицы сгруппирована в группы по 3, которые в свою очередь сгруппированы в 2 или 3 группы по 3. Используя пакет
array
, я создал новый тип столбцаG
(для группы), который соответствует трем центрированным столбцам без межстолбцового пространства. Я также определил,\f
который принимает три цифры и выдает три признака (свойства) для группы. (Вероятно, мне следовало бы\g
придерживаться группы, а не\f
признаков.) - Чтобы получить дополнительное пространство между группами групп, я использовал спецификатор
array
для!
вставки дополнительного пространства\kern1em
между этими столбцами. - Каждая строка логически состоит из 10 частей: схема, символы примечания к таблице, пример и семь групп по 3. TeX поддерживает только макросы с 9 аргументами, поэтому, когда я создал
\ex
(который должен был стоять для примера, но поразмыслив, что-то связанное со схемой было бы лучше), который принимает 9 аргументов. Первые 3 соответствуют схеме, отметкам и примеру. Остальные 6 ожидают, что 3 цифры будут переданы в\f
. Наконец, 10-я группа в фигурных скобках раскрепляется с помощью\@firstofone
и затем передается в\f
. Признаю, это своего рода хак, но он упрощает использование\ex
. threeparttable
состоит из заголовка, таблицы и примечаний к ней.- Сама таблица довольно прямолинейна. Я использовал
booktabs
's\toprule
,\midrule
, и\bottomrule
для набора горизонтальных линий. (Это выглядит намного лучше, чем\hline
.) - В вашем примере заметки в таблице отцентрированы. Мне пришлось немного потрудиться, чтобы добиться этого здесь. В частности, я добавил несколько
\hfil
s. Я думаю, было бы лучше не центрировать заметки. Scheme
в вашем примере почему-то немного отступлен. Я не понял смысла этого, поэтому не стал этого делать. Добавление\quad
(или какая-то другая команда горизонтального интервала) может это воспроизвести.- Если бы я создавал эту таблицу, я бы набрал столбец «Пример» с выравниванием по левому краю. Я бы также заменил
-
в этом столбце наNone
или, может быть, просто оставил бы его пустым. Я бы, наверное, также заменил-
в основных столбцах на короткое тире. Я просто думаю, что так выглядит лучше. Удобно, что вам нужно только заменить-
на--
в\feature
, чтобы изменить его везде, включая примечания к таблице.
Некоторые метакомментарии.
- Чтобы найти отдельные символы, вам следует заглянуть в
symbols-a4
документ (выполнитьtexdoc symbols-a4
). - Вообще говоря, просить TeX SX воспроизвести какое-то конкретное изображение не очень хорошо получается. (Мне просто было любопытно узнать о
threeparttable
том, что я никогда раньше не использовал, поэтому я попробовал.) Лучше всего опубликовать минимальный пример, демонстрирующий то, что вы пробовали, и спросить о конкретных элементах, на которых вы застряли. Например, «Как повернуть текст в ячейке таблицы?»