解释

解释

好的,我需要重新定义标题,可能还需要做一些其他的事情,比如

\caption{code}{caption string}

因此,当制作一个图形时

(code) Figure #: caption string

出来的代码将是一个字母,并且可以用不同的颜色(例如红色或蓝色)例如红色R(R 上没有引号)或蓝色D(D 上没有引号),其中图形和标题字符串为黑色。

例如

\caption{\textcolor{red}{R}}{use this caption string}

会出现类似

(R) Figure 1: use this caption string

而且我也需要它适用于表格。

有人能帮助我更新这个命令吗?

答案1

您可以修补figurename

\renewcommand{\figurename}{\textcolor{red}{(R)}\,Figure}

如果你把这个放在序言中,这个变化将适用于所有图形。相反,把它放在环境中,figure使它成为本地的。

代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{graphicx}
\begin{document}
\begin{figure}[htb]
\renewcommand{\figurename}{\textcolor{red}{(R)}\,Figure}
\includegraphics[width=\textwidth]{example-image-a}
\caption{This is a figure}
\end{figure}
\begin{figure}[htb]
%\renewcommand{\figurename}{\textcolor{red}{(R)}\,Figure}
\includegraphics[width=\textwidth]{example-image-a}
\caption{This is a figure}
\end{figure}

\end{document}

在此处输入图片描述

对于表格,做类似的事情:

\renewcommand{\tablename}{\textcolor{red}{(R)}\,Table}

答案2

这里有一个选项,\DeclareCaptionFormat使用caption包;通过 使用此格式,用于具有以下语法的\captionsetup新命令:\ccaption

\ccaption[<caption for the list>]{<color>}{<character>}{<caption for the document>}

代码如下:

\documentclass{article}
\usepackage{xcolor}
\usepackage{caption}

\newcommand\ccolor{black}
\newcommand\cchar{R}

\DeclareCaptionFormat{myformat}{\textcolor{\ccolor}{(\cchar)}~#1#2#3}

\newcommand\ccaption[4][]{%
  \renewcommand\ccolor{#2}
  \renewcommand\cchar{#3}
  \captionsetup{format=myformat}
  \caption[#1]{#4}}

\begin{document}
\listoftables

\begin{figure}[!ht]
\caption{A regular caption}
\end{figure}

\begin{figure}[!ht]
\ccaption{red}{D}{A modified caption for a figure}
\end{figure}

\begin{table}[!ht]
\ccaption[Caption for the list]{blue}{R}{A modified caption for a table}
\end{table}

\begin{table}[!ht]
\ccaption{cyan}{E}{Another modified caption for a table}
\end{table}

\end{document}

在此处输入图片描述

的使用[!ht]只是为了这个例子;我不建议使用它。

答案3

此解决方案不依赖于caption包,并且能够动态地改变\figurename和的外观\tablename
(因为它使用内部\@captype(在我们的例子中扩展为figuretable),所以它也可以在定义标题的其他环境中工作)。

解释

letltxmacro:保存定义\caption

首先我们把原来的定义备份\caption[<list>]{<caption>}\ocaption

xparse:定义新的\caption

然后我们声明新的命令:\caption[<color>]{<pre>}[<list>]{<caption>}

  1. <color> (可选,默认black:显示的颜色(<pre>)。如果<pre>为空,<color>则忽略。
  2. <pre><color>:出现在 中并被 包围的前缀()。如果它为空,则省略()
  3. <list> (可选):行为类似于的原始可选参数\caption
  4. <caption>

etoolbox(code)去哪儿?

正如 egreg 在命令中指出的那样,由于\figurename\tablename等很可能不会使用参数,因此无需使用\pretocmd。当我们使用而不是 时,
这些补丁行甚至可以进一步缩短。\cspreto{\@captype name}{…}\expandafter\preto\csname\@captype name\endcsname{…}

\ocaption:标题

新命令的最后一行\caption使用旧\caption定义(现已保存在\ocaption)来最终处理标题。

笔记

  • 我以前\llap排版时(code),不会改变标题的水平对齐方式(比较标题 1 和 2)。如果您不想要这种行为,请参阅代码注释。

  • 您仍然可以\ocaption[<list>]{<caption>}使用原始定义。但您可以使用带有空第二个参数的 new\caption{}[<list>]{<caption>}来获得相同的行为。

  • 如果需要重复使用(R)或,您可以定义自己的命令:(D)

    \newcommand{\Rcaption}[2][]{%
      \ifx\\#1\\%
        \caption[red]R{#2}%
      \else%
        \caption[red]R[#1]{#2}%
      \fi%
    }
    
  • 如果你很少使用新\caption命令,而经常使用自己的\Rcaption命令,则不必重新定义\caption,而是定义一个改进的\newcaption。请参阅“代码(未更改\caption)”部分!

代码(已更改\caption

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{letltxmacro}
\usepackage{etoolbox}
\makeatletter
\LetLtxMacro{\ocaption}{\caption}
\DeclareDocumentCommand{\caption}{O{black}mO{}m}{% #1 = color for added #2
                                                 % #2 = text to appear in front of Figure, Table, ...
                                                 % #3 = caption for list
                                                 % #4 = caption
  {% keep changes local!
  \ifx\\#2\\\else%
    \cspreto{\@captype name}{\ifvmode\textcolor{#1}{(#2)}~\else\llap{\textcolor{#1}{(#2)}~}\fi}{}{}% (with \llap)
%    \cspreto{\@captype name}{\textcolor{#1}{(#2)}~}{}{}% (without \llap)
  \fi%
  \ifx\\#3\\\ocaption{#4}\else\ocaption[#3]{#4}\fi%
  }%
}
\makeatother
\newcommand{\Rcaption}[2][]{%
  \ifx\\#1\\%
    \caption[red]R{#2}%
  \else%
    \caption[red]R[#1]{#2}%
  \fi%
}
\newcommand{\Dcaption}[2][]{%
  \ifx\\#1\\%
    \caption[blue]D{#2}%
  \else%
    \caption[blue]D[#1]{#2}%
  \fi%
}
\begin{document}
\listoffigures
\listoftables

\hrulefill
\begin{figure}[!ht]
\Rcaption{Caption 1}
\end{figure}
\begin{figure}[!ht]
\caption{}{Caption 2}
\end{figure}
\begin{figure}[!ht]
\Dcaption[Caption 3]{Caption 3 but longer}
\end{figure}

\hrulefill
\begin{table}[!ht]
\Rcaption{Caption 4}
\end{table}
\begin{table}[!ht]
\caption[green]{A}{Caption 5}
\end{table}
\begin{table}[!ht]
\Dcaption[Caption 6 \textcolor{blue}{(D)}]{Caption 6 --- but much more longer so that it spans over one line. You can see now, that \textcolor{blue}{(D)} does not appear in the margin.}
\end{table}

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.
\end{document}

代码(未改变\caption

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{etoolbox}
\makeatletter
\DeclareDocumentCommand{\newcaption}{O{black}mO{}m}{% #1 = color for added #2
                                                    % #2 = text to appear in front of Figure, Table, ...
                                                    % #3 = caption for list
                                                    % #4 = caption
  {% keep changes local!
  \ifx\\#2\\\else%
    \cspreto{\@captype name}{\ifvmode\textcolor{#1}{(#2)}~\else\llap{\textcolor{#1}{(#2)}~}\fi}{}{}% (with \llap)
%    \cspreto{\@captype name}{\textcolor{#1}{(#2)}~}{}{}% (without \llap)
  \fi%
  \ifx\\#3\\\caption{#4}\else\caption[#3]{#4}\fi%
  }%
}
\makeatother
\newcommand{\Rcaption}[2][]{%
  \ifx\\#1\\%
    \newcaption[red]R{#2}%
  \else%
    \newcaption[red]R[#1]{#2}%
  \fi%
}
\newcommand{\Dcaption}[2][]{%
  \ifx\\#1\\%
    \newcaption[blue]D{#2}%
  \else%
    \newcaption[blue]D[#1]{#2}%
  \fi%
}
\begin{document}
\listoffigures
\listoftables

\hrulefill
\begin{figure}[!ht]
\Rcaption{Caption 1}
\end{figure}
\begin{figure}[!ht]
\caption{Caption 2}
\end{figure}
\begin{figure}[!ht]
\Dcaption[Caption 3]{Caption 3 but longer}
\end{figure}

\hrulefill
\begin{table}[!ht]
\Rcaption{Caption 4}
\end{table}
\begin{table}[!ht]
\newcaption[green]{A}{Caption 5}
\end{table}
\begin{table}[!ht]
\Dcaption[Caption 6 \textcolor{blue}{(D)}]{Caption 6 --- but much more longer so that it spans over one line. You can see now, that \textcolor{blue}{(D)} does not appear in the margin.}
\end{table}

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.
\end{document}

输出(两种情况)

输出(两种情况)

相关内容