我有一份文档,其标题使用硬换行符分布在多行中。为了配置标题格式,我使用该titling
软件包及其文档改编的代码:
\documentclass{article}
\usepackage{titling}
\pretitle{\begin{center}\LARGE\sffamily\bfseries}
\posttitle{\par\end{center}\vskip 0.5em}
\title{Higgelty Pigglety Pop! \\ or \\ There Must Be More to Life}
\begin{document}
\maketitle
\end{document}
…并且它运行完美。
我现在还想将标题全部大写,因此更改命令\pretitle
:
\pretitle{\begin{center}\LARGE\sffamily\bfseries\MakeUppercase}
...我收到以下错误消息:
! Use of \@icentercr doesn't match its definition.
<argument> \def
l.12 \maketitle
这种情况仅发生在标题包含硬换行符的情况下。
此错误消息是什么意思?我该如何修复它?
答案1
将标题拆分\\
并应用于\MakeUppercase
每个块:
\documentclass{article}
\usepackage{titling}
\pretitle{\begin{center}\LARGE\sffamily\bfseries}
\posttitle{\par\end{center}\vskip 0.5em}
\makeatletter
\renewcommand{\title}[1]{\gdef\@title{\DoUppercase{#1}}}
\DeclareRobustCommand\DoUppercase[1]{\Do@Uppercase#1\\\@nil}
\def\Do@Uppercase#1\\#2\@nil{%
\MakeUppercase{#1}%
\ifx\\#2\\%
\expandafter\@gobble
\else
\\\expandafter\@firstofone
\fi
{\Do@Uppercase#2\@nil}%
}
\makeatother
\title{Higgelty Pigglety Pop! \\ or \\ There Must Be More to Life}
\begin{document}
\maketitle
\end{document}
这是通过重新定义\title
存储而不是仅仅标题来\DoUppercase{<title>}
获得的。\@title
但是,您不能使用垂直间距可选参数\\
。
如果您也想支持\\[3pt]
或其他什么,那么这是可能的l3regex
。
\documentclass{article}
\usepackage{xparse,l3regex}
\usepackage{titling}
\pretitle{\begin{center}\LARGE\sffamily\bfseries}
\posttitle{\par\end{center}\vskip 0.5em}
\makeatletter
\renewcommand{\title}[1]{\gdef\@title{\DoUppercase{#1}}}
\makeatother
\ExplSyntaxOn
\NewDocumentCommand{\DoUppercase}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_set:Nn \l_tmpb_tl { \\ }
% Add \MakeUppercase{ at the beginning and } at end
\regex_replace_once:nnN
{ (.*) }
{ \c{MakeUppercase}\cB\{\1\cE\}} \l_tmpa_tl
% change \\[...] into }\\[...]\MakeUppercase{
\regex_replace_all:nnN
{ \u{l_tmpb_tl}\[(.*?)\] }
{ \cE\}\u{l_tmpb_tl}\[\1\]\c{MakeUppercase}\cB\{ }
\l_tmpa_tl
% change \\ into }\\\MakeUppercase{
\regex_replace_all:nnN
{ \u{l_tmpb_tl}([^\[]) }
{ \cE\}\u{l_tmpb_tl}\c{MakeUppercase}\cB\{\1 }
\l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\title{Higgelty Pigglety Pop! \\[3pt] or \\ There Must Be More to Life}
\begin{document}
\maketitle
\end{document}
答案2
答案3
这是使用 的解决方案stringstrings
。它不能直接使用 的原因\MakeUppercase
是标题的参数包含宏\\
。我假设 \MakeUppercase
宏仅在没有宏的正则表达式中起作用。一般来说,该stringstrings
包具有相同的限制,但它确实为有限的例外情况提供了规定。
逻辑的作用是指示stringstrings
将每个预编码\\
为 ASCII 编码序列。然后可以\caseupper
使用其编码模式对该序列进行操作[e]
(不会打印出即时结果,而是将其存储在扩展的宏中\thestring
)。\retokenize
需要宏来处理\thestring
,将每个 ASCII 编码重新转换\\
为 LaTeX 宏\\
。
在回答这个问题的过程中,发现stringstrings
软件包中有一个错误,需要进行以下修补。
\usepackage{xpatch}
% BUG FIX
\makeatletter
\xpatchcmd{\@retokenizechar}{{~}}{{\ }}
\makeatother
然而...
更新:该stringstrings
软件包已于 2015 年 2 月 2 日升级至 V1.23,以解决此错误。这是修订后的 MWE,无需补丁。
\documentclass{article}
\usepackage{titling,stringstrings}
\pretitle{\begin{center}\LARGE\sffamily\bfseries%
\encodetoken{\\}\caseupper[e]%
}
\posttitle{\retokenize{\thestring}%
\thestring\par\end{center}\vskip 0.5em}
\title{Higgelty Pigglety Pop!\\or\\There Must Be More to Life}
%Now Works for string without \\
%\title{Higgelty Pigglety Pop! or There Must Be More to Life}
\begin{document}
\maketitle
\clearpage
\end{document}
答案4
一个简单的解决方案是加载 David Carlisle文本大小写带有选项的包overload
。然后你只需将\\
-macro 放入 中\NoCaseChange{}
,即
\usepackage[overload]{textcase}
...
...
\title{Higglety, Pigglety Pop!\NoCaseChange{\\}or\NoCaseChange{\\}
There must be more to life}