titlesec のラベル フィールドの \uppercase にエラーがあります

titlesec のラベル フィールドの \uppercase にエラーがあります

私は titlesec を使用して章をフォーマットし、ラベル「Chapter」が 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

ラテックスが提供するの\MakeUppercase\uppercase、多くのテキスト、非ASCII文字を含むUTF-8を使用している場合はほぼすべてのテキストを破壊するためです。ただし、ここでの具体的なエラーは次のとおりです。

\uppercase\chaptertitlename

中括弧はオプションではなく、必須です

\uppercase{\chaptertitlename}

したがって、中括弧が欠落しているエラーが表示されます。

しかし、上で述べたように、これは単に ASCII 大文字テーブルを使用してそれを UTF-8 バイトに適用するため、アクセント付き文字を使用するテキストの UTF-8 エンコードを破壊し\uppercase、有効な UTF-8 ではないものを生成します。

答え2

これを試して:

\documentclass{article}

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

\begin{document}

\uppercase\test

\end{document}

出力は

ここに画像の説明を入力してください

面白い?ちょっとね。

事実は、\uppercaseTeXプリミティブは必要 {その後にトークンを展開します。このために、その後のトークンを展開します。\relaxトークンまたはスペース トークンは無視され、展開が再開されます。この展開プロセスは、別の展開できないトークンが見つかるとすぐに終了します。それが の場合{、TeX は の実行に進みます\uppercase。それ以外の場合は、エラーが発生し、{そのトークンが挿入されて再読み込みされます。

これは、上記のおかしな出力を説明するものです。 の展開は\testとなり{abc}def、 は{abc}によって処理され\uppercase、「ABCdef」が得られます。

逆に、\MakeUppercaseは引数が 1 つあるマクロです。

引数を囲む中括弧を省略しないでください。LaTeX\uppercaseでも省略しないでください。

関連情報