使用条件浮动位置

使用条件浮动位置

我有一份文档,需要打印成两种不同的页面尺寸(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,将其放在这样的条件中是完全没有问题的。

相关内容