wrapfigure 文字对齐问题

发布于 2025-03-25 10:17:34

使用 wrapfigure 时文字对齐有问题,代码如下

\documentclass[aspectratio=169]{beamer}
\usepackage[UTF8]{ctex}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc, decorations.markings}
\usepackage{wrapfig} % 用于文字环绕图片
\usepackage{graphicx} % 用于插入图片
\usepackage{circuitikz} 
\begin{document}
\begin{frame}{4. 闭合电路欧姆定律的普遍形式}
    如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
    \begin{wrapfigure}{r}{0.3\textwidth}
        \centering
        \resizebox{0.3\textwidth}{!}{%
        \begin{circuitikz}
        \tikzstyle{every node}=[font=\normalsize]
        \draw (7.5,10) to[battery1,l=$\mathcal{E}_1$] (7.5,10.5);
        \draw (11.25,10) to[battery1,l=$\mathcal{E}_1$] (11.25,10.5);
        \draw (7.5,10.5) to[european resistor,l={ \normalsize $r_1$}] (7.5,11.5);
        \draw (11.25,10.5) to[european resistor,l={ \normalsize $r_2$}] (11.25,11.5);
        \draw (7.5,10) to[short] (7.5,9.25);
        \draw (7.5,9.25) to[short] (11.25,9.25);
        \draw (11.25,9.25) to[short] (11.25,10);
        \draw (7.5,11.5) to[short] (7.5,13);
        \draw (11.25,11.5) to[short] (11.25,13);
        \draw (7.5,13) to[european resistor,l={ \normalsize $R$}] (11.25,13);
        \node [font=\normalsize] at (9.5,9) {$A$};
        \node [font=\normalsize] at (11.5,13) {$B$};
        \node [font=\normalsize] at (7.25,13) {$C$};
        \draw [->, >=Stealth] (10.75,12.5) -- (8.25,12.5)node[pos=0.5, fill=white]{$I$};
        \draw [ dashed] (6.25,12) rectangle  (8.5,9.75);
        \draw [ dashed] (10,12) rectangle  (12.5,9.75);
        \end{circuitikz}
        }%
    \end{wrapfigure}

    规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。
    \begin{itemize}
        \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
        \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
    \end{itemize}
\end{frame}
\end{document}

效果如下:
image.png
图片左边的文字,第一行没有排完就开始排第二行,目的似乎是要末行右对齐,我想要的效果是第一行排完之后再下一行,末行要左对齐。

查看更多

关注者
0
被浏览
280
2 个回答
远方不远
远方不远 2025-03-25
Hello, LuaLaTeX!
  • 翻了下wrapfig的宏包手册,发现要使用这个包实现第一行排满之后,再排第二行,且末行左对齐这个效果,经过多次测试——不是特别容易实现:这主要是你的需求仍有表述不清之处导致的。
  • 在这个宏包条件下,图片尺寸是影响第一行行末提前折行的关键因素,但是第一行行末排满再折行,与图表的尺寸和位置,二者总是很难协调。
  • 众所周知,TeX在图文绕排方面存在所谓固有限制,所以最好的方法是避免图文绕排,或者尽量避免采取较为复杂的图文绕排效果而是只追求较为简单的图文混排效果。

下面抛砖引玉,介绍一些图文绕排的常见方案。

第一个方法LaTeX提供了minipage环境,比较通用,只要提前规划好内容,就可以用这种粗略的方法实现;

%%无需加载额外宏包
%%方法1%%
    \begin{frame}{1. \texttt{minipage}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip2ex%
        \begin{minipage}{.7\linewidth}
            规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。
        \end{minipage}%
        \begin{minipage}{.3\linewidth}
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{minipage}%
        \vskip2ex
        
        \begin{itemize}
            \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
            \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
        \end{itemize}
        
    \end{frame}

第二个方法beamer文档类提供了columns环境,它是一个可以比较便捷的用于左文右图的排版方案;

%%无需加载额外宏包
%%方法2%%
    \begin{frame}{2. \texttt{columns}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip2ex%
        \begin{columns}[onlytextwidth]
        \column[c]{.7\linewidth}
            规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。
        \column[c]{.3\linewidth}
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{columns}%
        \vskip2ex
        
        \begin{itemize}
            \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
            \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
        \end{itemize}
        
    \end{frame}

第三个方法tcolorbox宏包提供了同名环境,其 并排下部 功能是比较现代的左右混排方案,缺点是不能换页,不过在beamer中帧换页本身大多数时候无效,因此屏蔽了这个缺点。由于该宏包的高度可定制化,故推荐优先级最高;

%%\usepackage{tcolorbox}
%%方法3%%
    \begin{frame}{3. \texttt{tcolorbox}方案}
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        \begin{tcolorbox}[
            enhanced,
            frame hidden,
            opacityback=0,
            sidebyside,
            righthand ratio=.3,
            lower separated=false,
            sidebyside gap=0mm,
            left=0cm,
            right=0cm,
            boxsep=0pt,
            boxrule=0pt,
        ]
            规定电动势的方向:
            正极通过外电路指向负极的方向;
            负极通过内电路指向正极的方向。
            \tcblower
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{tcolorbox}
        
        \begin{itemize}
            \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
            \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
        \end{itemize}
        
    \end{frame}

上述三种方法,对于左右型、上下型排版需求,都是可行的策略。下面介绍一些应对特殊型绕排需求的方法。

第四个方法,李清老师的wrapstuff宏包提供了图文绕排的另一种实现,它的优点是可以自由地对需要绕排的图表进行水平或垂直方向上的偏移

  • wrapstuff尝试整合和扩展picinparfloatfltwrapfigcutwinwrapfig2等同类宏包的功能,且兼容captionfloatfloatrow等宏包,并试图兼容显示(display)数学公式和各种 LaTeX 列表环境,可以让他们正确绕排。如果需要将图表绕排在列表环境(问题描述中的第三段)附近,也可以试试这个包。
  • 需要注意的是,wrapstuff的实现依赖LaTeX 2021-06-01开始提供的段落钩子,并依赖LaTeX3 2022-04-10之后的版本。
%%\usepackage{wrapstuff}
%%方法4%%
    \begin{frame}{4.1 \texttt{wrapstuff}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip3ex%
        \begin{wrapstuff}[r,top=0,width=.2\linewidth,vsep=0pt,voffset=-2mm]
            \includegraphics[height=\dimeval{3\baselineskip}]{example-image}
        \end{wrapstuff}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通。
        \wrapstuffclear
        
        \vskip3ex%
        \begin{itemize}
            \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
            \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
        \end{itemize}
        
    \end{frame}
    \begin{frame}{4.2 \texttt{wrapstuff}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip3ex%
        \begin{wrapstuff}[r,top=0,width=.2\linewidth,vsep=0pt,voffset=-2mm]
            \includegraphics[height=\dimeval{3\baselineskip}]{example-image}
        \end{wrapstuff}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通。
        \wrapstuffclear
        
        \vskip3ex%
        \begin{wrapstuff}[r,top=0,width=.2\linewidth,vsep=0pt]
            \includegraphics[height=\dimeval{3\baselineskip}]{example-image}
        \end{wrapstuff}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向。
        
    \end{frame}

第五个方法wrapfig通常作为picinpar宏包的互补解决方案,wrapfig宏包的优点是可以不必指定把多少文字包含进绕排的范围,且可以让图表超出版心而不报错。

  • 然而wrapfigpicinpar一样,在本页剩下的空间中必须足够放下被绕排的图表,也就是说起码这个段落的“边界盒子”的上下界要能够包含该图表。你的提问中,图表到底跟哪一段成绕排关系,并未说清,因此我只能按照我自己的想法来操作。所以我就假设你只是想在第二段绕排,不过显然的是该段文字数量略少,因此极大可能造成难看的分页。
  • 在我的测试中,发现段落的高度至少要超过图表的总高度以及图表上下的额外垂直间距之和两行以上,这种在一个段落的右上角排版图片的绕排方案才能取得比较好的视觉效果。
  • 所以使用此包,需要改进的观点是:在wrapfigure环境后面,必须紧跟着字数足够多的纯文本段落,否则排版通常会非常难看。
%%\usepackage{wrapfig}
%%方法5%%
    \begin{frame}{5.1 \texttt{wrapfig}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip3ex%
        \begin{wrapfigure}[5]{r}[0pt]{.2\textwidth}
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{wrapfigure}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通。
        \vskip3ex%
        
        \begin{itemize}
            \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
            \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
        \end{itemize}
        
    \end{frame}
        \begin{frame}{5.2 \texttt{wrapfig}方案}
        
        如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。
        
        \vskip3ex%
        \begin{wrapfigure}[5]{r}[0pt]{.2\textwidth}
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{wrapfigure}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通。
        \vskip3ex%
        \begin{wrapfigure}[5]{r}[0pt]{.2\textwidth}
            \centering
            \includegraphics[height=3\baselineskip]{example-image}
        \end{wrapfigure}%
        规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方方方方向向向。
        
    \end{frame}

最后,刘海洋老师在其书《LaTeX入门》中介绍:在TeX内部,绕排工具都是通过\parshape命令和一系列复杂的盒子操作和计算完成的,这也解释了为什么wrapfig在列表环境附近失效的原因(列表环境也依靠\parshape),完全可以通过\parshape产生形状更为复杂的绕排效果,而shapepar宏包的\cutout命令就部分地实现了这一复杂能力,不过具体位置和参数需要手工仔细调整。如果有兴趣,也可以自行去了解一下这个底层命令和这个有趣的宏包。

烟云幻梦
烟云幻梦 2025-03-25
数学系咸鱼一枚!

image.png

上面的注意事项需要看下!然后这个也挺不美观的,修改了一下:

\documentclass[aspectratio=169]{beamer}
\usepackage[UTF8]{ctex}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc, decorations.markings}
\usepackage{wrapfig} % 用于文字环绕图片
\usepackage{graphicx} % 用于插入图片
\usepackage{circuitikz} 
\begin{document}
\begin{frame}{4. 闭合电路欧姆定律的普遍形式}
如图,闭合回路中有多个电源,若电动势 \(\mathcal{E}_1\) 大于 电动势 \(\mathcal{E}_2\),则电流方向如图。

规定电动势的方向:正极通过外电路指向负极的方向;负极通过内电路指向正极的方向。
    \begin{wrapfigure}{r}{0.3\textwidth}
    \vspace{-1.5\baselineskip}
        \centering
        \resizebox{0.3\textwidth}{!}{%
        \begin{circuitikz}
        \tikzstyle{every node}=[font=\normalsize]
        \draw (7.5,10) to[battery1,l=$\mathcal{E}_1$] (7.5,10.5);
        \draw (11.25,10) to[battery1,l=$\mathcal{E}_1$] (11.25,10.5);
        \draw (7.5,10.5) to[european resistor,l={ \normalsize $r_1$}] (7.5,11.5);
        \draw (11.25,10.5) to[european resistor,l={ \normalsize $r_2$}] (11.25,11.5);
        \draw (7.5,10) to[short] (7.5,9.25);
        \draw (7.5,9.25) to[short] (11.25,9.25);
        \draw (11.25,9.25) to[short] (11.25,10);
        \draw (7.5,11.5) to[short] (7.5,13);
        \draw (11.25,11.5) to[short] (11.25,13);
        \draw (7.5,13) to[european resistor,l={ \normalsize $R$}] (11.25,13);
        \node [font=\normalsize] at (9.5,9) {$A$};
        \node [font=\normalsize] at (11.5,13) {$B$};
        \node [font=\normalsize] at (7.25,13) {$C$};
        \draw [->, >=Stealth] (10.75,12.5) -- (8.25,12.5)node[pos=0.5, fill=white]{$I$};
        \draw [ dashed] (6.25,12) rectangle  (8.5,9.75);
        \draw [ dashed] (10,12) rectangle  (12.5,9.75);
        \end{circuitikz}
        }%
    \end{wrapfigure}

    \begin{itemize}
        \item 对于 \(\mathcal{E}_1\):电流方向与电动势方向一致,电荷经过时静电力做负功,电势升高 \(\mathcal{E}_1\)
        \item 对于 \(\mathcal{E}_2\):电流方向与电动势方向相反,电荷经过时静电力做正功,电势降低 \(\mathcal{E}_2\),此时相当于电阻。
    \end{itemize}
    
    
\end{frame}
\end{document}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览