如何编写包含图形的命令?

如何编写包含图形的命令?

我想要一个包含数字的简写命令。

  • 描述和文件名是必填项
  • 简短标题可选
  • 可选参数可以传递给\includegraphics

这是我想写的片段:

    \newcommand\figH[4][]{
    \begin{figure}[H]
        \begin{center}
            \caption[#4]{\label{#2}#3}
            \includegraphics[#1]{#2}
        \end{center}
    \end{figure}%
    }
    
    \figH[width=\linewidth]{filename}{description}{short-description}
    \figH{filename}{description}{short-description}
    \figH{filename}{description}

我仍然对命令中的可选参数感到困惑。

答案1

除了定义许多参数之外,您还可以定义一个 key=value 接口来设置labelshort-caption 或placefloat 的位置。expkv-cs您可以使用...处理程序将所有未知的 key=value 对(以及没有值的键)放在一个参数中,然后将它们转发给\includegraphics(产生一个可选的 key=value 参数和两个必需参数)。

\documentclass{article}

\usepackage{graphicx}
\usepackage{float}
\usepackage{expkv-cs}

\makeatletter
\newcommand\fig[2][]{\fig@kv{short={#2},#1}{#2}}
\ekvcSplitAndForward\fig@kv\fig@out
  {
    % defaults here
     short = {}% will get set for each call to match the caption argument
    ,internal-label = {} % empty, not for direct use (easier that way)
    ,place = tbp
    ,...
  }
\ekvcSecondaryKeys\fig@kv
  {
     nmeta H = place=H % shortcut
    ,meta label = internal-label=\label{#1} % wraps \label around the value
    % add more keys you want to be handled special here
  }
\newcommand\fig@out[6]
  {%
    \begin{figure}[#3]
      \centering
      \caption[{#1}]{#5#2}%
      \includegraphics[{#4}]{#6}%
    \end{figure}%
  }
\makeatother

\usepackage{duckuments}

\begin{document}
\listoffigures
\blindduck
\fig[H]{A lovely duck}{example-image-duck}

\fig[width=3cm, short=Ducky]{A frightening duck!}{example-image-duck-portrait}
\end{document}

在此处输入图片描述

答案2

不要。你会失去灵活性,同时输入速度也不会提高多少,因为你总是必须记住参数的顺序。

[H]此外,应避免使用此选项,因为它会导致几个分页问题,​​而标准可选参数则figure试图克服这些问题。此外center也不是最好的,\centering声明是最好的。

让我们看看你如何可能你需要

  1. 浮动位置的可选参数
  2. “短”标题的可选参数
  3. 标题的强制参数
  4. 标签的强制性参数
  5. 图形参数的可选参数
  6. 图像文件的强制参数。

放置两个连续的可选参数来处理不同的方面是不好的;所以我们可以在第二个位置插入标签。因此我们需要

\NewDocumentCommand{\addfigure}{
  O{htp} % the suggested default
  m      % the label
  O{#4}  % the short caption (defaults to the long one)
  m      % the caption
  O{}    % the options to \includegraphics
  m      % the file name
}{%
  \begin{figure}[#1]
  \centering
  \caption[#3]{\label{#2}#4}
  \includegraphics[#5]{#6}
  \end{figure}
}

让我们看看可能的调用:

\addfigure{fig:A}[short desc]{long caption}[width=\columnwidth]{filename}

\addfigure{fig:B}[short desc]{long caption}{filename}

\addfigure[!htbp]{fig:C}{long caption}[width=6cm]{filename}

比较最后一项与

\begin{figure}[!htpb]
\centering

\caption{long caption\label{fig:C}}

\includegraphics[width=6cm]{filename}

\end{figure}

并决定哪一个更清晰。

答案3

下面的定义\figH的使用\NewDocumentCommand,有五个参数,如注释中所述。这里\NewDocumentCommand比 更好\newcommand,因为您可以轻松拥有多个可选参数。

这可以作为您的起点,请随意编辑和扩展它以满足您的需要。

\documentclass{article}

\usepackage{graphicx,float}
\usepackage{geometry}

\NewDocumentCommand \figH { O{} m O{} m o }
% #1 = options for \includegraphics (optional, initial to be empty)
% #2 = figure name
% #3 = short caption (optional, initial to be empty)
% #4 = caption
% #5 = label (optional, initial to be NoValue)
  {%
    \begin{figure}[H]%
      \begin{center}%
        \caption[#3]{\IfValueT{#5}{\label{#5}}#4}%
        \includegraphics[#1]{#2}%
      \end{center}%
    \end{figure}%
  }

\begin{document}

\figH[width=\linewidth]{example-image-a}{description}[fig:A]
\figH{example-image-b}[short-description]{description}[fig:B]
\figH{example-image-c}{description}

\end{document}

相关内容