Hyperref 兼容性,可自动加粗浮动标题的第一句 float

Hyperref 兼容性,可自动加粗浮动标题的第一句 float

我可以按照给出的方法自动将浮动标题的第一句话加粗 自动将浮动标题的第一句加粗。但是,当我使用 hyperref 包时,这种方法不再起作用。

在以下 MWE 中,自动加粗在\usepackage{hyperref}被注释或取消注释时分别起作用或不起作用。

\documentclass{article}
\usepackage{caption}
\usepackage{etoolbox}
\usepackage{xstring}

\makeatletter
\newcommand\formatlabel[1]{%
    \noexpandarg
    \IfSubStr{#1}{.}{%
      \StrBefore{#1}{.}[\firstcaption]%
      \StrBehind{#1}{.}[\secondcaption]%
      \textbf{\firstcaption.} \secondcaption}{%
      #1}%
      }
\patchcmd{\@caption}{#3}{\formatlabel{#3}}
\makeatother

\usepackage{hyperref}

\begin{document}

\begin{figure}[tb]
    \caption{First sentence that should be bold. Second sentence should not be.}
    \label{fig:figure1}
\end{figure}

\end{document}

有没有其他方法可以使第一句话变为粗体并适用于 hyperref?

答案1

的定义\@caption多次包含第三个参数,来自包caption\@caption将重新定义为\caption@@caption):

\long\def\caption@@caption#1[#2]#3{%
  \ifcaption@star \else
    \caption@prepareanchor{#1}{#2}%
    \memcaptioninfo{#1}{\csname the#1\endcsname}{#2}{#3}%
    \@nameuse{nag@hascaptiontrue}%
  \fi
  \par
  \caption@beginex{#1}{#2}{#3}%
    \caption@setfloatcapt{%
      \caption@boxrestore
      \if@minipage
        \@setminipage
      \fi
      \caption@normalsize
      \ifcaption@star
        \let\caption@makeanchor\@firstofone
      \fi
      \@makecaption{\csname fnum@#1\endcsname}%
                   {\ignorespaces\caption@makeanchor{#3}}\par
      \caption@if@minipage\@minipagetrue\@minipagefalse}%
  \caption@end
}

因此\patchcmd只替换了第一次出现的情况。顺便说一句,\patchcmd在成功或失败的情况下,代码有两个额外的参数。

以下示例使用了不同的方法。宏\formatlabel通过“链式”重新定义引入。此外,它还移至\AtBeginDocumentcaption查看旧定义。

\documentclass{article}
\usepackage{caption}
\usepackage{xstring}
\usepackage{hyperref}

\makeatletter
\newcommand\formatlabel[1]{%
    \noexpandarg
    \IfSubStr{#1}{.}{%
      \StrBefore{#1}{.}[\firstcaption]%
      \StrBehind{#1}{.}[\secondcaption]%
      \textbf{\firstcaption.} \secondcaption}{%
      #1}%
}
\AtBeginDocument{%
  \newcommand*{\org@caption}{}%
  \let\org@caption\@caption
  \def\@caption#1[#2]#3{%  
    \org@caption{#1}[{#2}]{\formatlabel{#3}}%
  }%
}   
\makeatother

\begin{document}

\begin{figure}[tb]
  \caption{First sentence is bold. Second sentence is not.}
  \label{fig:figure1}
\end{figure}

\end{document}

结果

答案2

加载时hyperref,命令\@caption被重新定义,因此第三个参数#3在代码中出现三个不同位置,而不是只出现一次。看来你只需要替换第三个出现的位置即可#3\fi获得所需的效果。

示例输出

\documentclass{article}
\usepackage{caption}
\usepackage{etoolbox}
\usepackage{xstring}
\usepackage{hyperref}

\makeatletter
\newcommand\formatlabel[1]{%
    \noexpandarg
    \IfSubStr{#1}{.}{%
      \StrBefore{#1}{.}[\firstcaption]%
      \StrBehind{#1}{.}[\secondcaption]%
      \textbf{\firstcaption.} \secondcaption}{%
      #1}%
      }
%\patchcmd{\@caption}{\ignorespaces #3}{\ignorespaces\formatlabel{#3}}{}{}
%\patchcmd{\@caption}{{#3}}{{\formatlabel{#3}}}{}{}
\patchcmd{\@caption}{#3\fi}{\formatlabel{#3}\fi}{}{}
\makeatother



\begin{document}

\begin{figure}[tb]
    \caption{First sentence that should be bold. Second sentence should not be.}
    \label{fig:figure1}
\end{figure}

\end{document}

在上面的语句中,如果需要的话,两行注释将会对第三个参数的另外两次使用应用补丁。

\@caption您可以通过 在日志文件中显示 的定义\show\@caption

相关内容