如何在 \patchcmd 中使用 \MakeUppercase 而不破坏超链接?

如何在 \patchcmd 中使用 \MakeUppercase 而不破坏超链接?

我所在大学的论文格式要求目录中的章节标题必须全部大写。因此我使用了etoolbox\patchcmd宏来确保这一点。

\makeatletter
\patchcmd{\l@chapter}{#1}{\MakeUppercase{#1}}{}{}
\makeatother

但是,这样做意味着章节标题不再具有超链接功能。如果我删除\MakeUppercase,超链接仍可工作,但章节标题(可以预见)不再是大写。有没有办法可以自动将目录的章节标题转换为大写,但超链接仍可工作?我见过类似的问题,但我似乎无法弄清楚如何将答案应用于我的情况。

(请注意,我是对章节执行此操作,但如果使用正确的命令,则相同的行为也会发生在章节、小节等中,因此这不是特定于书籍类别或章节命令的行为。但格式要求并不扩展到这些,只扩展到章节。)

另外,我希望书签中的标题采用标题大小写,即使目录中的标题采用大写(如果可能的话)。因此使用\chapter[BLAH]{Blah}并不理想,因为这会影响目录和书签。

梅威瑟:

\documentclass{book}
\usepackage{etoolbox}
\usepackage{hyperref}

\makeatletter
\patchcmd{\l@chapter}{#1}{\MakeUppercase{#1}}{}{} % uppercase but no hyperlink
%\patchcmd{\l@chapter}{#1}{#1}{}{} % hyperlink but no uppercase

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

答案1

你真的不能这样修补,因为#1代表类似

\numberline{1}blah

即使使用可扩展版本的,LaTeX 也会彻底混乱\MakeUppercase

您可以改为\@chapter在出现问题的三个地方进行修补\addcontentsline

\documentclass{book}
\usepackage{etoolbox}
\usepackage{hyperref}

% an expandable version of \MakeUppercase
\ExplSyntaxOn
\cs_set_eq:NN \MakeUppercaseX \text_uppercase:n
\ExplSyntaxOff

% patch \@chapter, in the hyperref version
\makeatletter
\patchcmd{\Hy@org@chapter}
  {{\thechapter}#1}
  {{\thechapter}\MakeUppercaseX{#1}}
  {}{}
\patchcmd{\Hy@org@chapter}
  {\addcontentsline{toc}{chapter}{#1}}
  {\addcontentsline{toc}{chapter}{\MakeUppercaseX{#1}}}
  {}{} % uppercase but no hyperlink
\patchcmd{\Hy@org@chapter}
  {\addcontentsline{toc}{chapter}{#1}}
  {\addcontentsline{toc}{chapter}{\MakeUppercaseX{#1}}}
  {}{}
\makeatother

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

在此处输入图片描述

如果您不想将书签也大写(但我不知道为什么),那么可以使用稍微不同的方法:

\documentclass{book}
\usepackage{etoolbox}
\usepackage{hyperref}


% patch \@chapter, in the hyperref version
\makeatletter
\patchcmd{\Hy@org@chapter}
  {{\thechapter}#1}
  {{\thechapter}\MakeUppercase{#1}}
  {}{}
\patchcmd{\Hy@org@chapter}
  {\addcontentsline{toc}{chapter}{#1}}
  {\addcontentsline{toc}{chapter}{\MakeUppercase{#1}}}
  {}{} % uppercase but no hyperlink
\patchcmd{\Hy@org@chapter}
  {\addcontentsline{toc}{chapter}{#1}}
  {\addcontentsline{toc}{chapter}{\MakeUppercase{#1}}}
  {}{}

\pdfstringdefDisableCommands{\let\MakeUppercase\@firstofone}
\makeatother

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

\MakeUppercase在制作书签时将起到中和作用。

答案2

在研究了 egreg 的方法并研究了 的细节之后hyperref,我发现了一个解决方案,它只会影响目录中章节标题的外观,而不会影响书签文本。它使用他的宏\MakeUppercaseX来修改 的宏,如果该行是针对章节的,则将标题转换为大写,但不针对其他级别。由于在创建书签后添加目录行,因此它不会影响书签文本。hyperref\contentslinehyperref

\documentclass{book}
\usepackage{etoolbox}
\usepackage{hyperref}

% egreg's expandable \MakeUppercase
\ExplSyntaxOn
\cs_set_eq:NN \MakeUppercaseX \text_uppercase:n
\ExplSyntaxOff

\makeatletter
\patchcmd{\contentsline}
    {\hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend}
    {\in@{chapter}{#1}%
     \ifin@%
         \hyper@linkstart{link}{\Hy@tocdestname{\MakeUppercaseX{#2}}\hyper@linkend%
     \else%
         \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend%
     \fi}
    {}{}
\makeatother

\begin{document}
\tableofcontents
\chapter{blah}
\end{document}

相关内容