我试图将字符串中的第一个字母大写,其他字母小写。示例:输入:eXample String
和输出Example string
。我该怎么做?
答案1
\documentclass{article}
\newcommand\capmystring[1]{\capmystringaux#1\relax}
\def\capmystringaux#1#2\relax{\uppercase{#1}\lowercase{#2}}
\begin{document}
eXample String
\capmystring{eXample String}
\end{document}
在这种情况下,\capmystring
将参数发送到辅助例程,并\relax
在末尾附加一个附加标记。辅助例程读取两个参数,直到\relax
(人们希望并假设参数本身不包含任何\relax
标记)。吸收参数的方式TeX
,参数#1
将是一个标记,而#2
将是所有剩余的标记,直到(但不包括)最初提供的\relax
。此时,它就像应用于\uppercase
存储在中的第一个标记#1
和\lowercase
其余的标记一样简单,所有这些都存储在中#2
。
答案2
该expl3
语言可以使用 Unicode 数据来实现这一点:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand \firstcap { m } { \text_titlecase:n {#1} }
\ExplSyntaxOff
\begin{document}
eXample String
\firstcap{eXample String}
\end{document}
(假设 LaTeX2e 格式足够新;对于较旧的情况,添加\usepackage[utf8]{inputenc}
pdfTeX。)
我们可以扩展这种方法,以允许特定于语言的大小写映射
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand \firstcap { O{} m }
{ \text_titlecase:nn {#1} {#2} }
\ExplSyntaxOff
\begin{document}
\firstcap{IJSSELMEER} % Ijsselmeer
\firstcap[nl]{IJSSELMEER} % IJsselmeer
\end{document}
答案3
另一种解决方案是使用stringstrings
包裹:
\documentclass{article}
\usepackage{stringstrings}
\newcommand{\firstcap}[1]{\caselower[e]{#1}\capitalize{\thestring}}
\begin{document}
eXample String
\firstcap{eXample String}
\end{document}
解释:
\caselower
将整个字符串变为小写,该选项[e]
将结果保存起来\thestring
以便进一步处理,最后按照\capitalize
其说明执行并输出结果。
答案4
这是一个基于 LuaLaTeX 的解决方案,适用于所有 UTF8 编码字符。此方法可以处理 UTF8 编码字符,因为它使用 、和函数代替“标准”Lua 字符串函数string.gsub
、和。这些函数由库提供,由 LuaTeX 自动加载。string.upper
string.lower
unicode.utf8.gsub
unicode.utf8.upper
unicode.utf8.lower
unicode.utf8
% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function first_cap ( s )
s = unicode.utf8.gsub ( s , "(%a)(%a*)", function(x,y)
return ( unicode.utf8.upper(x) .. unicode.utf8.lower(y) )
end )
tex.sprint ( s )
end
\end{luacode}
\newcommand{\firstcap}[1]{\directlua{first_cap(\luastring{#1})}}
\begin{document}
\firstcap{eXample String}
\firstcap{Once upOn A tIMe i saw a BAT.}
\firstcap{ä ö ü é à è ł óÓÓÓ żĄĄĄ }
\end{document}
附录-- 我刚刚意识到我可能误解了 OP 的要求:我假设单词首字母的大写应该适用于每一个字在 的参数中\firstcap
,而不仅仅是第一个单词。要使大写操作仅适用于第一个单词(从而将小写操作应用于 的参数中的所有其他单词\firstcap
),只需将 Lua 函数的第二个参数unicode.utf8.gsub
从更改"(%a)(%a*)"
为"(%a)(.*)"
。