将文件名解析到文档中

将文件名解析到文档中

我有一组按照以下约定命名的 tex 文件:

xxx_yyy_zzz.tex

我想使用文件名的组成部分 (xxx、yyy、zzz) 作为文档的输入,特别是在创建标题/页眉时。例如,我希望能够将文档的标题设置为Learning about yyy'' and the author to bezzz'',页脚显示 xxx。

到目前为止,我发现一些可以让我删除文件名末尾的代码:https://tex.stackexchange.com/a/21808

我也尝试使用 xstring 包中的 \StrBetween 来处理 currfile 包中的 \currfilename,但这不起作用。

\documentclass{article}
\usepackage{currfile}
\usepackage{xstring}

\begin{document}

\makeatletter
\filename@parse{\currfilename}
\StrBetween{\filename@base}{_}{_}
\makeatother

\end{document}

实际上我认为我使用 \StrBetween 是错误的,但即使我做了类似的事情

\StrBetween{\filename@base}{xxx}{zzz}

它不会打印出 yyy,但如果我这样做

\StrBetween{a \filename@base b}{a}{b}

然后它将打印 xxx_yyy_zzz。

关于如何获取名为 xxx_yyy_zzz.tex 的文件并包含文本组件 xxx、yyy 和 zzz 以便稍后在文件中使用(例如在标题中),有什么建议吗?

答案1

由于您有一个非常具体的文件名模式,您可以使用 TeX\def来定义特定的参数文本,从中提取参数文本中的文件名元素:

在此处输入图片描述

\documentclass{article}

\makeatletter
\catcode`\_=12
\newcommand{\filenameparse}[1]{\expandafter\filename@parse@#1\@nil}
\def\filename@parse@#1_#2_#3\@nil{%
  \gdef\fileA{#1}% first part
  \gdef\fileB{#2}% middle part
  \gdef\fileC{#3}% final part
}
\catcode`\_=8
\makeatother

\begin{document}

\filenameparse{\jobname}

\verb|\fileA:| \fileA \par
\verb|\fileB:| \fileB \par
\verb|\fileC:| \fileC
\end{document}

\jobname带有文件的名称(不带扩展名),然后将其处理为#1_#2_#3,其每个组件分别提取为\fileA\fileB\fileC

答案2

在这种情况下,Werner 的解决方案是解析单独组件的更好方法,但这里有一种方法可以使用xstring'宏\StrBefore,并\StrBetween提取相关组件。

使用下面名为 的文件"theory-relaivity-Einstein.tex",输出如下:

在此处输入图片描述

代码:

% This file is called "theory-relaivity-Einstein.tex"
\documentclass{article}
\usepackage{currfile}
\usepackage{xstring}

% Ensure that we are no overriding any existing macros:
\newcommand*{\XXX}{}%
\newcommand*{\YYY}{}%
\newcommand*{\ZZZ}{}%

\newcommand*{\FileNameParse}{%
    \StrBefore{\currfilename}{-}[\XXX]%
    \StrBetween[1,2]{\currfilename}{-}{-}[\YYY]%
    \StrBetween[2,1]{\currfilename}{-}{.}[\ZZZ]%
}%



\begin{document}
\FileNameParse
XXX=\XXX,

Learning about ``\YYY"
Author=``\ZZZ".

\end{document}

答案3

这实现了一种相当通用的分割方法:

\documentclass{article}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\cs_generate_variant:Nn \regex_split:nnN { nV }
\seq_new:N \l_liz_jobname_seq

\NewDocumentCommand{\splitjobname}{m}
 {
  \regex_split:nVN { #1 } \c_sys_jobname_str \l_liz_jobname_seq
 }

\DeclareExpandableDocumentCommand{\jobnamepart}{m}
 {
  \seq_item:Nn \l_liz_jobname_seq { #1 }
 }
\ExplSyntaxOff

\splitjobname{ _ }

\begin{document}

First part: \jobnamepart{1}\par
Second part: \jobnamepart{2}\par
Third part: \jobnamepart{3}

\end{document}

如果作业名称是xxx_yyy_zzz.tex,则输出将是

在此处输入图片描述

如果作业名称是xxx-yyy_zzz.tex,则使用

\splitjobname{ [ _ \- ] }

都会得到相同的输出。

相关内容