删除字符串直到最后一个斜杠

删除字符串直到最后一个斜杠
\documentclass{article}
\usepackage{xstring}
\begin{document}
\StrBehind[2]{/foo/bar}{/}
\StrCount{/foo/bar}{/}
\StrBehind[\StrCount{/foo/bar}{/}]{/foo/bar}{/}
\end{document}

我正在尝试使用 删除。/foo/上述文档中的第一行确实产生了,第二行确实产生了,但第三行不起作用。我该如何让它工作,或者有没有更简单的方法来做我想做的事情?/foo/barxstringbar2

答案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

我认为有一种listofitems方法更简单。

\documentclass{article}
\usepackage{listofitems}
\setsepchar[,]{/}%
\newcommand\postslash[1]{\readlist\myparse{#1}\myparse[-1]}
\begin{document}
\postslash{/foo/bar}

\postslash{bar}

\postslash{/foo/baz/bar}
\end{document}

在此处输入图片描述

答案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。

相关内容