答案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
和,所以我定义了它接受一个参数(在本例中为 0、1 或 2)并生成适当的符号。(根据脚注,我可能应该这样称呼它。)\CIRCLE
wasysym
\feature
\property
- 表格的主要部分分为 3 组,而这些组又分为 2 组或 3 组,每组 3 个。使用该
array
包,我创建了一种新的列类型G
(用于组),它对应于三个居中的列,没有列间空间。我还定义了\f
采用三位数字并生成组的三个特征(属性)。(我可能应该坚持\g
使用组而不是\f
特征。) - 为了在组之间获得额外的空间,我使用
array
说明符在这些列之间!
插入额外的空间\kern1em
。 - 每行在逻辑上由 10 个部分组成:方案、表格注释符号、示例和 7 组 3。TeX 仅支持最多 9 个参数的宏,因此当我创建
\ex
(本来是作为示例,但经过深思熟虑,与方案相关的内容会更好)时,它需要 9 个参数。前 3 个分别对应于方案、标记和示例。其余 6 个需要 3 位数字传递给\f
。最后,第 10 个带括号的组使用 解开括号\@firstofone
,然后传递给\f
。我承认,这有点像 hack,但它使使用\ex
更容易。 threeparttable
由标题、表格和下方的表注组成。- 表格本身非常简单。我使用了
booktabs
、\toprule
和\midrule
来\bottomrule
排版水平线。(这看起来比 好多了\hline
。) - 在您的示例中,表格注释居中。我不得不花点功夫才能在这里做到这一点。特别是,我添加了一些
\hfil
s。我认为不将注释居中看起来会更好。 Scheme
在您的示例中,由于某种原因略微缩进。我不明白这样做的意义,所以我没有这样做。添加\quad
(或其他一些水平间距命令)可以重现这种情况。- 如果我正在创建此表,我会将“示例”列排版为左对齐。我可能还会将该
-
列中的 替换为None
或者可能只是将其留空。我可能还会将-
主列中的 替换为短划线。我只是觉得这样看起来更好。方便的是,您只需将其替换-
为--
in\feature
即可在所有地方进行更改,包括表格注释。
一些元评论。
- 要查找单个符号,您应该查看
symbols-a4
文档(运行texdoc symbols-a4
)。 - 一般来说,要求 TeX SX 重现某些特定图像效果不太好。(我只是好奇想知道
threeparttable
我以前从未使用过什么,所以我尝试了一下。)发布一个最小示例来演示您尝试过的方法并询问您遇到的特定元素效果最好。例如,“如何旋转表格单元格中的文本?”