我在写论文时经常遇到的一个难题是让图表出现在正确的页面上。实际上,这个问题通常可以通过剪切\begin{figure} ... \end{figure}
并粘贴到文档的较高位置来解决。
但是,该图在语义上与论文中的某个段落相关,因此将其定义保留在该段落附近的文本中更有意义。(然后编辑标题的人更有可能审查相关段落以进行并行更改。)
我想要的是能够在一个位置定义一个图形,但将其放置在其他地方,通常是在 tex 的较早位置。有谁能好地解决这个问题?
我的尝试:
为了尝试实现此功能,我可以创建一个\newcommand
包含图形定义的命令,但我无法将该命令放在文档中较早的位置,因为它尚未定义。
这个问题提供了一种在创建之前使用宏的方法。但是,当图形定义位于宏内时,该方法会失败,其响应! TeX capacity exceeded, sorry [text input levels=15].
似乎表明存在无限循环问题,但坦率地说,我对此的理解远远超出了我的能力范围。
答案1
您可以使用双程系统。
\documentclass{article}
\usepackage{environ}
\usepackage{graphicx}
\usepackage{lipsum}
\makeatletter
\newwrite\remember@figures
\AtBeginDocument{%
\InputIfFileExists{\jobname.dft}{}{}%
\immediate\openout\remember@figures=\jobname.dft
}
\AtEndDocument{\immediate\closeout\remember@figures}
\NewEnviron{dfigure}[1]{%
\immediate\write\remember@figures{%
\noexpand\rememberfigure{#1}{\unexpanded\expandafter{\BODY}}%
}%
}
\newcommand{\placefigure}[2][tp]{%
\csname remembered@figure@#2\endcsname{#1}
}
\newcommand{\rememberfigure}[2]{%
\global\@namedef{remembered@figure@#1}##1{%
\begin{figure}[##1]#2\end{figure}%
}%
}
\makeatother
\begin{document}
\placefigure[!htp]{first}
\lipsum[1]
\begin{dfigure}{first}
\centering
\includegraphics[width=4cm]{example-image-a}
\caption{Example image A}
\end{dfigure}
\begin{dfigure}{second}
\centering
\includegraphics[width=4cm]{example-image-b}
\caption{Example image B}
\end{dfigure}
\lipsum[3-5]
\placefigure[b]{second}
\end{document}
环境dfigure
将内容和定义它的键保存在辅助文件中,该文件在开始文档时读取。\placefigure
您可以使用合适的定位选项将相应的图形放置在您喜欢的位置。
答案2
- 我想你的意思是这样的——至少在这里你可以完全控制位置。
- 我用的是这个
float
包。 - 它提供了
H
放置选项,这意味着确切地这里 :)。
\documentclass{article}
\usepackage{float}
\usepackage{graphicx}
\usepackage{blindtext}
\begin{document}
\blindtext
\begin{figure}[H]
\includegraphics[width=\textwidth]{example-image-a}
\caption{1st picture}
\end{figure}
\blindtext
\begin{figure}[H]
\includegraphics[width=\textwidth]{example-image-b}
\caption{2nd picture}
\end{figure}
\end{document}