在新命令中引用分隔符分隔的参数

在新命令中引用分隔符分隔的参数

另一个问题给了我希望有一个优雅的方式(无需使用额外的软件包) 来引用中的逗号分隔的参数\newcommand,可能类似于(只是猜测,未经测试):

\newcommand*\myfigure[3]{
  \begin{figure}
    \includegraphics[width=#3]{#1}
    \caption[\getfirst#2]{\getsecond#2}
  \end{figure}
  \relax
}
\def\getfirst#1,#2\relax{{#1}}
\def\getsecond#1,#2\relax{{#2}}

应该允许使用如下命令:

\myfigure{imagefile}{short caption,long caption}{0.8\textwidth}

不幸的是,标题中经常出现逗号,所以我想知道是否有办法使用逗号以外的其他分隔符来获得所需的结果。

尽管周围有很多类似的问题,但我并没有找到一个能满足我的需求的完美解决方案。

更新

作为一个新手,我刚刚发现我可以使用自定义分隔符\def(任何在标题中很少出现的字符,例如§),这样就可以完全避免逗号问题。猜到了代码还不能工作,但第二个代码似乎\def破坏了它,并出现了错误Argument of \getsfirst has an extra }。有人知道如何修复代码吗?

最后更新

难怪埃格尔知道如何修复代码(谢谢!)我在这里报告(§选择为分隔符),它对某人有用吗(即使 egreg 自己的答案使用另一种方法,应该更好地满足大多数类似需求):

\def\getfirst#1§#2\relax{#1}
\def\getsecond#1§#2\relax{#2}

\newcommand\myfigure[3]{
  \begin{figure}
    \includegraphics[width=#3]{#1}
    \caption[\getfirst#2\relax]{\getsecond#2\relax}
    \label{fig:#1}
  \end{figure}
  \relax
}

答案1

您缺少第二个参数的分隔符:

\newcommand*\myfigure[3]{
  \begin{figure}
    \includegraphics[width=#3]{#1}
    \caption[\getfirst#2\relax]{\getsecond#2\relax}
  \end{figure}
}
\def\getfirst#1,#2\relax{{#1}}
\def\getsecond#1,#2\relax{{#2}}

但是,我认为在明确的figure环境中,这种语法不会给您带来太多好处;例如,您没有为\label您的图形提供。

我建议使用不同的语法,使用可选参数来设置短标题,这可以通过 轻松设置xparse;用逗号将短标题与长标题分开的问题是,逗号经常在标题中,因此您必须非常小心地支撑它们,并且两个参数的优势将会丧失。

\usepackage{xparse}
\NewDocumentCommand{\myfigure}{momm}{%
  \begin{figure}
  \centering
  \includegraphics[width=#4]{#1}
  \IfNoValueTF{#2}{\caption{#3}}{\caption[{#2}]{#3}}
  \end{figure}
}

你可以这样称呼它

\myfigure{imagefile}[short caption]{long caption}{0.8\textwidth}

当需要简短的标题时,或者

\myfigure{imagefile}{long caption}{0.8\textwidth}

当不需要简短的标题时。

您可能需要添加一个可选标签:

\usepackage{xparse}
\NewDocumentCommand{\myfigure}{mommo}{%
  \begin{figure}
  \centering
  \includegraphics[width=#4]{#1}
  \IfNoValueTF{#2}{\caption{#3}}{\caption[{#2}]{#3}}
  \IfValueT{#5}{\label{#5}}
  \end{figure}
}

因此调用可以

\myfigure{imagefile}[short caption]{long caption}{0.8\textwidth}[label]

\myfigure{imagefile}{long caption}{0.8\textwidth}[label]

还提供(可选)标签。


无需额外的软件包,你可以这样做

\makeatletter
\newcommand{\myfigure}[1]{%
  \def\myfigure@file{#1}%
  \@dblarg\myfigure@caption
}
\def\myfigure@caption[#1]#2#3{%
  \begin{figure}
  \centering
  \includegraphics[width=#3]{\myfigure@file}
  \caption[{#1}]{#2}
  \end{figure}
}
\makeatother

使用可选的尾随标签:

\documentclass{article}
\usepackage{graphicx}

\makeatletter
\newcommand{\myfigure}[1]{%
  \begin{figure}
  \def\myfigure@file{#1}%
  \@dblarg\myfigure@caption
}
\def\myfigure@caption[#1]#2#3{%
  \def\myfigure@short{#1}%
  \def\myfigure@long{#2}%
  \def\myfigure@width{#3}%
  \@ifnextchar[{\myfigure@withlabel}{\myfigure@end}%
}
\def\myfigure@withlabel[#1]{%
  \def\myfigure@label{#1}%
  \myfigure@end
}
\def\myfigure@end{%
  \centering
  \includegraphics[width=\myfigure@width]{\myfigure@file}
  \caption[\myfigure@short]{\myfigure@long}
  \ifx\myfigure@label\@empty\else\label{\myfigure@label}\fi
  \end{figure}
}
\let\myfigure@label\@empty
\makeatother

\begin{document}

\listoffigures

\myfigure{example-image}[Short]{Long}{.8\textwidth}

\myfigure{example-image}{Long2}{.8\textwidth}[label]

\end{document}

相关内容