如何修复标题命令中的宏的大写问题?

如何修复标题命令中的宏的大写问题?

我编写了以下代码来排版论文的标题页:

\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 的回答也值得一读。:)

相关内容