\documentclass{article}
\usepackage{tcolorbox}
\usepackage{tabularray}
\raggedright
\newcommand\secondline{
\begin{tcolorbox}
Line 2
\end{tcolorbox}
}
\begin{document}
\begin{tblr}{colspec=X}
Line 1
\end{tblr}
\secondline
\end{document}
当我输入上述代码时, Overleaf 会生成此代码。但是,如果我删除空行,Overleaf 会生成此代码,从而增加表格和框之间的间距。为什么会这样?还有其他情况会发生这种情况吗?
答案1
你问了“为什么”。我试着解释一下。
LaTeX 宏tblr
打开水平模式而不缩进(执行\noindent
),并在此处放置一个具有给定内容且宽度等于 的框\hsize
。它不会关闭打开的水平模式。然后是\end{tblr}
后面的空格,然后是空行,运行\par
。此 TeX 原始命令删除最后一个空格(即 之后行尾的空格\end{tblr}
),剩余材料适合\hsize
宽度并创建单行段落。宏中的空格( 之后\secondline{
)在垂直模式下处理,不执行任何操作。
第二种情况(没有空行):水平模式下框后有两个空格tblr
。第一个来自 的末尾,\end{tblr}
第二个来自我们的宏。然后宏在框创建之前tcolorbox
运行。所以你有“空格 空格”。基元只删除单个空格,即框后留一个空格。段落创建时有两行,因为框加上后面的空格不适合。\par
\par
\par
tblr
tblr
\hsize
从 TeX 原始角度来看,您的第一个案例可以通过以下方式模拟
\noindent\hbox to\hsize{Line 1\hss}\space\par \space\par\hbox{Line2}
你的第二个案例可以模仿
\noindent\hbox to\hsize{Line 1\hss}\space \space\par\hbox{Line2}
新的 LaTeX 更加复杂,因为\par
TeX 不是原始的,但这对这个问题来说并不重要。
答案2
你的问题是\secondline
对虚假的空间在开始之前tcolorbox
。简而言之,使用这个定义:
\newcommand\secondline{% <----- See https://tex.stackexchange.com/q/7453/5764
\begin{tcolorbox}
Line 2
\end{tcolorbox}
}
如果不包含%
,则会在设置 之前添加一个空格tcolorbox
。由于它前面有一个X
-width 表格(跨越整个文本块宽度),因此在它之后插入的任何空格(当\secondline
紧跟在 之后时tblr
)都会导致额外的换行符,因此会产生“额外的垂直空间”。
通过使用没有虚假空格的正确定义来避免这种情况。