抱歉,这是初学者的问题,但我想知道是否有一种可靠的方法可以实现标题所说的内容。以下 MWE
\documentclass{book}
\usepackage[demo]{graphicx}
\newcommand{\myoptions}{h!tb}
\begin{document}
\begin{figure}[\myoptions]
\centering
\includegraphics[width=0.5\textwidth]{whatever}
\caption[Short caption citing something]{Long caption.}
\label{fig:whatever}
\end{figure}
\end{document}
给出错误! LaTeX Error: Unknown float option '\'.
。
实际上我找到了一种解决方法(在我的实际文档中,\figure
环境由一个新命令使用,该命令需要定义图形所需的许多参数并将它们放在里面\figure
),但它给\cite
短标题中的命令带来了问题,这就是为什么我正在寻找一个强壮的解决方案。
解决方案
这是该问题的解决方案,作为对已接受答案的评论给出:
\documentclass{book}
\usepackage[demo]{graphicx}
\newcommand{\myoptions}{h!tb}
\def\tmp#1{\begin{figure}[#1]}% use tmp, in the form below, as many times as needed
\begin{document}
\expandafter\tmp\expandafter{\myoptions}
\centering
\includegraphics[width=0.5\textwidth]{whatever}
\caption[Short caption citing something]{Long caption.}
\label{fig:whatever}
\end{figure}
\end{document}
答案1
您在 texlive 2015 版本中遇到错误而在早期版本中没有遇到错误,这是因为它包含了旧fixltx2e
软件包中的修复。
在早期版本中
\newcommand{\myoptions}{h!tb}
\begin{figure}[\myoptions]
然后\myoptions
就不会展开,只是被视为选项序列
\
,,,,,,,,,,,未知选项被默默忽略,所以m
这相当于不,正如你可能从定义中所期望的那样y
,到。o
p
t
i
o
n
s
[pt]
[h!tb]
如果你做了
\newcommand{\foo}{h!tb}
\begin{figure}[\foo]
然后因为不包括合法选项(仅\
,f
和两个o
),该数字是不允许的任何地方因此将始终转到文档末尾或\clearpage
。
版本中的变化2015/01/01
是,由于未定义的浮点放置选项而引发错误,因此在这里您会收到错误\
。
答案2
这是由于最新版本的 LaTeX 中未记录的功能所致,因为使用 TeX Live 2014 运行示例不会引发错误。但没有错误并不意味着它有效。
基于我提出的代码在新命令中引用分隔符分隔的参数,这是一种可能性,其中展示位置选项处于领先地位。
\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}
\NewDocumentCommand{\myfigure}{O{!htbp}mommo}{%
\begin{figure}[#1]
\centering
\includegraphics[width=#5]{#2}
\IfNoValueTF{#3}{\caption{#4}}{\caption[{#3}]{#4}}
\IfValueT{#6}{\label{#6}}
\end{figure}
}
\begin{document}
\listoffigures
\section{Test}
Text
\myfigure{example-image-a}[Short]{Long}{.4\textwidth}
\myfigure{example-image-b}{Long2}{.4\textwidth}[label1]
Text
\myfigure[p]{example-image-c}{Long2}{.8\textwidth}[label2]
\end{document}
为了回答“抽象”的问题,将宏作为可选参数传递的一种强大方法是重置\fps@figure
:
\begingroup\makeatletter\let\fps@figure\myoptions\makeatother
\begin{figure}
...
\end{figure}
\endgroup
当然,这会隐藏在某些宏中:
\newcommand\myoptions{!htbp}
\makeatletter
\newcommand{\myfigure}[<n>]{%
\begingroup\let\fps@figure\myoptions
\begin{figure}
...
\end{figure}
\endgroup
}
\makeatother
如果你想将!htbp
默认位置说明符设置为全部图形环境,只是问题
\makeatletter
\renewcommand*{\fps@figure}{!htbp}
\makeatother