如何在表格中获得干净、像素完美的笔触

如何在表格中获得干净、像素完美的笔触

我意识到由于 LaTeX 本身的局限性,这个问题可能无法回答,但我无论如何都会揭露我的问题。

介绍

我有一张表格,当它在 Microsoft Word 中构建并从 Word 导出为 PDF 时,它在我测试的每个查看器中都能完美呈现。

我尝试在 LaTeX 中尽可能地重现该表格,但无法在边框上获得相同的结果。

下面是一个比较,请注意,即使 LaTex 截图展示了卡利布里字体,它仍然是由 LaTeX 控制的(请单击图像以 100% 的比例显示):

渲染示例

如您所见,第二个表格的显示效果不如第一个表格好。

比较

我在 Google Chrome 的查看器(我相信这将是目标文档的主要查看器)中对 Word、LaTex 和 LibreOffice(显然存在同样的问题)呈现的表格进行了一些不同缩放级别(100%、150% 和 160%)的实验:

(不要忘记以 100% 大小打开图像才能真实地反映我的问题)

首次使用 Office 进行测试

正如您在此处看到的,在前两个缩放级别中,线条呈现为完美的 1px 线条,并且有一个阈值,在该阈值处它会切换到 2px 线条(在最后一个缩放级别中可见)。

使用 Libreoffice 和 LaTeX 进行测试

这里的线条是抗锯齿的(很差),有些线条宽 1px,有些宽 1.5px,等等。

我在 Master PDF Editor(一个很好的工具)中打开了这两个 PDF 来检查生成的行:

掌握 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% 缩放后的样子,如果你想听听我的看法,那看起来相当不专业:

铬 100%

答案1

这里有几个问题。所有这些都可以在 TeX 中修复,但据我所知,没有一个是真正“开箱即用”修复的

  1. 笔触与填充矩形。

    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 驱动程序tikzmarkpstricks节点等的功能表明实际上可以标记任何节点的最终坐标,然后使用后端绘图语言在这些坐标处绘制线条(或填充矩形)。

    因此,如果您安排了一个表格宏,以便tikz知道所有单元格的位置,那么您可以使用这些位置来覆盖线条,从而\pdfliteral使用所需的任何 PDF 构造。从现有的 tikz 矩阵库开始可能比传统的 LaTeX 表格标记更容易。

  2. 与彩色面板相邻的规则。

    大多数其他系统,如果渲染表格单元格彩色背景和边框,则首先渲染背景,然后在背景上渲染文本和边框,这或多或少可以确保彩色面板或规则中的小像素变化不会遮挡边框。

    大多数乳胶彩色表格使用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}

第一个代码的输出

相关内容