\documentclass{article}
\usepackage{xstring}
\begin{document}
\StrBehind[2]{/foo/bar}{/}
\StrCount{/foo/bar}{/}
\StrBehind[\StrCount{/foo/bar}{/}]{/foo/bar}{/}
\end{document}
我正在尝试使用 删除。/foo/
上述文档中的第一行确实产生了,第二行确实产生了,但第三行不起作用。我该如何让它工作,或者有没有更简单的方法来做我想做的事情?/foo/bar
xstring
bar
2
答案1
如果我理解你的意图:扩展参数中用斜线分隔的最后一段,即/foo/bar
应该扩展为bar
并且/foo/bar/next
应该扩展为next
。你可以定义以下宏(仅使用 TeX 基元):
\def\afterlastslash#1{\afterlsA#1/\end}
\def\afterlsA#1/#2{\ifx#2\end #1\else \expandafter\afterlsA\expandafter#2\fi}
\afterlastslash{/foo/bar} % expands to bar
\afterlastslash{/foo/bar/next} % expands to next
答案2
答案3
我尝试用 s 做同样的事情\expandafter
,但没有成功。此外,那么多内联代码很丑陋。
\documentclass{article}
\usepackage{xstring}
\begin{document}
\StrCount{/foo/bar}{/}[\temp]
\StrBehind[\temp]{/foo/bar}{/}
\end{document}
答案4
这是一个expl3
实现,名为\getbasename
。我们/\q_nil/
在末尾添加并一次测试两个项目(第一个可以为空)。
类似定义是\getdirname
返回路径。
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\getbasename}{m}
{
\michel_getbasename:w #1/\q_nil/
}
\cs_new:Npn \michel_getbasename:w #1/#2/
{
\quark_if_nil:nTF { #2 }
{% reached the end, return the previous item
#1
}
{% go on: put back #2/ and test again
\michel_getbasename:w #2/
}
}
\NewExpandableDocumentCommand{\getdirname}{m}
{
\michel_getdirname:w #1/\q_nil/
}
\cs_new:Npn \michel_getdirname:w #1/#2/
{
\quark_if_nil:nF { #2 }
{% return #1/ and go on: put back #2/ and test again
#1/
\michel_getdirname:w #2/
}
}
\ExplSyntaxOff
\begin{document}
\getbasename{/foo/bar}
\getbasename{foo/bar}
\getbasename{/foo//bar}
\getbasename{/foo/bar/next}
X\getbasename{}X
X\getbasename{/}X
X\getbasename{/foo/}X
\getdirname{/foo/bar}
\getdirname{foo/bar}
\getdirname{/foo//bar}
\getdirname{/foo/bar/next}
X\getdirname{}X
\getdirname{/}
\getdirname{/foo/}
\end{document}
最后三个示例\getbasename
和第一个示例均未\getdirname
返回任何内容,如“XX”所示。
如果函数\quark_if_nil:nTF
的(括号内的)参数仅包含,则返回 true \q_nil
,否则返回 false。