LaTeX 包“titling”,带有硬换行符的标题,以及 \MakeUpperCase

LaTeX 包“titling”,带有硬换行符的标题,以及 \MakeUpperCase

我有一份文档,其标题使用硬换行符分布在多行中。为了配置标题格式,我使用该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

出现此问题的原因是\\在环境中被重新定义center为某些东西脆弱的\MakeUppercase不喜欢(另见这个答案)。要使此标题发挥作用,最简单的方法\protect\\

\title{Higgelty Pigglety Pop! \protect\\ or \protect\\ There Must Be More to Life}

答案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}

相关内容