我正在尝试制作一个包含两列的列表,我可以使用不同的字体大小,并具有单行或多行列,同时遵守页边距并正确对齐文本,无论使用什么字母以及每个单元格有多少行。起初它对我来说看起来很简单,但后来我意识到我无法一次性完成所有工作。
需要进行以下工作:
相邻单元格使用不同字体大小时顶部对齐
页面应该填充边距(如类所指定,或者如下例所示,明确指定。这意味着不应该在小页面的文本周围添加小边距,或者应该对其进行补偿。
当只有一行文本时和当有多行文本时,小页面周围的间距不应该有所不同。
与所有其他小页面相比,顶部小页面的间距不应该有所不同(在我添加外部小页面之前就是这种情况,在下面的示例中,两个内部小页面都放置在其中)。
应该能够将小页面中的部分文本右对齐(如下例中用 \hfill 完成的那样)。
无论实际使用的字符是什么,顶部的所有间距都应为所用字体的最高字符。例如:如果一个小页面只包含字母“A”,而其旁边的小页面只包含字母“a”,则第二个小页面的“a”应保持与页面包含“al”时相同的高度(高字母的高度应始终定义行的顶部,即使未使用高字母)。因此,“a”的顶部应略低于“A”的顶部。
底部的所有间距应为所用字体的最深字符,而不管实际使用的字符。例如:如果一个小页面只包含字母“A”,则其下方的小页面应呈现在与它所在的位置相同的位置,如果上面的小页面也包含向下突出的字母,例如“Ag”。
使用表格可能更容易实现这一点,但无论只使用短字母还是高字母,无论只使用非向下突出字母还是向下突出字母,我尝试都无法正确对齐,但都失败了。请看一下我之前的问题(虽然我接受了答案,但后来发现对齐方式无法正确处理所有描述的情况):顶部对齐的表格单元格,具有不同的字体大小和可控的间距. 对于我来说,如何实现这一点并不重要(minipages、parboxes、tabular、tabu、tabularx、longtable ......)——任何能够正确对齐的解决方案都值得欢迎。
理想情况下,我还希望删除 minipage 的所有额外空间,这样我就可以让边距与指定值完全一致(minipage 似乎添加了一些额外空间,而我无法将其全部删除)。这就是为什么我不能简单地放置两个宽度为 的 minipage 0.5\textwidth
,而必须-15.73111p
在定义每对的第二个(右侧)minipage 时使用 来补偿额外空间(我通过编译然后查看坏框的警告得出该值,该警告指定了超大尺寸的数量)。
\documentclass[paper=a4,fontsize=11pt]{scrartcl} % KOMA-article class
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % English language/hyphenation
\usepackage{geometry}
\pagestyle{empty} % No pagenumbers/headers/footers
\newcommand{\entry}[8]{ % #1 Heading/time #2 #3 alignment #4 #5 width #6 horisontal separation #7 vertical separation #8 description
\noindent\hangindent=0em\hangafter=0 % Indentation
\begin{minipage}[#3]{\dimexpr(#4+#5)} %
\begin{minipage}[#2]{\dimexpr(#4)} %
\vspace{0pt} %
#1 %
\par\vspace{0pt} %
\end{minipage} %
\hspace{#6} %
\begin{minipage}[#3]{\dimexpr#5-15.73111pt} %
\vspace{0pt} %
#8 %
\par\vspace{0pt} %
\end{minipage} %
\par\vspace{0pt} %
\end{minipage} %
\vspace{#7} %
} %
\newlength{\lwidth}
\newlength{\rwidth}
\newlength{\hsep}
\newlength{\vsep}
\newlength{\spacebox}
\settowidth{\spacebox}{88}
\newlength{\topm}
\newlength{\footm}
\newlength{\rightm}
\newlength{\leftm}
\setlength{\parskip}{0cm}
\setlength{\hsep}{1em}
\setlength{\vsep}{2ex}
\setlength{\topm}{20mm}
\setlength{\footm}{\dimexpr(\topm)}
\setlength{\rightm}{\dimexpr(3\topm/2*\paperwidth/\paperheight)}
\setlength{\leftm}{\rightm}
\newgeometry{top=\topm,bottom=\footm,right=\rightm,left=\leftm}
\setlength{\lwidth}{2.8cm}
\setlength{\rwidth}{\dimexpr(\textwidth-\lwidth-\hsep)}
\begin{document}
\entry{\Huge\textbf{{BIG}}}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{Some text here.\hfill Text flush with the right margin.\\Another row\\Another\\Another}
\entry{Two\\Lines}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{A longer text here, so that there will be several rows, gives the proper spacing below it. There must also be downwards-protruding letters (like 'p' and 'g').}
\entry{One Line}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{This one-line entry has unwanted extra space under it.}
\entry{Below One Line}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{This entry is slightly lower than it should, due to the added extra space below the single line.}
\entry{Not deep}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{This entry contains no letters that protrude downwards in the second line. Just letters that are above the base line.}
\entry{Below Not deep}{t}{t}{\lwidth}{\rwidth}{\hsep}{\vsep}{This entry ends up to close to the line above, since the line above contains no letters that protrude downwards.}
\end{document}
答案1
你可能需要稍微调整一下间距,但我会从一个更简单的标记开始,比如
\documentclass[paper=a4,fontsize=11pt]{scrartcl} % KOMA-article class
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % English language/hyphenation
\usepackage{geometry}
\pagestyle{empty} % No pagenumbers/headers/footers
\newlength{\lwidth}
\newlength{\rwidth}
\newlength{\hsep}
\newlength{\vsep}
\newlength{\spacebox}
\settowidth{\spacebox}{88}
\newlength{\topm}
\newlength{\footm}
\newlength{\rightm}
\newlength{\leftm}
\setlength{\parskip}{0cm}
\setlength{\hsep}{1em}
\setlength{\vsep}{2ex}
\setlength{\topm}{20mm}
\setlength{\footm}{\dimexpr(\topm)}
\setlength{\rightm}{\dimexpr(3\topm/2*\paperwidth/\paperheight)}
\setlength{\leftm}{\rightm}
\newgeometry{top=\topm,bottom=\footm,right=\rightm,left=\leftm}
\setlength{\lwidth}{2.8cm}
\setlength{\rwidth}{\dimexpr(\textwidth-\lwidth-\hsep)}
\def\entr#1{%
\raisebox{\dimexpr\ht\strutbox-\height\relax}{\begin{tabular}[t]{@{}l@{}}#1\strut\end{tabular}}}
\usepackage{tabularx}
\begin{document}
\noindent\begin{tabularx}{\textwidth}{
@{}
l
>{\let\\\newline}X@{}}
\entr{\Huge\textbf{BIG}}& Some text here.\hfill Text flush with the right margin.\\Another row\\Another\\Another\tabularnewline
\entr{Two\\Lines}&A longer text here, so that there will be several rows, gives the proper spacing below it. There must also be downwards-protruding letters (like 'p' and 'g').\tabularnewline
\entr{One Line}&This one-line entry has unwanted extra space under it.\tabularnewline
\entr{Below One Line}&This entry is slightly lower than it should, due to the added extra space below the single line.\tabularnewline
\entr{Not deep}&This entry contains no letters that protrude downwards in the second line. Just letters that are above the base line.\tabularnewline
\entr{Below Not deep}&This entry ends up to close to the line above, since the line above contains no letters that protrude downwards.
\end{tabularx}
\end{document}