我有一份文档,需要打印成两种不同的页面尺寸(A5、A4)。无论页面尺寸如何,有些图总是打印在单独的页面上。在 A5 上打印时没有问题,但在 A4 上打印时,它们周围有太多空白。如果我用 强制顶部位置\begin{figure}[t]
,它在 A4 上可以正常工作,但在 A5 上,图会被推到章节末尾。
我想将浮动位置指定为条件,如下所示
\documentclass{scrartcl}
\RequirePackage{etoolbox}
\newtoggle{a4}
\togglefalse{a4}
\begin{document}
\begin{figure}[\iftoggle{a4}{t}{p}]
Figure
\end{figure}
\end{document}
然而,这会引发一个错误
! LaTeX Error: Unknown float option `\'.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
->\errmessage LaTeX Error: Unknown float option `\reserved@a '.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help\@err@
l.7 \begin{figure}[\iftoggle{a4}{t}{p}]
Option `\' ignored and `p' used.
我知道我可以在命令中将整个图形包装两次\iftoggle{a4}{\begin{figure}[t]...}{\begin{figure}[p]...}
,指定不同的位置,但我想避免重复代码。
有什么方法可以实现这个吗?
答案1
在latex.ltx
浮点位置说明符中没有展开,因此它不起作用。但是,它可以轻松地修补到\edef
参数中,因此\iftoggle
(可扩展)给出了正确的结果:
\documentclass{scrartcl}
\RequirePackage{etoolbox}
\makeatletter
\patchcmd\@xfloat
{\def\@fps{#2}}
{\edef\@fps{#2}}
{}{\ERROR! Failed to patch.}
\makeatother
\newtoggle{a4}
\togglefalse{a4}
\begin{document}
\begin{figure}[\iftoggle{a4}{t}{p}]
Figure
\end{figure}
\end{document}
注意:有许多软件包访问 LaTeX 内核的这一部分,因此此解决方案可能会破坏某些东西。
只需重复一些代码,您就可以执行以下操作:
\documentclass{scrartcl}
\RequirePackage{etoolbox}
\newtoggle{a4}
\togglefalse{a4}
\begin{document}
\iftoggle{a4}
{\begin{figure}[t]}%
{\begin{figure}[p]}% < Don't forget this % here
Figure
\end{figure}
\end{document}
这个有效是因为\begin{environment}
本质上确实如此\begingroup\environment
,将其放在这样的条件中是完全没有问题的。