MWE 显示wrapfig
下面的短表列表旁边的行为。
\documentclass{article}
\usepackage[]{wrapfig}
\usepackage[]{booktabs}
\usepackage[]{blindtext}
\setlength{\parindent}{0pt} % Without it, all \entry below will be indented, which is not desireable for the MWE's purposes.
\newcommand{\tab}{%
\begin{tabular}{r}
\toprule
This \\ \midrule
is \\
a \\
table \\
\bottomrule
\end{tabular}
}
\newcommand{\entry}{%
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}lr@{}}
\toprule
a & b \\ \midrule
c & d \\
\bottomrule
\end{tabular*}
}
\begin{document}
\blindtext
\begin{wraptable}{l}{0pt}
\tab
\end{wraptable}
\entry
\entry
\entry
\entry
\blinddocument
\end{document}
输出(第一页)如下所示。
可以看出,wraptable
垂直放置在预期的位置。但是,水平放置时却不是这样:它并没有像我预期的那样在它旁边减少。它应该导致环绕 的\linewidth
多个,即改变旁边适合 的 的。\entry
wraptable
\linewidth
wraptable
1. 这能实现吗?如何实现?
此外,它还会将文本缩进四个以下。此缩进在文档的其余部分中\entry
每次重复。\par
2. 为什么会出现这种重复压痕?
周围有wraptable
一些垂直空间。水平方向有一些较小的空间,我猜是长度\columnsep
。3. 垂直空间是否可以缩小到等于换行文本和wraptable
/之间的水平空间wrapfigure
?
答案1
wrapfig
它的工作原理是使用包装对象的高度来计算应缩短的文本行数,然后缩短这些行。有时,这并不正确,您可以使用可选参数覆盖该数字。在这种情况下,这永远不够,因为它实际上无法找到可以缩短的任何行,直到遇到一些普通文本。
基本上,文字环绕图形或表格是难的在 LaTeX 中,没有解决方案可以避免相当大的脆弱性。wrapfig
通过在文档中解释限制等并提供针对某些类型的问题的解决方法来尽力而为。
在这种情况下,最好的办法就是简单地手动进行包装,minipage
例如依靠 s。
这需要调整,但是是这样的:
\documentclass{article}
\usepackage{booktabs,calc}
\usepackage{blindtext}
\setlength{\parindent}{0pt} % Without it, all \entry below will be indented, which is not desireable for the MWE's purposes.
\newcommand{\tab}{%
\begin{tabular}{r}
\toprule
This \\ \midrule
is \\
a \\
table \\
\bottomrule
\end{tabular}%
}
\newcommand{\entry}{%
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}lr@{}}
\toprule
a & b \\ \midrule
c & d \\
\bottomrule
\end{tabular*}%
}
\begin{document}
\blindtext
\begin{minipage}[]{25mm}
\tab
\end{minipage}%
\begin{minipage}{\linewidth-25mm}
\entry
\entry
\entry
\entry
\end{minipage}
\blinddocument
\end{document}
将产生
这不太方便,但我们可以定义一个包装器来提供一些帮助。\wrapmytable[]{}{}
需要一个可选参数和两个强制参数。如果指定,可选参数指定左侧部分的宽度。否则,这是内容的自然宽度。第二和第三个参数指定左侧和右侧内容。\columnsep
允许作为两部分之间的分隔。
例如,
\wrapmytable{\tab}{%
\entry
\entry
\entry
\entry
}
生产
完整代码:
\documentclass{article}
\usepackage{booktabs,calc}
\usepackage{blindtext}
\setlength{\parindent}{0pt} % Without it, all \entry below will be indented, which is not desireable for the MWE's purposes.
\newcommand{\tab}{%
\begin{tabular}{r}
\toprule
This \\ \midrule
is \\
a \\
table \\
\bottomrule
\end{tabular}%
}
\newcommand{\entry}{%
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}lr@{}}
\toprule
a & b \\ \midrule
c & d \\
\bottomrule
\end{tabular*}%
}
\newlength\mywrapwidth
\newcommand\wrapmytable[3][]{%
\edef\tempa{}%
\edef\tempb{#1}%
\ifx\tempa\tempb\settowidth{\mywrapwidth}{#2}\else\setlength\mywrapwidth{#1}\fi
\smallskip
\begin{minipage}{\mywrapwidth}
#2
\end{minipage}\hskip \columnsep
\begin{minipage}{\linewidth-\mywrapwidth-\columnsep}
#3
\end{minipage}%
\smallskip
}
\begin{document}
\blindtext
\wrapmytable{\tab}{%
\entry
\entry
\entry
\entry
}
\blinddocument
\end{document}
编辑
为了回应评论中的查询,请使用t
可选参数中的放置选项,minipage
并tabular
允许左侧和右侧部分按要求在顶部对齐。
代码:
\documentclass{article}
\usepackage{booktabs,calc}
\usepackage{blindtext}
\setlength{\parindent}{0pt} % Without it, all \entry below will be indented, which is not desireable for the MWE's purposes.
\newcommand{\tab}{%
\begin{tabular}[t]{r}
\toprule
This \\ \midrule
is \\
a \\
table \\
\bottomrule
\end{tabular}%
}
\newcommand{\entry}{%
\begin{tabular*}{\linewidth}[t]{@{\extracolsep{\fill}}lr@{}}
\toprule
a & b \\ \midrule
c & d \\
\bottomrule
\end{tabular*}%
}
\newlength\mywrapwidth
\newcommand\wrapmytable[3][]{%
\edef\tempa{}%
\edef\tempb{#1}%
\ifx\tempa\tempb\settowidth{\mywrapwidth}{#2}\else\setlength\mywrapwidth{#1}\fi
\smallskip
\begin{minipage}[t]{\mywrapwidth}
#2
\end{minipage}\hskip \columnsep
\begin{minipage}[t]{\linewidth-\mywrapwidth-\columnsep}
#3
\end{minipage}%
\smallskip
}
\begin{document}
\blindtext
\wrapmytable{\tab}{%
\entry
\entry
\entry
\entry
}
\blinddocument
\end{document}
由下面的 OP 编辑,上面的原始答案未经编辑。
这对于缩进其中几个也非常有效\entry
,但可能需要针对特定实现进行一些调整。
\entry
\wrapmytable[]{\tab}{%
\entry
\entry
\entry
}
\entry
产量
我编辑了\entry
以显示\the\linewidth
以说明 s 的效果minipage
。您可能会注意到, 之间的垂直空间\entry
变化\linewidth
并不尽可能小。这可以通过禁用\smallskip
定义中的两个 s来解决\wrapmytable
。如果 的第三个参数\wrapmytable
比第二个输入参数具有更大的高度(如果需要,还可以跳过一些) ,那么这可能没问题。