我似乎无法将分配给 的字母大写\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}