我编写了以下代码来排版论文的标题页:
\documentclass{amsart}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish]{babel}
\begin{document}
\title[Title Title Title]{Title Title Title}
\begin{abstract}
Abstract abstract abstract
\end{abstract}
\maketitle
\end{document}
输出以下内容:
但是,我想将我的标题设为宏,因为我在其他地方也需要它:
\documentclass{amsart}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish]{babel}
\newcommand\mytitle{Title title title}
\begin{document}
\title[\mytitle]{\mytitle}
\begin{abstract}
Abstract abstract abstract
\end{abstract}
\maketitle
\end{document}
但现在输出以下内容:
我无法通过任何方式将大写字母恢复。例如,使用 没有任何区别\def
。这里发生了什么,如何解决?
答案1
不幸的是,amsart
默认情况下使用\uppercase
(一个大麻烦)。幸运的是,修复很简单:加载textcase
。
\documentclass{amsart}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[USenglish]{babel}
\usepackage{textcase}
\newcommand\mytitle{Title title title}
\begin{document}
\title[\mytitle]{\mytitle}
\begin{abstract}
Abstract abstract abstract
\end{abstract}
\maketitle
\end{document}
让我们看看\title
\renewcommand*{\title}[2][]{\gdef\shorttitle{#1}\gdef\@title{#2}}
\edef\title{\@nx\@dblarg
\@xp\@nx\csname\string\title\endcsname}
这是课堂上常用的技巧,用于告诉 LaTeX,如果缺少可选参数,则应提供强制参数。
问题出现在\maketitle
处理时,它会\@settitle
:
\def\@settitle{\begin{center}%
\baselineskip14\p@\relax
\bfseries
\uppercasenonmath\@title
\@title
\end{center}%
}
好的,我们应该看看\uppercasenonmath
:
\newcommand{\uppercasenonmath}[1]{\toks@\@emptytoks
\@xp\@skipmath\@xp\@empty#1$$%
\edef#1{{\@nx\protect\@nx\@upprep\the\toks@}}%
}
这只会扩展\@title
一次,所以最后\uppercase
会应用原语\mytitle
(讲得有点长)。然而,该类还具有
\AtBeginDocument{%
\@ifundefined{MakeTextUppercase}{}{\let\uppercasenonmath\altucnm}%
}
我们发现
\def\altucnm#1{%
\MakeTextUppercase{\toks@{#1}}%
\edef#1{\the\toks@}%
}
这要好得多,因为\MakeTextUppercase
它的参数进行了完全(受保护)扩展,因此您的参数\mytitle
得到了扩展前大写已完成。
答案2
评论太长了
\expandafter\expandafter\expandafter\title\expandafter\expandafter\expandafter[\expandafter\mytitle\expandafter]\expandafter{\mytitle}
但@egreg 的回答也值得一读。:)