将所有字母大写并将换行符改为下划线

将所有字母大写并将换行符改为下划线

我正在尝试制作一个宏,它将接受输入短语、将所有字母大写、并用下划线替换所有换行符:

\ctest{one word} => ONE_WORD

我一直在尝试使用该stringstrings包来实现这一点:

\newcommand{\ctest}[1]{%
\solelyuppercase[e]{#1}%
\getargs{\thestring}%
{\fontfamily{pcr}\selectfont \argi\underline{{ }}\argii}}

我对结果很满意,但我需要宏能够灵活地接受包含一个、两个、三个或四个单词的短语。我可以使用\narg来获取字数,但我不知道如何灵活地调用\argi\argii、 ...。

任何帮助将不胜感激!

答案1

使用expl3,并支持重音字符:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc} % just for testing strange chars

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\ctest}{m}
 {
  % set the token list to the upper case version of the inptu
  \tl_set:Nx \l_tmpa_tl { \text_uppercase:n { #1 } }
  % replace spaces with underscores
  \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \c_underscore_str }
  % produce the text
  \texttt{\tl_use:N \l_tmpa_tl}
 }

\ExplSyntaxOff

\begin{document}

\ctest{one word}

\ctest{élite über Straße l'Hôpital}

\end{document}

在此处输入图片描述

答案2

这是一个基于 LuaLaTeX 的解决方案。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode} % for 'luacode' env. and '\luastring' macro
%% Lua-side code
\begin{luacode}
function ctest ( s )
   tex.sprint (string.upper ( string.gsub ( s , "%s" , "\\_" ) ) )
end
\end{luacode}
%% LaTeX-side code
\newcommand\ctest[1]{\directlua{ctest(\luastring{#1})}}

\begin{document}
\ctest{one word}

\ctest{several no longer separate words}
\end{document}

附录:如果的参数\ctest可能包含unicode编码的字符,只需切换行

   tex.sprint ( string.upper ( string.gsub ( "%s" , "\\_" ) ) )

在 Lua 函数中

   tex.sprint ( unicode.utf8.upper ( unicode.utf8.gsub ( s , "%s","\\_" ) ) )

即,string.upperunicode.utf8.upperstring.gsub替换unicode.utf8.gsub

答案3

也许这个? T1编码(或者更确切地说,不是OT1)在这里是必不可少的。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{stringstrings}
\newcommand\ctest[1]{%
  \convertchar[e]{#1}{ }{\_}%
  \caseupper[v]{\thestring}
}
\begin{document}
\ctest{one word} $a_b$
\ctest{one two three words}
\end{document}

在此处输入图片描述

它也有\thestring


这可能是更好的方法,使用listofitems包:

\documentclass{article}
\usepackage{listofitems}
\newcommand\ctest[1]{%
  \setsepchar{ }%
  \readlist\mylist{#1}%
  \foreachitem\i\in\mylist{\ifnum\icnt=1\else\textunderscore\fi%
  \expandafter\uppercase\expandafter{\i}}%
}
\begin{document}
\ctest{one word}
\ctest{one two three words}
\end{document}

相关内容