我正在尝试制作一个宏,它将接受输入短语、将所有字母大写、并用下划线替换所有换行符:
\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.upper
用unicode.utf8.upper
和string.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}