通用文件名解析

通用文件名解析

解析文件名并从名称中提取修订版本,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}

在此处输入图片描述

相关内容