我意识到由于 LaTeX 本身的局限性,这个问题可能无法回答,但我无论如何都会揭露我的问题。
介绍
我有一张表格,当它在 Microsoft Word 中构建并从 Word 导出为 PDF 时,它在我测试的每个查看器中都能完美呈现。
我尝试在 LaTeX 中尽可能地重现该表格,但无法在边框上获得相同的结果。
下面是一个比较,请注意,即使 LaTex 截图展示了卡利布里字体,它仍然是由 LaTeX 控制的(请单击图像以 100% 的比例显示):
如您所见,第二个表格的显示效果不如第一个表格好。
比较
我在 Google Chrome 的查看器(我相信这将是目标文档的主要查看器)中对 Word、LaTex 和 LibreOffice(显然存在同样的问题)呈现的表格进行了一些不同缩放级别(100%、150% 和 160%)的实验:
(不要忘记以 100% 大小打开图像才能真实地反映我的问题)
正如您在此处看到的,在前两个缩放级别中,线条呈现为完美的 1px 线条,并且有一个阈值,在该阈值处它会切换到 2px 线条(在最后一个缩放级别中可见)。
这里的线条是抗锯齿的(很差),有些线条宽 1px,有些宽 1.5px,等等。
我在 Master PDF Editor(一个很好的工具)中打开了这两个 PDF 来检查生成的行:
LaTeX(和 LibreOffice)的行被转换为原生描边而 Office 将线呈现为固定宽度的填充矩形,显然 PDF 查看器呈现得更好。
我知道最终这可能是查看器的问题(在这种情况下是 Chrome,它也发生在 Slack、Evince 以及其他方面,我没有看到任何没有问题的),这里真正的问题是我可以做些什么来缓解这个问题吗?
平均能量损失
MWE 获取在 Chrome / Evince 中渲染效果不佳的 PDF(在低缩放级别):
\documentclass[11pt, a4paper]{article}
\usepackage{colortbl}
\usepackage{tabularx}
\begin{document}
\noindent
\begin{tabularx}{\textwidth}{|>{\columncolor[gray]{0.95}}l|X|}
\hline
Titre & Some text here \\\hline
Date de modification & \today \\\hline
Responsable & Some name \\\hline
E-mail & Sorry for the french \\\hline
Sujet & Lorem Ipsum \\\hline
Version du document & 2.0 \\\hline
\end{tabularx}
\end{document}
再次,这是它在 Chrome 中 100% 缩放后的样子,如果你想听听我的看法,那看起来相当不专业:
答案1
这里有几个问题。所有这些都可以在 TeX 中修复,但据我所知,没有一个是真正“开箱即用”修复的
笔触与填充矩形。
TeX 在这里不强制要求任何东西。LaTeX 使用 TeX 原语
\hrule
,\vrule
但 TeX 并不强制要求如何将它们转换为 PDF(或其他任何东西)。在 LaTeX 的 TeX 宏中无法解决这个问题,但 pdftex 或 luatex 的 pdf 生成代码或 dvi 到 xxx 转换器(如 dvips 或 dvipdfm(x))可以更改为使用填充矩形而不是规则。(我似乎记得 dvips 来源对此处的相关问题有一些评论。)因此,在不更改 tex-the-program 或 dvi 驱动程序的情况下,您必须使用宏
\pdfliteral
或等效宏来\hline
从填充的矩形制作。这并不简单,因为原始 TeX\hline
会自动扩展到周围框的宽度,而使用显式 PDF 绘制规则则不容易做到这一点,尤其是在表格中,默认情况下宏层不知道每个单元格的宽度。然而,即使在经典的 TeX 包中,例如
longtable
表明在一定程度上可以发现表格单元格的范围,并且使用 TeX 扩展或 dvi 驱动程序tikzmark
或pstricks
节点等的功能表明实际上可以标记任何节点的最终坐标,然后使用后端绘图语言在这些坐标处绘制线条(或填充矩形)。因此,如果您安排了一个表格宏,以便
tikz
知道所有单元格的位置,那么您可以使用这些位置来覆盖线条,从而\pdfliteral
使用所需的任何 PDF 构造。从现有的 tikz 矩阵库开始可能比传统的 LaTeX 表格标记更容易。与彩色面板相邻的规则。
大多数其他系统,如果渲染表格单元格彩色背景和边框,则首先渲染背景,然后在背景上渲染文本和边框,这或多或少可以确保彩色面板或规则中的小像素变化不会遮挡边框。
大多数乳胶彩色表格使用
colortbl
不这样做,因为它设计用于标准乳胶表格标记,并且仅使用基本颜色特效而不是扩展坐标跟踪后端,按遇到的顺序生成规则,因此具有四个边框和背景颜色的单元格按顶部、左侧、背景、文本、右侧、底部的顺序呈现。边框规则不覆盖背景颜色面板,它们是邻近的对其。在 TeX 尺寸内,定位是精确的,但这确实意味着,当呈现到设备时,对颜色面板或规则边缘的任何像素调整都可能产生可见效果,并可能使规则不可见,尤其是在规则绘制在彩色面板之前的单元格的顶部或左侧。
所以...
如果我想这样做,我可能会首先排版表格,不使用规则或彩色背景,而是使用tikz
原始的盒子测量或\pdfsavepos
扩展来记录每个单元格的尺寸。
然后根据保存的坐标确定彩色面板的位置。(例如,在“斑马条纹”表中,您可以将每行着色为单一颜色的面板,而不是为每个单元格单独添加背景。排版这些面板,然后使用表格单元格输出保存的框,然后重新使用先前保存的坐标来覆盖垂直和水平规则(可能实现为填充矩形),使用tikz
或更原始的绘图命令。
答案2
使用 ConTeXt MKIV 和 Natural Tables,您可以轻松地有选择地为行或列着色。
\starttext
\startsetups table:pixelperfect
\setupTABLE[column][first][background=color,backgroundcolor=gray]
\stopsetups
\startTABLE[setups={table:pixelperfect}]
\NC Titre \NC Some text here \NC\NR
\NC Date de modification \NC \currentdate \NC\NR
\NC Responsable \NC Some name \NC\NR
\NC E-mail \NC Sorry for the french \NC\NR
\NC Sujet \NC Lorem Ipsum \NC\NR
\NC Version du document \NC 2.0 \NC\NR
\stopTABLE
\stoptext
你也可以使用 xtables 来渲染很多速度更快,但非常冗长。不过,语法对于自动生成来说非常好。
\starttext
\startxtable
\startxrow
\startxcell[background=color,backgroundcolor=gray]
Titre
\stopxcell
\startxcell
Some text here
\stopxcell
\stopxrow
\startxrow
\startxcell[background=color,backgroundcolor=gray]
Date de modification
\stopxcell
\startxcell
\currentdate
\stopxcell
\stopxrow
\startxrow
\startxcell[background=color,backgroundcolor=gray]
Responsable
\stopxcell
\startxcell
Some name
\stopxcell
\stopxrow
\startxrow
\startxcell[background=color,backgroundcolor=gray]
E-mail
\stopxcell
\startxcell
Sorry for the french
\stopxcell
\stopxrow
\startxrow
\startxcell[background=color,backgroundcolor=gray]
Sujet
\stopxcell
\startxcell
Lorem Ipsum
\stopxcell
\stopxrow
\startxrow
\startxcell[background=color,backgroundcolor=gray]
Version du document
\stopxcell
\startxcell
2.0
\stopxcell
\stopxrow
\stopxtable
\stoptext
答案3
使用,规则由 Tikz 在构建数组后绘制(然而,这需要多次编译){NiceTabular}
。nicematrix
即使规则靠近彩色面板,它们似乎也不会消失。
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\begin{center}
\begin{NiceTabularX}{\textwidth}{>{\columncolor[gray]{0.95}}lX}[hvlines,colortbl-like]
Titre & Some text here \\
Date de modification & \today \\
Responsable & Some name \\
E-mail & Sorry for the french \\
Sujet & Lorem Ipsum \\
Version du document & 2.0 \\
\end{NiceTabularX}
\end{center}
\end{document}