如果我定义一个新命令,例如
\newcommand{\command}{htb}
为什么我不能使用这个命令来设置figure
环境的浮动选项?
\begin{figure}[\command]
\centering
\[
f(x) = x^2
\]
\caption{Some equation}
\end{figure}
这不会编译,但是这个
\begin{figure}[htb]
\centering
\[
f(x) = x^2
\]
\caption{Some equation}
\end{figure}
将要。
有人可以解释一下吗?也许可以如何为所有figure
s设置一个通用设置
答案1
这主要基于 LaTeX 如何处理浮点数的可选参数。本质上,它会在不同的宏(\@fps
具体来说)中捕获可选参数,然后尝试通过查看其来扩展该宏\meaning
。然后按顺序处理含义的字符。但是,捕获过程使用\def
,类似于以下设置:
\usepackage[T1]{fontenc}
\def\abc{abc}
\def\ghi{\abc}
\meaning\ghi
返回
在上面的输出中,macro:->
被视为“前缀”,而确切含义是\abc
。以此类比,您\command
将导致 LaTeX 依次处理\
、c
、o
、m
、m
、a
,n
并且d
找不到任何与现有一组已批准的浮点规范相匹配的内容。
简单的解决方案是使用核函数定义默认值:
\makeatletter
\def\fps@figure{htb}
\makeatother
或者你可以使用float
包裹:
\usepackage{float}
\floatplacement{figure}{htb}
或者,如果你非常执着,你可以尝试补丁\@xfloat
:
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@xfloat}% <cmd>
{\def \@fps}% <search>
{\edef\@fps}% <replace>
{}{}% <success><failure>
\makeatother
以上内容将传统版本替换\def
为e
扩展版本。它允许您使用您的设置
\begin{figure}[\command]
% <your figure>
\end{figure}