我使用该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
编译文档(请参阅-recorder
curr文件)。
\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}