我正在尝试排版一个表格,其单元格被分成几列,并且各列之间用虚线分隔。这是用于可变长度的(短)条目枚举,计划大致如下所示:
+-----------+------------------+
| A . E | H . L . P |
| B . F | I . M . |
| C . G | J . N . |
| D . | K . O . |
+-----------+------------------+
因为这个表是从数据生成的,所以我可以用生成软件轻松处理一些因素,而且因为它只是一个有大约一百个条目的表,所以我可以手动微调哪些表列有一个、两个或三个子列以优化外观。
我的想法是在每个表格单元格内使用minipage
,从而利用列以平衡方式填充的事实;但是,完全可以放弃 ,minipage
而是创建一个包含这么多子单元格的表格并以编程方式放置每个条目。
我无法正常工作的是虚线分隔线。这些分隔线应该是点,而不是破折号。此外,无论使用哪种技术绘制它们,它们都必须从 XeLaTeX 内部获取坐标(可以设置绝对列宽,但我宁愿避免这样做;也可以将表格放在距页面顶部的特定偏移处,但我真的想避免这样做)。
另外,我希望单独绘制每个分隔线 - 如果您只是在整个桌子上绘制虚线或点线分隔线,那么垂直线和水平线之间不可避免地会发生冲突。
当我开始时,我尝试了cline
s 和类似的东西,但我意识到绘制部分线条会导致没有部分线条的单元格边框中出现小间隙 - 这就是我开始考虑
subtable
s 和/或minipage
s 的原因。
下面是我现在拥有的 MWE。它看起来像这样:
我在这里尝试记录页面上的当前位置,然后查看列宽和高度minipage
,然后从中得出 x 和 y 值。我很难区分单位、整数和浮点数,以及(显然)不同的参考框架——有时
-y
似乎是“向下”,有时-y
似乎是“向上”。但此时我非常困惑,几乎分不清上下!
在我再浪费一天时间之前,有人知道如何改进这段代码吗?我试过很多包,每个包都有自己的规律——宏语法、参数是否需要整数、浮点数或长度、是否可以用它们进行数学运算等等。
\documentclass{book}
\usepackage{polyglossia}
\setdefaultlanguage{english}
\usepackage{multicol}
\setlength{\parindent}{0mm}
% http://tex.stackexchange.com/questions/56875/how-do-i-make-one-minipage-the-same-size-as-another
\usepackage{adjustbox}
% http://tex.stackexchange.com/a/37300/28067
\usepackage{zref-abspos}
\usepackage{zref-user}
\usepackage{calc}
\usepackage[absolute]{textpos}
\usepackage{epic}
\usepackage{fp}
% ----------------------------------------------------------------------------------------------------------
% http://tex.stackexchange.com/a/6424/28067
\makeatletter
\newcommand*{\DivideLengths}[2]{%
\strip@pt\dimexpr\number\numexpr\number\dimexpr#1\relax*65536/\number\dimexpr#2\relax\relax sp\relax
}
\makeatother
% ----------------------------------------------------------------------------------------------------------
% http://tex.stackexchange.com/a/37317/28067
\catcode`@=11
\begingroup
\catcode `P=12 % digits and punct. catcode
\catcode `T=12 % digits and punct. catcode
\lowercase{%
\def\x{\def\rem@pt##1.##2PT{##1\ifnum##2>\z@.##2\fi}}}
\expandafter\endgroup\x%
\def\strip@pt{\expandafter\rem@pt\the}
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1\relax\relax}
\catcode`@=12
% ##########################################################################################################
\begin{document}
% set units for package `textpos` (`textblock`)
\setlength{\TPHorizModule}{1mm}
\setlength{\TPVertModule}{1mm}
% set units for package `epic` (`dottedline`)
\unitlength1mm
% i set a definite width for the minipage here; in reality, that would be the text width inside a table
% cell:
\begin{minipage}[t]{20mm}
\begin{multicols}{2}%
\newcounter{flowX}
\newcounter{flowY}
\zsavepos{topleftcorner}%
\FPround\resultc{\convertto{mm}{\the\linewidth}}{0}
\setcounter{flowX}{\zposx{topleftcorner}/186450+\resultc+2} % `+2` to be replaced by 1/2 of columns divider width
\setcounter{flowY}{\zposy{topleftcorner}/186450}
\begin{textblock}{5}(\value{flowX},20)%
\leavevmode\dottedline[.]{1}(0,0)(0,20)%
\end{textblock}
A\\B\\C\\D\\E\\F\\G\\H\\I\\J\\K\\L\\M\\
\end{multicols}
\end{minipage}
% ##########################################################################################################
\end{document}
答案1
目前还不清楚multicol
您在表格上下文中真正需要的是什么,但要回答标题中的问题,要使用点而不是规则,您只需将规则替换为。最简单的方法是颠覆出现在方便点\leaders
的定义。\columnseprulecolor
\documentclass{article}
\def\a{\stepcounter{enumi}One two three four five six \roman{enumi}. }
\def\b{Red green yellow. \a\a\a\a\a}
\def\c{A, B, C. \b\par\b\b}
\def\d{\c\b\a\c\b\a}
\usepackage{multicol}
\makeatletter
\def\columnseprulecolor\vrule\@width\columnseprule{%
\vbox to \ht\mult@rightbox{\leaders\vbox{\kern2pt\hbox{.}\kern2pt}\vfill}}
\makeatother
\setlength\columnsep{20pt}
\begin{document}
\begin{multicols}{4}
\d
\end{multicols}
\end{document}