以下结果MWE
\documentclass[letter,10pt]{article}
\usepackage{makecell}
\renewcommand{\cellalign}{tl}
\usepackage{longtable}
\usepackage{fontspec}
\usepackage
[
left=1.5cm,
right=1.5cm,
top=1.5cm,
bottom=1.5cm,
]
{geometry}
\ExplSyntaxOn
\let\tl_length:n\tl_count:n
\ExplSyntaxOff
\setmainfont[Color=000000]{Arial}
\setlength{\LTpre}{7pt}
\setlength{\LTpost}{0pt}
\begin{document}
\begin{longtable}[l]{r|p{16cm}}
Mr. Professor & Introduction to Academic Hallucinations, 1890\\
\end{longtable}
\begin{longtable}[l]{r|p{16cm}}
\makecell{Mrs.\\ Professor} & \textit{``Advanced Time Wasting''}, 1891\\
& \textit{``Special Topics in Time Wasting''}, 1892\\
\end{longtable}
\end{document}
是
我怎样才能对齐 s 的垂直线longtable
(如红色箭头所示)?
PS。(但是,我知道每篇文章都应该只包含一个问题,但作为后续问题)我怎样才能摆脱下方空白的第二行longtable
(就像蓝色箭头所示的那样)?
答案1
简单:对于垂直规则的对齐,将这两个表格合并为一个,并\vskip
在两行之间添加一个。对于第二个问题,也在\makecell
第二列中使用一个。
\documentclass[letter,10pt]{article}
\usepackage{makecell}
\renewcommand{\cellalign}{tl}
\usepackage{longtable}
\usepackage{fontspec}
\usepackage [margin=1.5cm] {geometry}
\ExplSyntaxOn
\let\tl_length:n\tl_count:n
\ExplSyntaxOff
\setmainfont[Color=000000]{Arial}
\setlength{\LTpre}{7pt}
\setlength{\LTpost}{0pt}
\begin{document}
\begin{longtable}[l]{r|p{16cm}}
Mr. Professor & Introduction to Academic Hallucinations, 1890\\
\noalign{\vskip2ex}
\makecell{Mrs.\\ Professor} &\makecell{\textit{``Advanced Time Wasting''}, 1891\\
\textit{``Special Topics in Time Wasting''}, 1892}\\
\end{longtable}
\end{document}
答案2
第一列的宽度
最简单的方法是使用固定宽度的列,如 所声明的p{4cm}
。但是,这需要:
要么猜测一个足够大的宽度,要么接受它很可能比必要的更大的事实,并希望它在文档的发展过程中保持足够大;
或者测量所有盒子并选择最大的宽度,如果不引入冗余,手动完成这项工作会非常麻烦。
但是多亏了这个eqparbox
包,我们可以自动找到足够大以容纳两个感兴趣的框的最小宽度,并为第一列保留一个l
,r
或说明符,里面有适当准备的框。c
为了做到这一点,您首先需要选择一个标签名称——我name
在下面的示例中创造性地选择了该名称。然后,正如eqparbox
手册所说:
使用相同标签制作的所有盒子都排版在一个足够宽的盒子中,以容纳最宽的盒子。
请注意,此过程需要两次编译运行:第一次允许eqparbox
测量材料;在后续运行中,LaTeX 可以使用每个管理框所需的宽度来排版材料。
在这种情况下,我们用标签创建了两个框name
:
\makebox
用创建\eqmakebox[name]{Mr. Professor}
;\parbox
用创建\eqparbox{name}{Mrs.\\ Professor}
。
在第二次及后续编译运行中,该eqparbox
包会确保这两个框具有相同的宽度(并且宽度最小),因为它们共享相同的标签。当然,如果您有多个框“集合”需要以这种方式处理,则可以使用多个标签(每个相同宽度的框集合一个标签)。
\documentclass{article}
\usepackage[letterpaper, left=1.5cm, right=1.5cm, top=1.5cm,
bottom=1.5cm]{geometry}
\usepackage{eqparbox}
\usepackage{longtable}
\setlength{\LTpre}{7pt}
\setlength{\LTpost}{0pt}
\begin{document}
\begin{longtable}[l]{r|p{12cm}}
\eqmakebox[name]{Mr. Professor} & Introduction to Academic Hallucinations, 1890
\end{longtable}
%
\begin{longtable}[l]{r|p{12cm}}
\eqparbox{name}{Mrs.\\ Professor} & \textit{``Advanced Time Wasting''}, 1891\\
& \textit{``Special Topics in Time Wasting''}, 1892
\end{longtable}
\end{document}
第二列中不需要的垂直间隙
至于您用蓝色箭头显示的内容,这是因为\\
结束了 的一行longtable
,因此\textit{``Special Topics in Time Wasting''}, 1892
第二个表中的 在第二行上是独立的。如果您希望它更接近\textit{``Advanced Time Wasting''}, 1891
,您可以使用\newline
而不是\\
,在 内开始新的(文本)行同一个表格单元格在类型列中p
:
\begin{longtable}[l]{r|p{12cm}}
\eqparbox{name}{Mrs.\\ Professor} &
\textit{``Advanced Time Wasting''}, 1891\newline
\textit{``Special Topics in Time Wasting''}, 1892
\end{longtable}
另一种方法是将含义保存\\
在longtable
环境之外,通过\let\nlORI\\
在其中一行之前\begin{longtable}
(甚至是在文档序言中)写入并使用\nlORI
而不是\newline
。
微调
您可能仍然不喜欢上一节最后一段代码中第 1 列和第 2 列单元格之间的垂直对齐。这是因为\eqparbox
,与 一样\parbox
,将创建的框的参考点放在一条水平线上,该水平线默认将框分成两个相同高度的半部分;然后,此参考点与列中排版的段落第一行的基线对齐p
。为了将 的顶线\eqparbox
与 类型的列中唯一单元格的顶线垂直对齐p
,您可以[t]
向 中添加一个说明符\eqparbox
。然后,它的参考点将位于其第一行的基线上,从而提供更好的对齐:
\begin{longtable}[l]{r|p{12cm}}
\eqparbox[t]{name}{Mrs.\\ Professor} &
\textit{``Advanced Time Wasting''}, 1891\newline
\textit{``Special Topics in Time Wasting''}, 1892
\end{longtable}
对问题的评论
expl3
您的示例中有一些完全未使用的代码(\ExplSyntaxOn\let\tl_length:n\tl_count:n\ExplSyntaxOff
);letter
不是 的可识别选项\documentclass
,与 相对a4paper
(我传递letterpaper
给geometry
以达到预期效果);在为问题准备最小工作示例时,传递与问题无关的选项是没有用的。例如,此处与字体相关的代码(
\usepackage{fontspec}
,\setmainfont[...]{Arial}
以及10pt
的选项\documentclass
)与您要询问的问题无关,它们只会使代码混乱并阻止人们使用 pdfTeX 进行测试,而如果您简单地删除此代码,它可以很好地与所有引擎配合使用。因此,最好在此处提问时将其删除。下次您就会知道了。:-)