我们目前正在尝试将一些文档(带有我们的公司设计)从 InDesign 转换为 LaTeX。这些文档应该以 PDF 形式在主页上提供,也可以很好地打印出来。问题是它们包含带有彩色单元格和四周边框的表格。
现在,根据缩放大小,彩色单元格的单元格边框会在 PDF 查看器 (Adobe Acrobat) 中消失。这是一个已知问题,但我没有找到任何可以修复 PDF 查看器显示的解决方案。大多数情况下,这里找到的评论/解决方案是文档无论如何都会很好地打印出来,所以这没什么大不了的。不幸的是,由于这些文档主要是供在线查看的,这对我们来说确实是一件大事,并且会使我们的文档看起来非常不专业。
以下是 MWE:
\documentclass{article}
\usepackage{tabularx}
\usepackage{xcolor}
\usepackage{colortbl}
\usepackage{hhline}
\newcommand\Tstrut{\rule{0pt}{2.7ex}}
\newcommand\Bstrut{\rule[-1.4ex]{0pt}{0pt}}
\begin{document}
%\setlength\arrayrulewidth{0.66pt}
\newcolumntype{A}{>{\raggedright\Tstrut}X<{\Bstrut}}
\newcolumntype{B}{>{\centering\arraybackslash\Tstrut}m{3cm}<{\Bstrut}}
\begin{tabularx}{\textwidth}{|A|B|}\hhline{--}
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hhline{--}
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hline
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hline
Test & 123,04 & 0,9\,\% \\\hline
\end{tabularx}
\end{document}
在 SumatraPDF 中查看时,所有线条都可见,但大多数客户计算机上的 PDF 查看器将是 Acrobat。在那里,线条会根据缩放级别而消失:
看起来好像右侧/下方单元格的单元格颜色是在该线之后绘制的,并且由于舍入差异而覆盖了该线。增加 \arrayrulewidth 并没有真正解决问题,因为线条仍然会消失。
这通常不是 Acrobat 的问题,因为在 InDesign 中生成的文档即使在很小的缩放比例下也能完美显示单元格边框(https://www.generali.at/privatkunden/vorsorge-vermoegen/kundeninformationsdokumente/basisinformationsblaetter/)
有哪些可行的解决方法可以使这些行始终出现在 PDF 查看器和打印中?从 \hline 切换到 \hhline 并不能解决问题...
有没有办法让单元格背景稍微小一点,这样 Acrobat 的圆角就不会盖印单元格边框?或者还有其他可能,比如强制 LaTeX 在打印完所有背景后再打印所有表格边框?
答案1
感谢@Ulrike-Fischer,我弄清楚了如何在打印整个表格后打印所有表格/单元格边框(使用 pgfmark 标记来标记所有坐标,然后在 tikz 覆盖层中打印线条):
\documentclass{article}
\usepackage{tabularx}
\usepackage{xcolor}
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usetikzlibrary{calc}
\newcommand\Tstrut{\rule{0pt}{2.7ex}}
\newcommand\Bstrut{\rule[-1.4ex]{0pt}{0pt}}
\begin{document}
\setlength\arrayrulewidth{5pt}
\setlength\tabcolsep{3pt}
\newcolumntype{A}{>{\raggedright\Tstrut}X<{\Bstrut}}
\newcolumntype{B}{>{\centering\arraybackslash\Tstrut}m{3cm}<{\Bstrut}}
\newcounter{TAB}
\newcommand{\showTable}{
\stepcounter{TAB}
\begin{tabularx}{\linewidth}{@{\pgfmark{leftTAB\theTAB}}|A@{\hspace{\tabcolsep}\pgfmark{col1TAB\theTAB}}|B|@{\pgfmark{rightTAB\theTAB}}}\noalign{\pgfmark{topTAB\theTAB}}\hline
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hline\noalign{\pgfmark{row1TAB\theTAB}}
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hline\noalign{\pgfmark{row2TAB\theTAB}}
\rowcolor{gray!50}\textbf{Name} & \textbf{Premium Premium Pr} \\\hline\noalign{\pgfmark{row3TAB\theTAB}}
Test & 123,04 \\\hline
\noalign{\pgfmark{bottomTAB\theTAB}}%
\end{tabularx}%
\tikz[overlay, remember picture, line width=\arrayrulewidth, black] {
% Horizontal Lines
\draw ($ ({pic cs:leftTAB\theTAB} |- {pic cs:topTAB\theTAB}) + (0,-\arrayrulewidth/2) $) -- %
($ ({pic cs:rightTAB\theTAB} |- {pic cs:topTAB\theTAB}) + (0,-\arrayrulewidth/2) $);%
\draw ($ ({pic cs:leftTAB\theTAB} |- {pic cs:row1TAB\theTAB}) + (0,\arrayrulewidth/2) $) -- %
($ ({pic cs:rightTAB\theTAB} |- {pic cs:row1TAB\theTAB}) + (0,\arrayrulewidth/2) $);%
\draw ($ ({pic cs:leftTAB\theTAB} |- {pic cs:row2TAB\theTAB}) + (0,\arrayrulewidth/2) $) -- %
($ ({pic cs:rightTAB\theTAB} |- {pic cs:row2TAB\theTAB}) + (0,\arrayrulewidth/2) $);%
\draw ($ ({pic cs:leftTAB\theTAB} |- {pic cs:row3TAB\theTAB}) + (0,\arrayrulewidth/2) $) -- %
($ ({pic cs:rightTAB\theTAB} |- {pic cs:row3TAB\theTAB}) + (0,\arrayrulewidth/2) $);%
% Vertical lines: left table border, column separators, right table border
\draw ($ ({pic cs:leftTAB\theTAB} |- {pic cs:topTAB\theTAB}) + (\arrayrulewidth/2,0) $) -- %
($ ({pic cs:leftTAB\theTAB} |- {pic cs:bottomTAB\theTAB}) + (\arrayrulewidth/2,0) $);%
\draw ($ ({pic cs:col1TAB\theTAB} |- {pic cs:topTAB\theTAB}) + (\arrayrulewidth/2,0) $) -- %
($ ({pic cs:col1TAB\theTAB} |- {pic cs:bottomTAB\theTAB}) + (\arrayrulewidth/2,0) $);%
\draw ($ ({pic cs:rightTAB\theTAB} |- {pic cs:topTAB\theTAB}) - (\arrayrulewidth/2,0) $) -- %
($ ({pic cs:rightTAB\theTAB} |- {pic cs:bottomTAB\theTAB}) - (\arrayrulewidth/2,0) $);%
}%
}
\showTable
\showTable
\showTable
\end{document}
除了 Ulrike 的帖子之外,我还必须将坐标移动半个 \arrayrulewidth,因为 \draw 期望坐标位于线的中间,而 pgfmarks 指示左/右边缘。
我的示例还展示了如何使用计数器来计算由 LaTeX 命令创建的任意数量的表格。\hline 并不是必需的,但我仍然将它们保留在那里,以查看 \tikz 行是否完全覆盖 \hline。
现在,即使在 Acrobat Reader 中,表格在所有缩放设置下看起来都很好......
答案2
该软件包nicematrix
提供了解决该问题的工具。
{NiceTabular}
此包提供类似于{tabular}
的环境array
。在此环境中,您可以使用类似于的语法colortbl
(您必须使用键colortbl-like
)以及其他命令(在下面的示例中,我使用了\RowStyle
)来为单元格、行和列着色。但是,此包不使用colortbl
,并且在放大和缩小时规则似乎不会在 Adobe Reader(或某些其他 PDF 查看器)中消失。
\documentclass{article}
\usepackage{xcolor}
\usepackage{nicematrix}
\begin{document}
\begin{center}
\begin{NiceTabular}{Xm{5cm}}[hvlines]
\RowStyle[nb-rows=3,rowcolor=gray!50,bold]{}
Name & Premium Premium Pr \\
Name & Premium Premium Pr \\
Name & Premium Premium Pr \\
Test & 123,04 \\
\end{NiceTabular}
\end{center}
\end{document}
答案3
如果允许使用不同的表包,则可以使用以下方法实现相同的结果卡路里以及简单直接的编码:
\documentclass{article}
\usepackage{cals}
\usepackage{xcolor}
\begin{document}
\begin{calstable}[c]
% Defining columns relative to each other and relative to the margins
\colwidths{{\dimexpr(\columnwidth)/4*2\relax}
{\dimexpr(\columnwidth)/4\relax}
{\dimexpr(\columnwidth)/4\relax}
}
% The tabular fills the text area if sum of all columns is 4
% Set up the tabular
\makeatletter
\def\cals@framers@width{0.4pt} % Outside frame rules, reduce if the rule is too heavy
\def\cals@framecs@width{0.4pt}
\def\cals@bodyrs@width{0.4pt}
\cals@setpadding{Ag}
\cals@setcellprevdepth{Al}
\def\cals@cs@width{0.4pt} % Inside rules, reduce if the rule is too heavy
\def\cals@rs@width{0.4pt}
\def\cals@bgcolor{}
\def\gray{\ifx\cals@bgcolor\empty % "Switch" to turn on and off colour
\def\cals@bgcolor{gray!50}
\else \def\cals@bgcolor{} \fi}
% R1H1
\thead{\bfseries
\brow
\gray\alignL\cell{\vfil Name}
\alignC\cell{\vfil Premium Premium Premium}
\cell{\vfil RiY}\gray
\erow
%R2H2
\brow
\gray\alignL\cell{\vfil Name}
\alignC\cell{\vfil Premium Premium Premium}
\cell{\vfil RiY}\gray
\erow
\mdseries
}
\tfoot{\lastrule\strut}
%R3B1
\brow
\alignL\cell{\vfil Test}
\alignC\cell{\vfil 123,04}
\cell{\vfil 0,9\,\%}
\erow
\makeatletter
\end{calstable}\par
\end{document}