我有一个宏,可以替换段落和图形中间的单词(在 wrapfigure 环境中)。但文本对齐看起来很糟糕,似乎是因为在文本中间不能使用 wrapfigure(如此处指出的那样:将图片包裹在文本中,而不会产生丑陋的对齐文本)。我想将环绕图移动到段落的开头或结尾。
换句话说。目前,这是:
This is a \mycommand{long} text.
变成:
This is a \textbf{long}\begin{wrapfigure}...\end{wrapfigure} text.
但应该是:
\begin{wrapfigure}...\end{wrapfigure}
This is a \textbf{long} text.
答案1
这有效,但我不确定摆弄它是否\everypar
会破坏某些东西,特别是在列表内使用时:
\documentclass{article}
\usepackage{lipsum}
\newtoks\oldeverypar
\def\insertedfigure{\fbox{Inserted figure or whatever}\everypar=\oldeverypar\par}
\def\mycommand#1{\textbf{#1}\oldeverypar=\everypar\everypar={\insertedfigure}}
\begin{document}
\lipsum[66]
\lipsum*[66] This is \mycommand{another} test. \lipsum[66]
\lipsum[66]
\end{document}
基本上,\mycommand
将其参数以粗体显示,并存储在\everypar
将扩展为所需图形的标记中(将在当前段落完成后输出)。它还保存当前的值\everypar
,并在输出图形后恢复它。
此示例的结果是:
另一个更接近您的问题的例子是提供以下定义\insertedfigure
:
\def\insertedfigure{%
\begin{wrapfigure}{R}{0.5\textwidth}
\centerline{\includegraphics[width=0.4\textwidth]{example-image}}
\caption{Example figure}
\end{wrapfigure}%
\everypar=\oldeverypar\par}
其结果为:
然而,正如你所看到的,这会导致图形出现在下一段,尽管问题标题如此,但我想这并不好。
答案2
只需将其作为\mycommand
段落其余部分的第二个参数即可,即:
This is a \mycommand{long}{text.}
然后,您可以将格式设置#1
为粗体,然后只需书写#2\par
,最后是环绕图形,而无需任何神奇的 TeX。
\documentclass[11pt]{article}
\usepackage{wrapfig,graphicx}
\def\mycommand#1#2{\textbf{#1} #2\par
\begin{wrapfigure}{R}{0.35\linewidth}
\centering\includegraphics[width=0.3\linewidth]{example-image-a}
\caption{Example figure}
\end{wrapfigure}\par}
\def\a{This is the first paragraph. }
\def\b{This is another long paragraph. }
\begin{document}
This is a \mycommand{long}{text. \a\a\a\a\a\a\a}
\b\b\b\b\b\b\b\b\b
\end{document}
但是,无论有没有\everypar
,这都不能确保包裹图形被放置在一个好的位置。我认为这个宏与另一个宏相比没有什么优势,后者只在最终草稿中根据需要手动移动图形。