我正在尝试使用命令\@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 类格式化标题,您可以使用命令setkomafont
或addkomafont
。
欲了解更多详情,请查看优秀的文档。
\documentclass{scrartcl}
\usepackage{makerobust}
\makeatletter
\MakeRobustCommand\@hangfrom
\newcommand*{\SectionMakeUppercase}{%
\MakeRobustCommand\@svsec
\MakeUppercase
}
\makeatother
\setkomafont{section}{\SectionMakeUppercase}
\begin{document}
\section{Hello World}
\end{document}