\newcommand 中的 \uppercase

\newcommand 中的 \uppercase

我尝试\uppercase使用\newcommand

\newcommand\universidad{My University}
\newcommand\Universidad{\uppercase{\universidad}} 

当我使用它时,我得到了这个,

我的大学

而不是像预期的那样,

我的大学

为什么?

编辑

我不能使用,\MakeUppercase因为我需要使用拉丁引文,例如:ingeniería。这个拉丁文案例有问题\MakeUppercase

答案1

使用latin1utf8编码我得到正确的输出

\newcommand{\facultad}{Ingeniería}
\newcommand{\Facultad}{\expandafter\MakeUppercase\expandafter{\facultad}}
\Facultad

您的定义存在问题,即\uppercase作用于标记列表\universidad,但什么也不做,因为在该级别没有要大写的字母;\universidad仅在稍后扩展。\expandafter我们在 执行之前执行扩展\MakeUppercase

作为练习,这里有一个宏\Capitalize,它以控制序列作为参数并定义其“大写变体”

\makeatletter
\newcommand{\Capitalize}[1]{%
  \edef\@tempa{\expandafter\@gobble\string#1}%
  \edef\@tempb{\expandafter\@car\@tempa\@nil}%
  \edef\@tempa{\expandafter\@cdr\@tempa\@nil}%
  \uppercase\expandafter{\expandafter\def\expandafter\@tempb\expandafter{\@tempb}}%
  \@namedef{\@tempb\@tempa}{\expandafter\MakeUppercase\expandafter{#1}}}
\makeatother

执行此魔法代码后你可以说

\newcommand\universidad{Universidad de Lugar}
\newcommand{\facultad}{Ingeniería}

\Capitalize{\universidad}
\Capitalize{\facultad}

也将定义\Universidad\Facultad打印“UNIVERSIDAD DE LUGAR”和“INGENIERÍA”。

请注意,\MakeUppercase不符合超链接,因此如果您使用这些命令,该包会提取一些内容来构建书签,您应该给它一个安全的令牌列表;例如

\newcommand{\Facultad}{%
   \texorpdfstring{\expandafter\MakeUppercase\expandafter{\facultad}}%
      {\facultad}}

并在自动定义命令中,更改行

\@namedef{\@tempb\@tempa}{\expandafter\MakeUppercase\expandafter{#1}}}

进入

\@namedef{\@tempb\@tempa}{%
  \texorpdfstring{\expandafter\MakeUppercase\expandafter{#1}}{#1}}}

如果使用utf8x,则定义前面必须加上\PrerenderUnicode

\PrerenderUnicode{Ingeniería}
\newcommand{\facultad}{Ingeniería}
\newcommand{\Facultad}{\expandafter\MakeUppercase\expandafter{\facultad}}

\Capitalize可能是

\makeatletter
\newcommand{\Capitalize}[1]{%
  \@ifpackagewith{inputenc}{utf8x}{\PrerenderUnicode{#1}}{}%
  \edef\@tempa{\expandafter\@gobble\string#1}%
  \edef\@tempb{\expandafter\@car\@tempa\@nil}%
  \edef\@tempa{\expandafter\@cdr\@tempa\@nil}%
  \uppercase\expandafter{\expandafter\def\expandafter\@tempb\expandafter{\@tempb}}%
  \@namedef{\@tempb\@tempa}{\expandafter\MakeUppercase\expandafter{#1}}}
\makeatother

以便\PrerenderUnicode在需要时自动执行。

答案2

您需要使用\MakeUppercase而不是\uppercase。有关差异的信息,请参阅大小写转换的奇怪现象来自 TeX FAQ。

对于像 这样的连字符í,你可以使用 来转义该字符\'{i},也可以使用

\usepackage[utf8]{inputenc}

在您的文档序言中。这应该可以适应您在输入中使用连字符。

在此处输入图片描述

\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\begin{tabular}{ll}
  \verb!\MakeUppercase{ingeniería}!: & \MakeUppercase{ingeniería} \\
  \verb!\MakeUppercase{ingenier\'{i}a}!: & \MakeUppercase{ingenier\'{i}a}
\end{tabular}
\end{document}​

答案3

就我而言,这篇文章确实很有帮助:

https://texfaq.org/FAQ-casechange

我用:

\usepackage[overload]{textcase}
(...)
\newcommand{\iemph}[1]{\MakeTextUppercase{#1}}
(...)
\begin{document}
XXX \iemph{abc def ghi}

相关内容