将命令作为环境的可选参数传递

将命令作为环境的可选参数传递

抱歉,这是初学者的问题,但我想知道是否有一种可靠的方法可以实现标题所说的内容。以下 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,到。options[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

相关内容