将命令移动到段落开头或结尾

将命令移动到段落开头或结尾

我有一个宏,可以替换段落和图形中间的单词(在 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,这都不能确保包裹图形被放置在一个好的位置。我认为这个宏与另一个宏相比没有什么优势,后者只在最终草稿中根据需要手动移动图形。

相关内容