我编写了以下两个程序\newcommand
,分别用于插入带有或不带有标题的图形。
% for fig with caption: #1: width/size; #2: fig file; #3: fig caption
\newcommand{\figwithcaption}[3]{
\begin{figure}[htp]
\centering
\includegraphics[#1]{#2}
\caption{#3}
\end{figure}
}
% for fig without caption: #1: width/size; #2: fig file
\newcommand{\fignocaption}[2]{
\begin{figure}[htp]
\centering
\includegraphics[#1]{#2}
\end{figure}
}
如何将它们统一为一个根据实际接收的参数数量来区分上述两种情况的函数\newcommand
?\fig
\fig{width = 0.50\textwidth}{fig/duck.pdf} % for fig without caption
\fig{width = 0.50\textwidth}{fig/duck.pdf}{A duck.} % for fig with caption
答案1
真的我根本不会使用命令,最好使用环境语法(例如,如果您不隐藏标准语法,它可以帮助编辑器语法突出显示或提供上下文相关的帮助)
如果您确实使用命令,请注意添加额外的空格(您的定义添加了几个空格标记)。
也就是说,\newcommand
支持使用可选参数定义命令。
\newcommand{\fig}[3][\relax]{%
\begin{figure}[htp]%
\centering
\includegraphics[#2]{#3}%
\ifx\relax#1\else\caption{#1}\fi
\end{figure}%
}
\fig{width = 0.50\textwidth}{fig/duck.pdf} % for fig without caption
\fig[Zzzzz]{width = 0.50\textwidth}{fig/duck.pdf} % for fig without caption
答案2
我认为这种方法不会给你带来太多好处。无论如何,这是一种可能的实现方式。
\documentclass{article}
\usepackage{graphicx,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\hfig}{O{}mO{}}
{
\group_begin:
\keys_set:nn { hengxin/fig } { #3 }
\use:x { \exp_not:N \begin{figure}[\l_hengxin_hfig_pos_tl] }
\centering
\includegraphics[#1]{#2}
\tl_if_empty:NF \l_hengxin_hfig_caption_tl
{
\tl_if_empty:NTF \l_hengxin_hfig_shortcaption_tl
{
\caption{\l_hengxin_hfig_caption_tl}
}
{
\caption[\l_hengxin_hfig_shortcaption_tl]{\l_hengxin_hfig_caption_tl}
}
}
\end{figure}
\group_end:
}
\keys_define:nn { hengxin/fig }
{
caption .tl_set:N = \l_hengxin_hfig_caption_tl,
shortcaption .tl_set:N = \l_hengxin_hfig_shortcaption_tl,
pos .tl_set:N = \l_hengxin_hfig_pos_tl,
pos .initial:n = htp,
}
\ExplSyntaxOff
\begin{document}
\hfig[width=.3\textwidth]{example-image-a}
\hfig[width=.3\textwidth]{example-image-b}[
caption=This is a caption\label{aaa},
pos=bp
]
\end{document}
您还可shortcaption
以为案例指定一个键\caption[Short]{Long}
。