titlesec 的标签字段中的 \uppercase 错误

titlesec 的标签字段中的 \uppercase 错误

我正在尝试使用 titlesec 并格式化我的章节,以便标签“章节”以 ALLCAPS 呈现。如果我使用 \MakeUppercase,我会得到所需的结果。

\titleformat
{\chapter} % command
[display] % shape
{\bfseries\Large\itshape} % format
{\sffamily\huge\MakeUppercase\chaptertitlename{ }\thechapter} % label
{0.5ex} % sep
{
    \rule{\textwidth}{1pt}
    \vspace{1ex}
    \centering
} % before-code
[
\vspace{-0.5ex}%
\rule{\textwidth}{0.3pt}
] % after-code

但是如果我使用 \uppercase,就会出现Missing { inserted. \chapter{The First Chapter}错误。

\titleformat
{\chapter} % command
[display] % shape
{\bfseries\Large\itshape} % format
{\sffamily\huge\uppercase\chaptertitlename{ }\thechapter} % label
{0.5ex} % sep
{
    \rule{\textwidth}{1pt}
    \vspace{1ex}
    \centering
} % before-code
[
\vspace{-0.5ex}%
\rule{\textwidth}{0.3pt}
] % after-code

我正在使用 pdfTeX 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX)。如果我使用 MikTeX 2.9.7100 x64,我会收到同样的错误。这是在 Windows 7 上。

我搞清楚了为什么不能使用 \uppercase。我问这个问题是为了避免其他人遇到这个问题,这样他们就不用花很多时间调试了。

谢谢你!

我的整个文档是

\documentclass[a4paper,12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{titlesec}

\titleformat
{\chapter} % command
[display] % shape
{\bfseries\Large\itshape} % format
{\sffamily\huge\uppercase\chaptertitlename{ }\thechapter} % label
{0.5ex} % sep
{
    \rule{\textwidth}{1pt}
    \vspace{1ex}
    \centering
} % before-code
[
\vspace{-0.5ex}%
\rule{\textwidth}{0.3pt}
] % after-code

\begin{document}

\author{TeXstudio Team}
\title{Simple Book Example}
\date{January 2013}

\frontmatter
\maketitle
\tableofcontents

\mainmatter

\chapter{The First Chapter}

And now for something completely new

\chapter{The Second Chapter}

\backmatter
% bibliography, glossary and index would go here.

\end{document}

答案1

latex 提供的\MakeUppercase 原因\uppercase是,如果您使用 UTF-8 编码且非 ascii 字母,则会破坏大量文本(几乎所有文本)。但是这里的具体错误是

\uppercase\chaptertitlename

括号不是可选的,必须有

\uppercase{\chaptertitlename}

因此您显示了缺少括号的错误。

但如上所述,这会破坏使用重音字母的任何文本的 UTF-8 编码,因为\uppercase只是使用 ascii 大写表并将其应用于 UTF-8 字节,这将产生一些无效的 UTF-8 内容。

答案2

尝试这个:

\documentclass{article}

\newcommand{\test}{{abc}def}

\begin{document}

\uppercase\test

\end{document}

输出为

在此处输入图片描述

有趣吗?有点。

事实上,这\uppercase是一个 TeX 原语,需要 {在其后。为此,它会扩展其后的标记;任何\relax标记或空格标记都将被忽略并恢复扩展。一旦发现另一个不可扩展的标记,此扩展过程就会结束:如果是{,TeX 将继续执行\uppercase;否则,它会引发错误,插入{并重新读取该标记。

这应该可以解释上面有趣的输出:的扩展结果\test{abc}def,因此{abc}经过处理\uppercase得到“ABCdef”。

相反,\MakeUppercase是一个带有一个参数的宏。

避免省略参数周围的括号。\uppercase使用 LaTeX 时也应避免这样做。

相关内容