为了学习新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