Ошибка с \uppercase в поле метки titlesec

Ошибка с \uppercase в поле метки titlesec

Я пытаюсь использовать titlesec и форматировать свои главы так, чтобы метка 'Chapter' отображалась ВСЕМИ ЗАГЛАВНЫМИ БУКВАМИ. Если я использую \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.

Связанный контент