在解析文件名并从名称中提取修订版本,OP 想要解析 cv3.01 格式的文件名以提取修订号 3.01。
@egreg 针对具有通用前缀的文件名发布了以下解决方案:
\documentclass{article}
\makeatletter
\edef\revision@prefix{\detokenize{%
% customize based on the file name structure
cv% <---- change the characters before %
}}
\expandafter\def\expandafter\revision@get\revision@prefix#1\@nil{#1}
\edef\revision{\expandafter\revision@get\jobname\@nil}
\makeatother
\begin{document}
This document is Rev~\revision.
\end{document}
如果我有一个像 cv3.01temp 这样的文件名结构会怎么样?如何将这种方法推广到解析具有\jobname
任意(可能为空)前缀和后缀的文件名?
答案1
将文件另存为cv3.01temp.tex
并享用。;-)
\documentclass{article}
\makeatletter
\edef\revision@prefix{\detokenize{%
% customize based on the file name structure
cv% <---- change the characters before %
}}
\edef\revision@postfix{\detokenize{%
% customize based on the file name structure
temp% <---- change the characters before %
}}
\begingroup\edef\x{\endgroup
\def\noexpand\revision@get\revision@prefix##1\revision@postfix\noexpand\@nil{##1}}%
\x
\edef\revision{\expandafter\revision@get\jobname\@nil}
\makeatother
\begin{document}
This document is Rev~\revision.
\end{document}
\@nil
为防后缀为空,将保留。
诀窍在于,除了出于已经解释的原因对前缀和后缀进行去标记化之外,还要定义它\revision@get
,使其具有由(去标记化的)前缀和(去标记化的)后缀分隔的单个参数,后跟\@nil
。这是通过扩展内部的字符串\edef
然后执行获得的宏来实现的。
实际上,参数分隔符只是跟在参数后面的内容<parameter text>
,因此前导标记只是宏名后面才需要。
只是为了好玩,这里有一种从职位名称中提取第一串数字和句点的方法;如果没有找到这样的运行,则\revision
设置为???
。
\documentclass{article}
\usepackage{expl3,l3regex}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_extract_once:nnNTF { nV }
\regex_extract_once:nVNTF { [\d\.]+ } \c_sys_jobname_str \l_tmpa_seq
{ \tl_set:Nx \revision { \seq_item:Nn \l_tmpa_seq { 1 } } }
{ \tl_set:Nn \revision { ??? } }
\ExplSyntaxOff
\begin{document}
This document is Rev~\revision.
\end{document}
答案2
\documentclass{article}
\def\zzz{\expandafter\zzzz\filename\relax}
\def\zzzz#1{%
\ifcat1#1#1\fi
\ifx\relax#1\else\expandafter\zzzz\fi}
\begin{document}
\def\filename{cv3.01temp} Revision: \zzz
\def\filename{3.02temp} Revision: \zzz
\def\filename{cv3.03} Revision: \zzz
\expandafter\scantokens\expandafter{\expandafter
\edef\expandafter\filename\expandafter{\jobname}}
Revision: \zzz
\end{document}
答案3
使用一种listofitems
方法。
\documentclass{article}
\usepackage{listofitems}
\newcommand\revision[1]{
\setsepchar{cv||temp}%
\ignoreemptyitems
\readlist\mylist{#1}%
\mylist[1]%
}
\begin{document}
\revision{cv3.01temp}
\revision{3.02temp}
\revision{cv3.03}
\def\filename{cv3.04atemp2017-10-27}
\revision{\filename}
\end{document}