我正在尝试使用 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 时也应避免这样做。