如何在 LaTeX3 中编写完全可扩展的字符串切片

如何在 LaTeX3 中编写完全可扩展的字符串切片

我正在尝试创建一个 LaTeX3 函数,在第一个字符处对字符串进行切分-

到目前为止

\cs_new:Nn \__slice_at_char:NN {
    \int_set:Nn \l__slice_pos_int {1}
    \str_map_inline:Nn #1 {
        \int_incr:N \l__slice_pos_int
        \str_if_eq:VnTF {#2} {##1} {
            \str_map_break:
        }{}
    }
    \str_range:Nnn \c_sys_jobname_str {\l__slice_pos_int}{\c_max_int}
}

但是,如果我跑

\str_new:N \_a
\str_new:N \_b
\str_new:N \_result

\str_set:Nn \_a {fun-times}
\str_set:Nn \_b {-}
\str_set:Nx \_result {\__slice_at_char:NN \_a \_b}

\_result不包含times我希望的内容,而是包含未扩展的版本\__slice_at_char:NN。另一种方法是创建一个,\__slice_at_char:NNN其最后一个参数是用于存储结果的字符串变量的名称,但我希望有一个可以直接扩展为结果的函数。这可能吗?

答案1

在此处输入图片描述

声明一个基:n函数,e以及V其变体

\documentclass{article}

\begin{document}

\ExplSyntaxOn
\cs_new:Npn \qq_gobble_to_hyphen:w #1- {}
\cs_new:Npn \qq_split:n#1{\qq_gobble_to_hyphen:w #1}
\cs_generate_variant:Nn \qq_split:n{ e,V }

\str_const:Nn\l_qq_str_a{fun-times}



1: \qq_split:n {fun-times}

\par

2: \qq_split:e {fun-times}

\par

3: \qq_split:e {\l_qq_str_a}

\par

4: \qq_split:V \l_qq_str_a

\par

\ExplSyntaxOff

\end{document}

答案2

为了多样化,这里有一个基于 LuaLaTeX 的解决方案。用户宏称为\FindDash,它接受两个参数。第一个可选参数是“切片字符”(默认值:-)。第二个参数是搜索字符串,它可能包含也可能不包含“切片字符”。

该宏\FindDash是完全可扩展的。

在以下屏幕截图中,..表示切片字符出现在搜索字符串的最末尾,或者在搜索字符串中未找到该字符。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\directlua{
   function find_dash ( s , c ) 
      nn = s:find ( c ) % check if 'c' is present in 's'
      if nn then tex.sprint ( s:sub ( nn+1 ) ) end
   end
}
\newcommand\FindDash[2][-]{\directlua{ find_dash( '#2' , '#1' ) }}

\newcommand\funtimes{fun-times}
\newcommand\ttt{t}

\begin{document}
.\FindDash{fun-times}. 
.\FindDash{funtimes-}. 
.\FindDash{funtimes}. 
.\FindDash[u]{\funtimes}. 
.\FindDash[\ttt]{\funtimes}.
\end{document}

答案3

定义一个执行丢弃操作的辅助宏。

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\slice}{m}
 {
  \siefken_slice:e { #1 }
 }

\cs_new:Nn \siefken_slice:n
 {
  \__siefken_slice_test:w {#1} #1 - \q_nil
 }
\cs_generate_variant:Nn \siefken_slice:n { e }

\cs_new:Npn \__siefken_slice_test:w  #1 #2 - #3 \q_nil
 {
  \tl_if_empty:nF { #3 } { \__siefken_slice_remove:w #1 \q_nil  }
 }
\cs_new:Npn \__siefken_slice_remove:w #1 - #2 \q_nil { #2 }

\ExplSyntaxOff

\begin{document}

\jobname

X\slice{\jobname}X

\end{document}

在此处输入图片描述

如果\jobnameslice.tex,则没有连字符,我们什么也得不到。如果我运行

pdflatex -jobname A-slice-test slice

我明白了

在此处输入图片描述

相关内容