我正在尝试创建一个 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}
如果\jobname
是slice.tex
,则没有连字符,我们什么也得不到。如果我运行
pdflatex -jobname A-slice-test slice
我明白了