我想重新定义\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
\renewcommand{\caption*}[1]{...}
首先:无论你输入什么作为替换文本,你都不能说。 *
-variant 是不是一个命令本身:当你说 时\caption
,LaTeX 会查看接下来发生的事情并决定是否执行正常操作(\caption
)或变体(\caption*
)。
第二:即使可以,您也不能根据命令本身来定义命令(如果不采取特殊的预防措施,而事实并非如此)。
如果你说\renewcommand{\foo}{xyz \foo}
,那么 TeX 在找到后\foo
会尽职尽责地将其替换为
xyz \foo
因此它将替换\foo
为xyz \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