如何将已分配给 \let(或 \def)的字母大写(使用 \uppercase)?

如何将已分配给 \let(或 \def)的字母大写(使用 \uppercase)?

我似乎无法将分配给 的字母大写\let

\let\zTest=t
\uppercase{\zTest} % still small

附录:我\def\zTest{t}刚刚尝试过,但它也没有用(但是\uppercase{t}有效)。

答案1

\uppercase\lowercase

  • 仅适用于显式字符标记
  • 不触发扩展找到后
    • {的左括号⟨balanced text⟩需要大写/小写。
    • 或单个不带括号嵌套的不可扩展非⟨filler⟩标记,需要大写/小写。(⟨filler⟩表示一系列\relax和/或显式/隐式空格。)

当使用\csname..\endcsname而不是直接使用控制字标记时,您可能可以执行以下操作:

\let\zTest=t
\let\ZTEST=T
\let\ztest=t
\def\Ztest{t}

% \zTest and \ZTEST and \ztest are implicit character tokens.
% Let`s use uppercased/lowercased \csname..\endcsname for selecting 
% which implicit character token to use:

\csname zTest\endcsname

\uppercase{\csname zTest\endcsname}%

\lowercase{\csname zTest\endcsname}%

% \Ztest is a macro, expanding to explicit character token "t".
% You can use \expandafter for triggering "toplevel-expansion"
% while \uppercase/\lowercase still searches the "{" that
% marks the begin of the balanced text:

\Ztest

\uppercase\expandafter{\Ztest}%

\lowercase\expandafter{\Ztest}%

% With more recent TeX-engines, where \expanded is available,
% you can do:
%   \lowercase\expandafter{\expanded{\Ztest}}%
% "toplevel-expansion" of \expanded<general text> will deliver
% "total expansion" of the content of the <general text>'s 
% <balanced text> 

\bye

答案2

以下是一个宏,如果 let 标记被赋值为字母,则该宏能够将其大写(例如,\let\foo=t假设标准类别代码)。它首先检查魔法标记是否the letter是传入标记含义的开头,然后抓取其后的字母并将其大写,如果含义似乎不是字母,则输出输入。测试仅适用于输入的第一个标记,但不检查输入是否只是一个标记(因此会看到\uppercaselettoken{t more stuff}t是一个字母,但也传递more stuff\uppercase)。所以这只是一个概念证明,而不是一个稳定的实现。

\documentclass[]{article}

\let\foo=t

\makeatletter
\def\uppercaselettoken@ifletter#1%
  {%
    \def\uppercaselettoken@ifletter##1#1##2\end
      {%
        \if\relax\detokenize{##2}\relax
          \expandafter\@secondoftwo
        \else
          \if\relax\detokenize{##1}\relax
            \expandafter\@firstoftwo
          \else
            \expandafter\@secondoftwo
          \fi
          {\expandafter\@firstoftwo}
          {\expandafter\@secondoftwo}%
        \fi
      }%
    \def\uppercaselettoken@letter#1##1\end{\uppercase{##1}}%
  }
\expandafter\uppercaselettoken@ifletter\expandafter{\detokenize{the letter }}
\long\edef\uppercaselettoken@#1#2%
  {%
    \noexpand\uppercaselettoken@ifletter#1\detokenize{the letter }\noexpand\end
      {%
        \noexpand\uppercaselettoken@letter#1\noexpand\end
      }%
      {#2}% not a letter, no uppercasing
  }

\newcommand\uppercaselettoken[1]
  {%
    \expandafter\uppercaselettoken@\expandafter{\meaning#1}{#1}%
  }
\makeatother

\usepackage{unravel}

\begin{document}
\uppercaselettoken{\foo}
\uppercaselettoken{t}% works too
\end{document}

答案3

在此处输入图片描述

虽然可以实现一些功能来查询不可扩展标记的含义,识别定义的隐式字符\let并查找它们的大写形式,但很少有理由陷入这种情况,使用\def(或\renewcommand)是​​记录的 LaTeX 接口并且本质上很容易工作,因为你只需要在大写之前扩展宏,并且它使用 LaTeX 开箱即用:

\documentclass{article}

\begin{document}

\let\zza=a
\let\zzb=b
\let\zzc=c

1 \MakeUppercase{\zza\zzb\zzc}


\renewcommand\zza{a}
\renewcommand\zzb{b}
\renewcommand\zzc{c}

2 \MakeUppercase{\zza\zzb\zzc}


\end{document}

相关内容