使用时\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}