\renewcommand 和 \caption*

\renewcommand 和 \caption*

我想重新定义\caption*

\renewcommand{\caption*}[1]{\vspace{\abovecaptionskip}\caption*{\textbf{Note:} #1}\vspace{-\abovecaptionskip}}

但当我尝试编译时,总是出现错误。我的解决方法是定义新命令\floatnote并使用它代替\caption*。这是一个非常好的解决方法,但我留下了一个问题:

问:为什么上述\renewcommand代码不起作用?

\documentclass{article}
\usepackage{booktabs}
\usepackage[margin=10pt,font=small,labelfont=bf,labelsep=colon,tableposition=top,figureposition=bottom]{caption}
%\renewcommand{\caption*}[1]{\vspace{\abovecaptionskip}\caption*{\textbf{Note:} #1}\vspace{-\abovecaptionskip}}
\newcommand{\floatnote}[1]{\vspace{\abovecaptionskip}\caption*{\textbf{Note:} #1}\vspace{-\abovecaptionskip}}
\begin{document}
Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.

\begin{table}[h]
  \centering
  \caption{Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.}
  \begin{tabular}{ll}
    \toprule
    foo & bar \\
    \midrule
    baz & qux \\
    \bottomrule
  \end{tabular}
  %\caption*{Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.}
  \floatnote{Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.}
\end{table}

Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
\end{document}

标签1

答案1

\renewcommand{\caption*}[1]{...}首先:无论你输入什么作为替换文本,你都不能说。 *-variant 是不是一个命令本身:当你说 时\caption,LaTeX 会查看接下来发生的事情并决定是否执行正常操作(\caption)或变体(\caption*)。

第二:即使可以,您也不能根据命令本身来定义命令(如果不采取特殊的预防措施,而事实并非如此)。

如果你说\renewcommand{\foo}{xyz \foo},那么 TeX 在找到后\foo会尽职尽责地将其替换为

xyz \foo

因此它将替换\fooxyz \foo...当内存耗尽时,TeX 将停止。

定义的策略\floatnote肯定更好。

答案2

这个答案与 egreg 的答案相呼应,并提供了更多细节。

当使用 LaTeX 定义\newcommand\renewcommand和 时\providecommand,控制序列的定义中只允许使用字母。有时你可能会使用@,但这只有在将类别代码从其他(或 12)更改为字母(或 11)后才允许;因此调用\makeatletter。有关 TeX 类别代码的列表,请参阅类别代码是什么?您可以使用其他非字母字符构造,但必须使用不同的(更低级的)控制序列定义/构造。

定义(重新)带有 -variant 的命令的方式*是通过“逐字查看” - 这使用 TeX 条件\@ifstar(参见*使用选项定义的命令) - 或者使用支持它的构造,比如由xparse或者suffix无论如何,无论是条件作用还是使用支持技术,您都可以(重新)定义未加星号的版本,并且仅提供一个*变体。

*下面展示了如何使用 -variant重新定义命令xparse

\usepackage{xparse}% http://ctan.org/pkg/xparse
\RedefineDocumentCommand{\somecommand}{s ...}{
  % macro contents where #1 refers to *-variant (true) or not (false)
  \IfBooleanTF{#1}% Condition on *
    {}% TRUE: \somecommand*
    {}% FALSE: \somecommand
}

接口的suffix使用方法如下:

\usepackage{suffix}% http://ctan.org/pkg/suffix
\newcommand\somecommand{...}% unstarred version
\WithSuffix\newcommand\somecommand*{...}% *-variant

相关内容