我正在考虑使用命令行选项-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_shell
:https://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_name
expl3 中的函数,我不确定)获取文件的路径。(虽然这可能会失败,但 kpsewhich 不一定会在输出目录中进行搜索)
相关答案:
- 如果您只需要从 TeX 读取文件(而不是外部命令)则正常
\file_get:nnN
或\input
有效。 - 如果输出目录位于环境变量中(请参阅此评论),您不需要在命令中传递输出目录,也可以直接读取环境变量。
- 对于 LuaTeX 有一个直接的解决方案:在Luatex中,如何知道有效的输出目录?
- 对写入文件的路径和读取文件的路径进行硬编码(需要
openout_any=a
环境变量) - 使用
scontents
,所以你根本不需要临时文件,请参阅https://tex.stackexchange.com/a/513810/250119