我所在大学的论文格式要求目录中的章节标题必须全部大写。因此我使用了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
\contentsline
hyperref
\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}