首字母大写,其他字母小写

首字母大写,其他字母小写

我试图将字符串中的第一个字母大写,其他字母小写。示例:输入: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.upperstring.lowerunicode.utf8.gsubunicode.utf8.upperunicode.utf8.lowerunicode.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)(.*)"

相关内容