我正在尝试将章节标题排版为大写,例如这个答案。我不想在命令中执行此操作\chapter{}
,因为我使用 hyperref 包来引用整个文档中的标题,并且不希望它们在这些情况下大写。出于某种原因,上述答案不适用于多语种和 RTL 语言。我已在此处编辑 MWE 以显示这一点(注意:我将其从章节更改为章节和报告类):
\documentclass{report}
\usepackage{textcase}
\usepackage{tocloft}
\usepackage{hyperref}
\usepackage{polyglossia}
\setotherlanguage{hebrew}
\makeatletter
\let\oldcontentsline\contentsline
\def\contentsline#1#2{%
\expandafter\ifx\csname l@#1\endcsname\l@chapter
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{%
\oldcontentsline{#1}{\MakeTextUppercase{#2}}%
}{%
\oldcontentsline{#1}{#2}%
}%
}
\makeatother
\begin{document}
\tableofcontents
\chapter{A test section $a=b$}\label{sec:test}
\chapter{Another test section with a reference:~\ref{sec:test}}
\section{Third}
\end{document}
如果你注释掉它,\setotherlanguage{hebrew}
它就可以正常工作。所以它不仅仅是多语种,而且是 RTL 语言(我尝试了希伯来语和叙利亚语)。
我并不局限于上述解决方案,因此如果有人知道使用 RTL 语言实现此目的的其他方法,我愿意洗耳恭听。
答案1
将重新定义延迟至 \begin{document}。
我不知道并且没有测试过希伯来语和 \MakeTextUppercase 是否一致,如果您有希伯来语章节标题,则必须自己检查:
\documentclass{report}
\usepackage{textcase}
\usepackage{tocloft}
\usepackage{hyperref}
\usepackage{polyglossia}
\setotherlanguage{hebrew}
\makeatletter
\AtBeginDocument{%
\let\oldcontentsline\contentsline
\def\contentsline#1#2{%
\expandafter\ifx\csname l@#1\endcsname\l@chapter
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{%
\oldcontentsline{#1}{\MakeTextUppercase{#2}}%
}{%
\oldcontentsline{#1}{#2}%
}%
}}
\makeatother
\begin{document}
\tableofcontents
\chapter{A test section $a=b$}\label{sec:test}
\chapter{Another test section with a reference:~\ref{sec:test}}
\section{Third}
\end{document}