带有列表的正则表达式从路径中提取文件名

带有列表的正则表达式从路径中提取文件名

使用时\lstinputlisting{./../src/main.py}我使用相对路径来访问 Python 源文件。

但是,我想自动排除相对路径部分,只留下文件名,这样标题/标题就会像这样出现,main.py而不是像./../src/main.py

我认为某些正则表达式可以解决我的问题,但是如何解决呢?

简化的 LaTeX 代码:

\documentclass[11pt]{article}
\usepackage{listings}

\lstset {
    title = \lstname % <- regular expression to extract filename
}

\begin{document}
    \lstinputlisting{./../src/main.py}
\end{document}

答案1

inputpath您可以使用选项指定路径\lstset,并使用中间宏提供文件名:

\documentclass[11pt]{article}
\usepackage{listings}

\lstset {
  inputpath=./../src,
  title = \myname
}

\begin{document}
\def\myname{main.py}
\lstinputlisting{\myname}

\def\myname{test.py}
\lstinputlisting{\myname}
\end{document}

编辑:一种更通用且更容易处理的方法是删除路径部分,只要源文件始终位于名为的文件夹中src

\documentclass[11pt]{article}
\usepackage{listings}

\def\extractPath#1src/#2\relax{#2}
\lstset{title = \expandafter\extractPath\lstname\relax}

\begin{document}
\lstinputlisting{./../src/main.py}
\lstinputlisting{./../src/test.py}
\end{document}

答案2

expl3满足您的要求。有一个内置函数\file_parse_full_name:nNNN,我们可以在这里使用它。我从中创建了一个宏,您可以使用它来排版文件名的不同部分。如果可选参数包含目录,d则将打印目录;如果它包含f文件名,则将打印文件名;如果它包含e扩展名,则将打印扩展名,顺序无关紧要。默认情况下,它使用,fe因此打印文件名和扩展名,但不打印目录(如您所愿)。

\documentclass[11pt]{article}
\usepackage{listings}

\usepackage{xparse}

\ExplSyntaxOn
\tl_new:N \l_Skjerning_dir_tl
\tl_new:N \l_Skjerning_file_tl
\tl_new:N \l_Skjerning_ext_tl
\NewDocumentCommand \GetFileName { O{fe} m }
  {
    \file_parse_full_name:eNNN { #2 }
      \l_Skjerning_dir_tl 
      \l_Skjerning_file_tl 
      \l_Skjerning_ext_tl 
    \tl_if_in:nnT { #1 } { d } { \l_Skjerning_dir_tl / }
    \tl_if_in:nnT { #1 } { f } \l_Skjerning_file_tl
    \tl_if_in:nnT { #1 } { e } \l_Skjerning_ext_tl
  }
\cs_generate_variant:Nn \file_parse_full_name:nNNN { eNNN }
\ExplSyntaxOff

\lstset {
  title = {\GetFileName{\lstname}}
}

\begin{document}
    \lstinputlisting{./../src/main.py}
\end{document}

在此处输入图片描述

相关内容