这个问题导致了一个新的方案的出现:
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
),给定文件的绝对路径以及编译器运行的父工作目录。
这个新版本的currfile
j 现已发布为 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 机器上输出:
在我的 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