在 expl3 语法中用连字符拆分 \jobname

在 expl3 语法中用连字符拆分 \jobname

为了学习新expl3语法,我决定重写varsfromjobname将作业名称分成不同标记的包。然而,我对新语法感到很困惑。到目前为止,我明白我需要定义一个序列类型的目标变量,它接受单个字符串并使用函数\seq_set_split进行拆分。

\documentclass{article}
\usepackage{expl3}
\usepackage{xstring}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\vfjn}{}{%
\seq_new:N \l_vfjn_seq
\seq_set_split:Nnn \l_vfjn_seq {-} {\jobname}
}
\ExplSyntaxOff

\begin{document}

\vfjn

\end{document}

但是我该如何继续呢?我读了一个l3seq包,但\usepackage{l3seq}结果却出现了无法找到该包的错误。

答案1

xparse由于和expl3是内核的一部分,因此您不需要任何软件包。因此您可以直接使用它们。这还包括l3seq。完整界面记录在中texdoc interface3

拆分后,您可以使用以下方式访问序列的各个部分\seq_item:Nn

\documentclass{article}

\ExplSyntaxOn
\seq_new:N \l_vfjn_seq % Keep the _new: outside of the command.
\NewDocumentCommand \vfjn {} {
  \seq_set_split:NnV \l_vfjn_seq {-} \c_sys_jobname_str % :NnV instead of :Nnn to ensure that the value of \jobname gets split nd not the token list containing only \jobname itself.
}
\NewExpandableDocumentCommand \vfjnGetComponent {m} {
  \seq_item:Nn \l_vfjn_seq {#1} % You can access the elements with \seq_item:Nn
} 
\ExplSyntaxOff

\begin{document}

\vfjn
The third part of the current jobname is \vfjnGetComponent{3}.

\end{document}

编译lualatex -jobname first-second-third-final filename结果如下

在此处输入图片描述

答案2

这很简单:

\ExplSyntaxOn
\NewExpandableDocumentCommand{\getfromjobname}{m}
 {
  \seq_item:Nn \c_varsfromjobname_main_seq { #1 }
 }

\seq_new:N \g_varsfromjobname_main_seq
\seq_gset_split:NnV \g_varsfromjobname_main_seq { - } \c_sys_jobname_str
\ExplSyntaxOff

然后你可以提取可扩展任何你想要的部分。你也可以定义

\NewExpandableDocumentCommand{\getonefromjobname}{}
 {
  \getfromjobname { 1 }
 }

等等。

扩展访问当前文件名部分会稍微困难一些,因为这需要维护拆分文件名的堆栈并对 进行一些繁重的操作filehook

-----...-技术的工作原理非常相似。

答案3

使用 TeX 基元来实现这一点也相当容易:

\def\getfromjobname#1{\expandafter\getfromjobnameA\jobname-------\end{#1}}
\def\getfromjobnameA #1-#2-#3-#4-#5-#6-#7-#8\end#9{%
   \ifcase #9\or#1\or#2\or#3\or#4\or#5\or#6\or#7\else
       \getfromjobnameA#8--------\end{\numexpr #9-7\relax}\fi
}

% if \jobname returns aaa-bbb-ccc then
\getfromjobname2 returns bbb
% if \jobname returns 1-2-3-4-5-6-7-8-9-10-11-12-13-14-15 then
\getfromjobname{13} returns 13

此解决方案的优点是您的宏独立于 LaTeX,并且它们也可以在其他格式中使用。此外,它独立于 expl3 宏。

如果其中包含更多部分,则递归调用\getfromjobnameA可以获取其中的任意部分。\jobname

相关内容