![Hyperref 兼容性,可自动加粗浮动标题的第一句 float](https://linux22.com/image/310686/Hyperref%20%E5%85%BC%E5%AE%B9%E6%80%A7%EF%BC%8C%E5%8F%AF%E8%87%AA%E5%8A%A8%E5%8A%A0%E7%B2%97%E6%B5%AE%E5%8A%A8%E6%A0%87%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E5%8F%A5%20float.png)
我可以按照给出的方法自动将浮动标题的第一句话加粗 自动将浮动标题的第一句加粗。但是,当我使用 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
通过“链式”重新定义引入。此外,它还移至\AtBeginDocument
以caption
查看旧定义。
\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
。