Como criar uma tabela de comparação compacta como esta?

Como criar uma tabela de comparação compacta como esta?

Como você cria uma tabela de comparação como esta?

insira a descrição da imagem aqui

Em particular, os rótulos inclinados que economizam espaço e os círculos/círculos meio preenchidos. Esses tipos de tabelas parecem bastante comuns --- existe um pacote especial para criar tabelas como esta?

Além disso, acho que já existe uma dúvida sobre exatamente o mesmo tipo de tabela, mas infelizmente ela tinha um título tão vago quanto este, então não consegui encontrá-la.

Responder1

Aqui está uma reconstrução parcial da mesa.

\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}&#3&%
    \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}

insira a descrição da imagem aqui

Alguns comentários.

  1. Eu defini \rotcomo lidar com a rotação dos rótulos inclinados. Ele é usado \rotatebox[origin=br]{-60}para girar o rótulo -60 graus em torno do canto inferior direito. Isso é colocado dentro de uma \hboxcaixa 1emlarga com capacidade de encolhimento infinito à esquerda, de modo que a etiqueta se projeta para fora do lado esquerdo da caixa.
  2. Eu não queria digitar \LEFTcirclee \CIRCLEdo wasysympacote repetidamente, então defini \featurewhich recebe um único argumento (neste caso, 0, 1 ou 2) e produz o símbolo apropriado. (Com base nas notas de rodapé, eu provavelmente deveria ter chamado \property.)
  3. A parte principal da tabela é agrupada em grupos de 3, que são agrupados em 2 ou 3 grupos de 3. Usando o arraypacote, criei um novo tipo de coluna G(para grupo) que corresponde a três colunas centralizadas sem espaço entre colunas. Também defini \fo que leva três dígitos e produz os três recursos (propriedades) para um grupo. (Eu provavelmente deveria ter optado por \gficar com o grupo e não \fcom os recursos.)
  4. Para obter espaço extra entre os grupos de grupos, usei o arrayespecificador !para inserir um espaço extra \kern1ementre essas colunas.
  5. Cada linha consiste logicamente em 10 partes: o esquema, os símbolos das notas da tabela, o exemplo e sete grupos de 3. O TeX suporta apenas macros com até 9 argumentos, então quando eu criei \ex(que era para ficar por exemplo, mas na reflexão , algo relacionado ao esquema teria sido melhor) que leva 9 argumentos. Os 3 primeiros correspondem ao esquema, marcas e exemplo. Os 6 restantes esperam que 3 dígitos passem para \f. Finalmente, o 10º grupo contraventado é desprotegido usando \@firstofonee depois passado para \f. Eu admito, isso é meio que um hack, mas facilita o uso \ex.
  6. threeparttableconsiste em uma legenda, a tabela e as notas da tabela abaixo.
  7. A tabela em si é bastante direta. Eu usei booktabs's \toprule, \midrulee \bottomrulepara compor as regras horizontais. (Isso parece muito melhor do que \hline.)
  8. As notas da tabela estão centralizadas no seu exemplo. Tive que trabalhar um pouco para conseguir isso aqui. Em particular, adicionei alguns \hfils. Acho que seria melhor não centralizar as notas.
  9. Schemeestá ligeiramente recuado por algum motivo no seu exemplo. Eu não entendi o objetivo disso, então não fiz isso. Adicionar \quad(ou algum outro comando de espaçamento horizontal) poderia reproduzir isso.
  10. Se eu estivesse criando esta tabela, digitaria a coluna "Exemplo" alinhada à esquerda. Também posso substituir -nessa coluna Noneou talvez apenas deixá-la em branco. Eu provavelmente também substituiria o -nas colunas principais por um travessão. Eu só acho que parece melhor. Convenientemente, você só precisa substituir -por --in \featurepara alterá-lo em qualquer lugar, inclusive nas notas da tabela.

Alguns metacomentários.

  1. Para encontrar símbolos individuais, você deve procurar no symbols-a4documento (run texdoc symbols-a4).
  2. De modo geral, pedir ao TeX SX para reproduzir alguma imagem específica não funciona muito bem. (Eu estava curioso para saber threeparttableo que nunca tinha usado antes, então tentei.) Postar um exemplo mínimo demonstrando o que você tentou e perguntar sobre elementos específicos nos quais você está preso funciona melhor. Por exemplo, "Como faço para girar o texto em uma célula de uma tabela?"

informação relacionada