当前文件的完整路径

当前文件的完整路径

这个问题导致了一个新的方案的出现:
currfile-abspath(分包至currfile

我如何显示tex我编译的文件的完整路径?这是一个简单文件,不include存在input

编辑:我在 Windows 7 64 位上使用 MiKTeX 2.9。

要求不高:如果不可能,那么我会对部分路径感到满意(至少一个或两个文件夹+文件名)。

答案1

完整路径被写入.fls由 TeXLive 选项生成的文件中-recorder(MikTeX 应该有类似的选项,也许--recorder)。该文件似乎在写入时每行都会被刷新,因此可以读取当前编译器运行中迄今为止访问的所有文件的路径。

我编写了以下代码来搜索文件INPUT <path><jobname>.tex中的一行.fls。它还读取了第一PWD <parent directory>行,如果作业名称是本地的,则使用该行。这实际上是最简单的部分,应该涵盖所有情况的 99.99%。我只是添加了剩余的解析代码以允许像这样的情况。这也pdflatex /direct/path/to/document.tex应该涵盖的用法。-output-directory

currfile我可能会在我的包中添加这段代码。

\documentclass{article}

\makeatletter
\def\thepwd@default{./}
\let\thepwd\thepwd@default
\let\theabspath\@empty
\newcommand\getabspath{%
    \begingroup
    \edef\filename{\jobname.tex}%
    \@onelevel@sanitize\filename%
    \let\thepwd\thepwd@default
    \let\theabspath\@empty
    \IfFileExists{\jobname.fls}{%
        \openin\@inputcheck=\jobname.fls\relax
        \endlinechar\m@ne
        \readline\@inputcheck to \line
        \expandafter\getabspath@extr\line\relax\relax\relax\relax\relax
        \expandafter\getabspath@defs\expandafter{\filename}%
        \loop
            \readline\@inputcheck to \line
            \@onelevel@sanitize\line
            \expandafter\getabspath@path\expandafter{\line}%
            \ifeof\@inputcheck
                \let\iterate\relax
            \fi
            \ifx\theabspath\@empty
        \repeat
        \closein\@inputcheck
    }{%
        \PackageWarning{getabspath}
            {The required recorder file (.fls) was not found.\MessageBreak
             Please compile with the '-recorder' option.\MessageBreak
             Occurred}%
    }%
    \ifx\theabspath\@empty
        \let\theabspath\thepwd
    \fi
    \edef\@tempa{%
        \def\noexpand\thepwd{\thepwd}%
        \def\noexpand\theabspath{\theabspath}%
    }%
    \expandafter
    \endgroup
    \@tempa
}
\def\getabspath@extr#1#2#3#4#5\relax{%
    \edef\@tempa{\detokenize{#1#2#3}}%
    \edef\@tempb{\detokenize{PWD}}%
    \ifx\@tempa\@tempb
       \edef\thepwd{\detokenize{#4#5/}}%
    \fi
}

\begingroup
\catcode`I=12
\catcode`N=12
\catcode`P=12
\catcode`U=12
\catcode`T=12
\gdef\getabspath@defs#1{%
    \def\getabspath@@path ##1INPUT ##2#1\relax##3\relax##4\@nnil{%
        \ifx\@empty##4\@empty\else
            \def\theabspath{##2}%
        \fi
    }%
    \def\getabspath@path##1{%
        \getabspath@@path##1\relax INPUT \@empty#1\relax{}\relax\@nnil
    }%
}
\endgroup
\makeatother

\getabspath
\message{Absolute path: \theabspath^^J}
\message{PWD: \thepwd^^J}
\begin{document}
This file has the absolute path \texttt{\theabspath\jobname.tex}.

PWD: \texttt{\thepwd}
\end{document}

更新2011/05/05:

我现在已经将此功能作为我的currfile软件包的一部分。它作为子包提供currfile-abspath,也可以单独使用。它提供\getmainfile\getabspath{<file>}并将\getpwd设置\themainfile\theabspath设置\thepwd为主文件名(可能与不同\jobname.tex),给定文件的绝对路径以及编译器运行的父工作目录。

这个新版本的currfilej 现已发布为 v0.6 2011/05/06。

答案2

马丁建议我编写一个 LuaTeX 版本,所以就在这里。:)

运行lualatex

\documentclass{article}

\usepackage{luacode}
\usepackage[T1]{fontenc}

\begin{luacode}
-- we need the LuaFileSystem
-- library
require 'lfs'

-- builds path according to the system
-- path separator, as I used in this answer:
-- http://tex.stackexchange.com/a/48241/3094
function buildPath(...)

    -- get the system path separator
    local pathseparator = package.config:sub(1,1)

    -- get the arguments
    local elements = {...}

    -- return the elements with the path separator
    return table.concat(elements, pathseparator)
end

-- get the current path plus the file name.
function getPath(filename)

    -- print the input command. According to the
    -- documentation, if -2 is used, then the strings
    -- are read as if the result of detokenize: all
    -- characters have catcode 12 except space, which
    -- has catcode 10.
    tex.print(-2, buildPath(lfs.currentdir(), filename))

end
\end{luacode}

\newcommand\fullpath[1]{\luadirect{getPath(\luastring{#1})}}

\begin{document}

\fullpath{\jobname.tex}

\end{document}

在我的 Windows 机器上输出:

Windows 输出

在我的 Linux 机器上:

Linux 输出

希望能帮助到你。:)

答案3

这是一个适用于 Unix 系统的解决方案pdflatex -shell-escape

\makeatletter
\def\fullpath{\begingroup\everyeof{\noexpand}\@sanitize
  \edef\x{\@@input|"find `pwd` -name \jobname.tex" }%
  \edef\x{\endgroup\noexpand\zap@space\x\noexpand\@empty}\x}
\makeatother

然后\fullpath将打印您正在排版的文件的完整路径。

确实没有办法从 TeX 内部获取完整路径,因此需要转入操作系统。

答案4

这是现在的标准 LaTeX 功能: \CurrentFilePath提供此文件所在的目录(相对或绝对,取决于导入方式)。

此处记录了这一点:内部包 ltfilehook

相关内容