我有一组按照以下约定命名的 tex 文件:
xxx_yyy_zzz.tex
我想使用文件名的组成部分 (xxx、yyy、zzz) 作为文档的输入,特别是在创建标题/页眉时。例如,我希望能够将文档的标题设置为Learning about yyy'' and the author to be
zzz'',页脚显示 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{ [ _ \- ] }
都会得到相同的输出。