如何显示部分路径

如何显示部分路径

我使用该currfile包来帮助跟踪我的 latex 文件的来源。我使用 Linux,文件的完整路径如下:

/home/username/(various directories)/project-one/proposal/FIRST.tex

如果我使用

\usepackage[abs]{currfile}
\currfilename

然后它会显示完整路径。如果我使用

\usepackage{currfile}

那么我只看到FIRST.tex

问题: 有没有办法显示

project-one/proposal/FIRST.tex

(路径前面是否有反斜杠也没关系)。

如果这很重要,我会在 Linux 中使用 TeXlive。

答案1

在下面的代码中,曾经\defineKnownPrefixes调用过:

  • \currFileAbsPathWithoutPrefix一步扩展为所需的内容(如果可能,则删除前缀的一个实例的字符串化路径,如果它是在用 指定的路径之一\defineKnownPrefixes);

  • \stripPrefixFrom{⟨balanced text⟩}递归扩展为相同的东西,但使用⟨平衡文本⟩作为输入,而不是的“内容” \currfileabspath

\stripPrefixFrom是可限制扩展的:它可以在\edef、、、、等内部使用\xdef\write\typeout\message

\defineKnownPrefixes在本地分配前缀列表\l_uflow_prefixes_seq和结果\currFileAbsPathWithoutPrefix(换句话说,它尊重 TeX 的分组规则)。

如下所述,此设置要求使用 TeX 引擎选项\currFileAbsPathWithoutPrefix编译文档(请参阅-recordercurr文件)。

\documentclass{article}
% For correct typesetting of chars like _ in category code 12, either
% uncomment this or use an Unicode engine (e.g., LuaTeX or XeTeX):
% \usepackage[T1]{fontenc}
\usepackage{xparse} % only useful if your LaTeX is older than 2020-10-01
\usepackage[abspath]{currfile} % use the correct option name

\ExplSyntaxOn
\seq_new:N \l_uflow_prefixes_seq

\NewDocumentCommand \defineKnownPrefixes { m }
  {
    \seq_set_from_clist:Nn \l_uflow_prefixes_seq {#1}
    \tl_set:Nx \currFileAbsPathWithoutPrefix
      { \uflow_strip_prefix_from:V \currfileabspath } % correct macro name
  }

\prg_generate_conditional_variant:Nnn \str_if_eq:nn { f } { TF }

\prg_new_conditional:Npnn \uflow_str_starts_with:nn #1#2 { T }
  {
    \str_if_eq:fnTF { \str_range:nnn {#1} { 1 } { \str_count:n {#2} } } {#2}
      { \prg_return_true: }
      { \prg_return_false: }
  }

\cs_new:Npn \__uflow_check_for_one_prefix:nn #1#2
  {
    \uflow_str_starts_with:nnT {#1} {#2}
      {
        \seq_map_break:n
          {
            \str_range:nnn {#1} { 1 + \str_count:n {#2} } { -1 }
            \use_none:nn
          }
      }
  }

\cs_new:Npn \uflow_strip_prefix_from:n #1
  {
    \seq_map_tokens:Nn \l_uflow_prefixes_seq
      { \__uflow_check_for_one_prefix:nn {#1} }
    % If none of the registered prefixes matches, leave a string'ified version
    % of #1 in the input stream (string'ified for consistency with the other
    % case, when one of the prefixes matches).
    \tl_to_str:n {#1}
  }

\cs_generate_variant:Nn \uflow_strip_prefix_from:n { V }
\cs_new_eq:NN \stripPrefixFrom \uflow_strip_prefix_from:n
\ExplSyntaxOff

\begin{document}

\defineKnownPrefixes{/foo/, /bar/baz/, /quux, {/one/with, a comma/}, /tmp/}

\noindent
\stripPrefixFrom{/foo/bar/baz/quux}\\
\stripPrefixFrom{/bar/baz/quux/mmmmh}\\
\stripPrefixFrom{/quux/z/oo/t}\\
\stripPrefixFrom{/one/with, a comma/blah/bleh}\\
\stripPrefixFrom{no match/bar/baz/quux}

\medskip\noindent
% This requires the .fls file, and therefore a compilation with the
% '-recorder' option.
\currfileabspath\\
\currFileAbsPathWithoutPrefix

\end{document}

在此处输入图片描述

相关内容