在 \@startsection 中使用 \MakeUppercase

在 \@startsection 中使用 \MakeUppercase

我正在尝试使用命令\@startsection来更改章节/节标题的布局。更具体地说,我希望将标题转换为大写。

我遵循了 LaTeX 概要中的一个示例:

\documentclass{scrbook}
\makeatletter
\renewcommand\chapter{\@startsection
{chapter}{0}{0mm}
{-\baselineskip}
{0.5\baselineskip}
{\MakeUppercase}}
\makeatother
\usepackage{lipsum}
\begin{document}
\chapter{SomeChapter}
\lipsum[1]
\end{document}

这向我抛出了一条错误消息\chapter{SomeChapter}

Argument of \@gobble has an extra }.

经过反复试验后,我发现使用\uppercase代替 可以\MakeUppercase正常工作 - 但对于变音符号则不行。

我做错了什么?不应该\MakeUppercase正常工作(并且正确处理变音符号)?

答案1

您的重新定义适用于该类book。但scrbook实际上不适用,不过我还是想用不同的方法来实现。

  • 我会继续支持 KOMA-Script 的一些功能,例如和\sectfont。它们最初用于,与 类似,不使用它们可能会破坏 KOMA-Script 命令的预期行为。\raggedsection\size@chapter\chapter\section

  • 您可以附加\MakeUppercase\size@chapter。您可以用不同的方式执行此操作。请注意,您必须在涉及名称中包含命令的定义周围使用\makeatletter...。\makeatother@

    • 如果您知道标题大小,则快速简便的方法如下\Huge

      \renewcommand*{\size@chapter}{\Huge\MakeUppercase}
      
    • 安全的方式是,您不需要知道标题大小,只需存储并使用它:

      \let\origsize\size@chapter
      \renewcommand*{\size@chapter}{\origsize\MakeUppercase}
      
    • 一种用于改变宏扩展顺序的方法\expandafter,因此您不需要额外的宏来备份原始大小命令,只需一行:

      \expandafter\def\expandafter\size@chapter\expandafter{\size@chapter\MakeUppercase}
      
    • 最短的方法是将\g@addto@macro代码附加到另一个命令:

      \g@addto@macro\size@chapter\MakeUppercase
      
  • 我不会使用完全大写的标题。相反,我建议考虑使用小写字母,这很容易做到

    \addtokomafont{chapter}{\scshape}
    

并非所有字体都提供带有粗体无衬线字体的小写字母,这在 KOMA-Script 类中很常见。kpfonts确实如此,所以\usepackage{kpfonts}会显示此命令有效,或者

\setkomafont{chapter}{\normalfont\huge\rmfamily\scshape}

答案2

您还可以考虑使用可扩展版本。这在任何参数中都非常安全。我希望有一天 \MakeUppercase它能用上。请参阅我之前的问题:expl3\MakeUppercase 是否有纯粹可扩展的变体?

例如,使用 Joseph Wright 的解决方案:

\documentclass{scrbook}

\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \tl_to_upper_case:n #1 {
  \exp_args:Nf \tl_to_upper_case_aux:n {#1}
}
\cs_new:Npn \tl_to_upper_case_aux:n #1 {
  \tl_to_upper_case_aux:w #1 ~ \q_no_value \q_stop
}
\cs_new:Npn \tl_to_upper_case_aux:w #1 ~ #2 \q_stop {
  \quark_if_no_value:nTF {#2}
    { 
      \tl_map_function:nN {#1} \tl_to_upper_case_aux:N 
      \tl_to_case_end:n { }
    }
    { \tl_to_upper_case_aux:w #1 { ~ } #2 \q_stop }
}
\cs_new:Npn \tl_to_upper_case_aux:N #1 {
  \prg_case_str:nnn {#1}
    {
      { a } { \tl_to_case_aux:nw { A } }
      { b } { \tl_to_case_aux:nw { B } }
      { c } { \tl_to_case_aux:nw { C } }
      { d } { \tl_to_case_aux:nw { D } }
      { e } { \tl_to_case_aux:nw { E } }
      { f } { \tl_to_case_aux:nw { F } }
      { g } { \tl_to_case_aux:nw { G } }
      { h } { \tl_to_case_aux:nw { H } }
      { i } { \tl_to_case_aux:nw { I } }
      { j } { \tl_to_case_aux:nw { J } }
      { k } { \tl_to_case_aux:nw { K } }
      { l } { \tl_to_case_aux:nw { L } }
      { m } { \tl_to_case_aux:nw { M } }
      { n } { \tl_to_case_aux:nw { N } }
      { o } { \tl_to_case_aux:nw { O } }
      { p } { \tl_to_case_aux:nw { P } }
      { q } { \tl_to_case_aux:nw { Q } }
      { r } { \tl_to_case_aux:nw { R } }
      { s } { \tl_to_case_aux:nw { S } }
      { t } { \tl_to_case_aux:nw { T } }
      { u } { \tl_to_case_aux:nw { U } }
      { v } { \tl_to_case_aux:nw { V } }
      { w } { \tl_to_case_aux:nw { W } }
      { x } { \tl_to_case_aux:nw { X } }
      { y } { \tl_to_case_aux:nw { Y } }
      { z } { \tl_to_case_aux:nw { Z } }
    }
    { \tl_to_case_aux:nw {#1 } }
}
\cs_new:Npn \tl_to_case_aux:nw #1#2 \tl_to_case_end:n #3 {
    #2 \tl_to_case_end:n { #3 #1 }
}
\char_make_math_shift:N \Q
\cs_new:Npn \tl_to_case_end:n #1 {
  \tl_to_case_strip_i:w #1 Q ~ Q
}
\cs_new:Npn \tl_to_case_strip_i:w #1 ~ Q {
  \tl_to_case_strip_ii:w #1 Q
}
\cs_new:Npn \tl_to_case_strip_ii:w #1 Q #2 {#1}
\char_make_letter:N \Q
\cs_set_eq:NN \MakeExpandableUppercase \tl_to_upper_case:n
\ExplSyntaxOff


\makeatletter
\renewcommand\chapter{\@startsection
{chapter}{0}{0mm}
{-\baselineskip}
{0.5\baselineskip}
{\MakeExpandableUppercase}}
\makeatother
\usepackage{lipsum}
\begin{document}
\chapter{SomeChapter}
\lipsum[1]
\end{document}

答案3

要使用 KOMA 类格式化标题,您可以使用命令setkomafontaddkomafont

欲了解更多详情,请查看优秀的文档

这是 Heiko Oberdieck 创建的解决方案

\documentclass{scrartcl}
\usepackage{makerobust}
\makeatletter
\MakeRobustCommand\@hangfrom
\newcommand*{\SectionMakeUppercase}{%
\MakeRobustCommand\@svsec
\MakeUppercase
}
\makeatother
\setkomafont{section}{\SectionMakeUppercase}
\begin{document}
\section{Hello World}
\end{document}

相关内容