访问 -output-directory 的值

访问 -output-directory 的值

我正在考虑使用命令行选项-output-directory=<some/path>,这样临时文件就不会阻塞我的工作目录,但也可以用于后续构建。这还将消除许多不必要的 Dropbox 活动。

但是,我也生成了一些自己的临时文件,因此希望能够访问output-directory命令行上指定的内容。

那么,在下面的MWE中,我该如何设置宏的值\OuptutDirectory以便能够正确确定我的临时文件的名称?

参考:

相关问题:

代码:

\documentclass[a4paper]{article}

\def\OuptutDirectory{????}% <--- How do I determine this?

\edef\MyTempFile{\OuptutDirectory/\jobname.foo}%

\begin{document}
    My temp file is \MyTempFile.
\end{document}

答案1

我在工作目录中设置了a.tex包含以下内容的文件

\newwrite\test
\immediate\openout\test=temp.txt

\immediate\write\test{Hello}

\bye

我创建了一个temp子目录并命名为

pdftex -output-dir=temp a

并且temp.txt文件在目录中创建temp

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

pdftex据我所知,没有可以从内部访问的保存输出目录路径的变量。

\OutputDirectory当然,您可以通过从命令行传递定义来模拟它:

pdftex -output-dir=temp "\def\OutputDirectory{./temp}\input a"

答案2

从 TeX Live 2024 开始的新解决方案($TEXMF_OUTPUT_DIRECTORY

只需访问名为 的环境变量即可$TEXMF_OUTPUT_DIRECTORY。使用sys_get_shellhttps://tex.stackexchange.com/a/62032/250119。 信用:https://tex.stackexchange.com/a/707351/250119


解决方案使用currfile-abspath

使用currfile-abspath详细的https://tex.stackexchange.com/a/54894/250119 (参见关于标志的注释-recorder),可以使用\currfileabsdir来获取输出目录,使用以下事实

  • 写入文件默认会将其写入输出目录
  • \input在当前-output-directory第一页搜索
%! TEX program = xelatex
\documentclass{standalone}
\usepackage[abspath]{currfile}
\begin{document}

\ExplSyntaxOn

% write the content to a temporary file `test.tex`
\iow_new:N \myfile
\iow_open:Nn \myfile {test.tex}
\iow_now:Nn \myfile {
    \tl_set:Nx \myoutputdir {\currfileabsdir}
}
\iow_close:N \myfile

% execute the content of that file
\input {test.tex}

% print the obtained output directory path to the PDF
\texttt{\myoutputdir}

\ExplSyntaxOff


\end{document}

但它确实需要一个临时文件。

笔记如果在一次编译中有-recorder,那么在下一次编译中就没有-recorder,我认为不可能检测到更改——
currfile-abspath包也会出错。
尝试写入\jobname.fls可能会有所作为,但在 Windows 上,我认为不允许多次写入同一文件。
一种选择是随机化文件名,但这在 MiKTeX 上不起作用(记录器文件未在线更新)并且会使文件系统混乱。

笔记您可能希望将其重命名test.tex为足够隐晦的名称,并可能在写入之前检查文件是否存在。如果您不小心,可能会覆盖一些重要的文件。


替代方法ps来获取当前进程的命令行参数

(由于某些权限问题,这在 Overleaf 上不起作用,但除此之外应该可以在大多数 POSIX 系统上运行)

\ExplSyntaxOn
\sys_get_shell:nnN {ps~-o~args=~-p~$(ps~-o~ppid=~-p~$$)} {\cctab_select:N \c_other_cctab} \l_data_tl
\ExplSyntaxOff

然后\l_data_tl由 TeX 进程的命令行组成(例如pdflatex --output-directory=/a/b/c main.tex),但请注意,所有字符都会有“其他”catcode,包括空格。

从这里开始,解析字符串以获取输出目录是一项标准练习。请注意,相关标志可能写为...

-output-d=/path
-output-d=
-output-dir=/path
--output-dir=/path
--output-directory=/path
-output-d /path
-output-directory /path
--output-directory /path

据我所知,这些都是所有变体(所有output-directory长于或等于的前缀output-d都被接受),尽管我还没有检查过例如texdoc pdftex-changes


另一种方法是find查找日志文件

參閱大卫·卡莱尔的回答。 不建议。


另一种选择

(未经彻底测试)

如果你没有-recorder,请先写入文件然后参考如何获取文件的绝对路径(或者可能是file_get_full_nameexpl3 中的函数,我不确定)获取文件的路径。(虽然这可能会失败,但 kpsewhich 不一定会在输出目录中进行搜索)


相关答案:

相关内容