我尝试做一些类似的事情左右两侧都有边注吗?但有wrapfig
(或另一个允许它的包)。
目标是让两个边注稍微与主文本区域重叠,并使文本扭曲。但两个边注必须位于同一行,就像这个模板中一样:
灰色区域代表便笺。因此,如您所见,便笺可以包含不同大小的内容。
因此,为此做出了以下 MWE:
\documentclass[a4paper,12pt,oneside,french]{article}
\usepackage{wrapfig,graphicx,lipsum}
\begin{document}
\begin{wrapfigure}{l}[2cm]{0.3\textwidth}
\includegraphics[width=\linewidth,height=80pt]{example-image}
\end{wrapfigure}
\begin{wrapfigure}{r}[2cm]{0.3\textwidth}
\includegraphics[width=\linewidth,height=200pt]{example-image}
\end{wrapfigure}
\lipsum[1-4]
\end{document}
但是,正如您所看到的,我得到了错误的渲染:
那么,我们如何才能得到一行中与文本区域重叠的两个边距注释呢?
答案1
以下是基于@UlrikeFischer 答案的解决方案这里,使用\parshape
而不是warpfigure
。它还依赖于\replicate
@JosephWright 定义的命令这里。
\doublewrap
我定义了一个接受六个参数的新命令:
- (强制的)左边距注释的宽度,
- (选修的)左边距注释应跨越的行数,
- (强制的)左边注解的内容,
而 4、5 和 6 分别与 1、2 和 3 相同,但用于右侧边距注释而非左侧边距注释。\doublewrap
输出两个边距注释,其中一半与边距重叠。它应该用在段落之前,段落应该足够长以跨越边距注释的整个高度。如果没有给出,注释应该跨越的行数(参数 2 和 5)会自动计算,但我强烈怀疑,在以下段落包含修改行高(例如显示数学环境)的情况下,手动设置它们会更好。
这是该命令的定义以及两个示例,第一个示例以图像作为边注,第二个示例以文本作为边注。
\documentclass{article}
\usepackage{xparse}
\usepackage{graphicx}
\usepackage{calc}
\usepackage{calculator}
\usepackage{lipsum}
\makeatletter
\newcommand*\replicate[1]{%
\expandafter\replicate@aux\romannumeral\number\numexpr #1\relax000Q{}
}
\newcommand*\replicate@aux[1]{\csname replicate@aux@#1\endcsname}
\newcommand\replicate@aux@m{}
\long\def\replicate@aux@m#1Q#2#3{\replicate@aux#1Q{#2#3}{#3}}
\newcommand\replicate@aux@Q[2]{#1}
\makeatother
\newlength{\betweenwidth}
\newlength{\betweenpluswidth}
\newlength{\leftnotewidth}
\newlength{\rightnotewidth}
\newlength{\leftnotetotalheight}
\newlength{\rightnotetotalheight}
\newlength{\leftraise}
\newlength{\rightraise}
\newcounter{leftlines}
\newcounter{rightlines}
\newcounter{totallines}
\newsavebox{\leftbox}
\newsavebox{\rightbox}
\NewDocumentCommand{\doublewrap}{m o m m o m}{%
\setlength{\leftnotewidth}{#1}
\setlength{\rightnotewidth}{#4}
\savebox{\leftbox}{\parbox{.9\leftnotewidth}{#3}}
\savebox{\rightbox}{\parbox{.9\rightnotewidth}{#6}}
\setlength{\leftnotetotalheight}{\ht\leftbox+\dp\leftbox}
\setlength{\rightnotetotalheight}{\ht\rightbox+\dp\rightbox}
\setlength{\betweenwidth}{\textwidth - .5\leftnotewidth - .5\rightnotewidth}
\IfNoValueTF{#2}
{\LENGTHDIVIDE{\leftnotetotalheight}{\baselineskip}{\divsol}%
\INTEGERPART{\divsol}{\roundsol}%
\setcounter{leftlines}{\roundsol+1}}
{\setcounter{leftlines}{#2}}
\IfNoValueTF{#5}
{\LENGTHDIVIDE{\rightnotetotalheight}{\baselineskip}{\divsol}%
\INTEGERPART{\divsol}{\roundsol}%
\setcounter{rightlines}{\roundsol+1}}
{\setcounter{rightlines}{#5}}
\setcounter{totallines}{\maxof{\theleftlines}{\therightlines} + 2}
\ifdim \leftnotetotalheight > \rightnotetotalheight
\setlength{\rightraise}{\ht\leftbox - \ht\rightbox}
\setlength{\leftraise}{0pt}
\setlength{\betweenpluswidth}{\betweenwidth + .5\rightnotewidth}
\parshape \thetotallines %
-.5\leftnotewidth \betweenwidth
\replicate{ \therightlines}{.5\leftnotewidth \betweenwidth}
\replicate{\theleftlines-\therightlines}{.5\leftnotewidth \betweenpluswidth}
0pt \textwidth
\else
\setlength{\leftraise}{\ht\rightbox - \ht\leftbox}
\setlength{\rightraise}{0pt}
\setlength{\betweenpluswidth}{\betweenwidth + .5\leftnotewidth}
\parshape \thetotallines %
-.5\leftnotewidth \betweenwidth
\replicate{ \theleftlines}{.5\leftnotewidth \betweenwidth}
\replicate{\therightlines-\theleftlines}{ 0pt \betweenpluswidth}
0pt \textwidth
\fi
\noindent\raisebox{-\height}[0pt][0pt]{%
\makebox[\textwidth + .5\leftnotewidth + .5\rightnotewidth]{%
\raisebox{\leftraise}{\usebox{\leftbox}}%
\hfill%
\raisebox{\rightraise}{\usebox{\rightbox}}%
}%
}%
}
\begin{document}
\doublewrap{.3\textwidth}{%
\includegraphics[width=.27\textwidth, height=3cm]{example-image-a}%
}{.3\textwidth}{%
\includegraphics[width=.27\textwidth, height=5cm]{example-image-b}%
}
\lipsum*[1-2]
\doublewrap{.4\textwidth}{%
\LipsumPar{4}
}{.22\textwidth}{%
\lipsum[1][1]
}
\lipsum*[8-9]
\end{document}