将字符串转换为小写并将空格替换为下划线

将字符串转换为小写并将空格替换为下划线

我试图将变量中的预定义字符串转换为小写,并将空格替换为下划线。但不起作用。转换后的新字符串如下所示:

游戏Ω_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}

相关内容