我试图将变量中的预定义字符串转换为小写,并将空格替换为下划线。但不起作用。转换后的新字符串如下所示:
游戏Ω_ofΩ_Ω_rollingΩ_Ω_Ω_dice
期望输出是:
掷骰子游戏
有人可以帮帮我吗?
\documentclass{article}
\usepackage{xstring}
\usepackage{textcase}
\newcommand{\questionsection}{Game of rolling dice}
\newcommand{\questionsectionfiltered}{\StrSubstitute{\questionsection}{ }{\textunderscore}[\SUBtemp]\MakeLowercase{\SUBtemp}}
\begin{document}
\questionsectionfiltered
\end{document}
答案1
令牌循环的完美候选者。根据要求,已编辑以添加小写字母。
\documentclass{article}
\usepackage{tokcycle}
\Characterdirective{\addcytoks[x]{\explowerchar{#1}}}
\Spacedirective{\addcytoks{\textunderscore\allowbreak}}
\def\explowerchar#1{%
\ifcase\numexpr`#1-`A\relax
a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else
#1\fi
}
\newcommand{\questionsection}{Game of rolling dice, plus this should
allow line breaks as well. Let us see if it does}
\newcommand{\questionsectionfiltered}{\expandafter\tokencyclexpress
\questionsection\endtokencyclexpress}
\begin{document}
\questionsectionfiltered
\end{document}
答案2
您可以使用expl3
比它更强大xstring
(和更灵活)的东西。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\filter}{m}
{
\tabraham_filter:n { #1 }
}
\tl_new:N \l__tabraham_filter_text_tl
\cs_new_protected:Nn \tabraham_filter:n
{
% set the tl variable to the lowercased version of the input
\tl_set:Nx \l__tabraham_filter_text_tl { \text_lowercase:n { #1 } }
% replace spaces with underscores
\tl_replace_all:Nnn \l__tabraham_filter_text_tl { ~ } { \_ }
% deliver the result
\tl_use:N \l__tabraham_filter_text_tl
}
\ExplSyntaxOff
\newcommand{\questionsection}{Game of rolling dice}
\begin{document}
\filter{\questionsection}
\filter{Game of rolling dice}
\end{document}
您可能想要定义某些标记列表的过滤版本,以便在使用它时不必重复整个过程。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\filter}{m}
{
\tabraham_filter:nn { #1 } { \tl_use:N }
}
\NewDocumentCommand{\newfilteredcommand}{mm}
{
\tl_if_exist:NF #1
{
You~don't~want~to~silently~redefine~something,~do~you?
}
{
\tl_new:N #1
\tabraham_filter:nn { #2 } { \tl_set_eq:NN #1 }
}
}
\tl_new:N \l__tabraham_filter_text_tl
\cs_new_protected:Nn \tabraham_filter:nn
{
\tl_set:Nx \l__tabraham_filter_text_tl { \text_lowercase:n { #1 } }
\tl_replace_all:Nnn \l__tabraham_filter_text_tl { ~ } { \_ }
#2 \l__tabraham_filter_text_tl
}
\ExplSyntaxOff
\newcommand{\questionsection}{Game of rolling dice}
\newfilteredcommand{\questionsectionfiltered}{\questionsection}
\begin{document}
\filter{\questionsection}
\filter{Game of rolling dice}
\questionsectionfiltered
\texttt{\meaning\questionsectionfiltered}
\end{document}
最后一行表明这\questionsectionfiltered
是预期的结果。
答案3
这是一个基于 LuaLaTeX 的解决方案。它提供了一个名为 的用户宏\LowercaseUnderscore
,该宏将其参数传递给一个名为 的 Lua 函数function lc_underscore
,该函数在 Lua 内置函数string.lower
和的帮助下完成大部分工作string.gsub
。
的参数\LowercaseUnderscore
不必是字符串。它可以是 LaTeX 宏;如果是,则宏在传递给 Lua 函数进行最终处理之前会进行扩展。
% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment and '\luastring' macro
\begin{luacode}
function lc_underscore ( s )
s = string.lower ( s )
s = string.gsub ( s , "%s" , "\\textunderscore" )
return ( s )
end
\end{luacode}
\newcommand\LowercaseUnderscore[1]{%
\directlua{tex.sprint(lc_underscore(\luastring{#1}))}}
\newcommand{\questionsection}{Game of Rolling Dice}
\begin{document}
\LowercaseUnderscore{\questionsection}
\end{document}