第一列的宽度

第一列的宽度

以下结果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(我传递letterpapergeometry以达到预期效果);

  • 在为问题准备最小工作示例时,传递与问题无关的选项是没有用的。例如,此处与字体相关的代码(\usepackage{fontspec}\setmainfont[...]{Arial}以及10pt的选项\documentclass)与您要询问的问题无关,它们只会使代码混乱并阻止人们使用 pdfTeX 进行测试,而如果您简单地删除此代码,它可以很好地与所有引擎配合使用。因此,最好在此处提问时将其删除。下次您就会知道了。:-)

相关内容