我正在尝试使用命令将一些文本设置为全部大写(而不是小写)\uppercase
。部分文本是可变的并存储在单独的命令中,但该部分文本设置为小写。我该如何解决这个问题?
以下是 MWE:
\documentclass[10pt]{article}
\begin{document}
\newcommand{\test}{lower case}
\uppercase{Why is the last part in \test}?
\end{document}
答案1
使用 TeX 基元需要了解它们的用途。在本例中,您尝试使用\uppercase
,但其操作可能与您预期的不同:
- 看到 后
\uppercase
,TeX 会寻找{
(类别代码为 1 的显式或隐式字符标记)扩展标记并忽略空格标记或\relax
; - 一旦
{
被发现,TeX 就会吸收 token无扩展直到找到一个<右括号>(类别代码为 2 的明确字符标记); - 此时 TeX 会将找到的 token 发送到另一个处理器,进行转换字符标记根据数组,转换为大写版本
\uccode
(不改变类别代码);非字符标记不受影响; - 最后,结果标记列表将被发送回主输入流进行处理,就好像它一开始就在那里一样。
第 3 点适用于您\test
:您得到的是
WHY IS THE LAST PART IN \test
当\test
找到时,它会扩展为lower case
。
您可以使用第 1 点中描述的“扩展”功能并执行
\uppercase\expandafter{\expanded{Why is the last part in \test}}
因为扩展\expandafter
会触发\expanded
,反过来会传递\uppercase
令牌列表
Why is the last part in lower case
但你最好不要尝试,除非你的文本完全没有重音和其他几个危险的令牌。输入
\documentclass{article}
\newcommand{\naive}{na\"ive}
\begin{document}
\uppercase\expandafter{\expanded{This is \naive}}
\end{document}
将停止处理
\protect
! Missing } inserted.
<inserted text>
}
l.7 ...case\expandafter{\expanded{This is \naive}}
与此相反的,
\documentclass{article}
\newcommand{\naive}{na\"ive}
\begin{document}
\MakeUppercase{This is \naive}
\end{document}
可以完美运行。
另一个例子说明了为什么\MakeUppercase
要使用:
\documentclass{article}
\usepackage[turkish]{babel}
\begin{document}
\MakeUppercase{Bu türkçe bir cümle}% This is a sentence in Turkish
\end{document}
根据土耳其语正字法,将“i”大写时产生正确的字形:
答案2
答案3
如果您愿意并且能够使用LuaLaTeX
,您可以使用 Lua 的string.upper
函数执行全大写的转换。
% !TEX TS-program = lualatex
\documentclass{article}
\newcommand{\test}{lower case}
\newcommand\LuaUppercase[1]{\directlua{tex.sprint(string.upper("#1"))}}
\usepackage{textgreek}
\begin{document}
\uppercase{Why is the last part in \test}?
\LuaUppercase{Why is the last part in \test}?
\end{document}