-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_name在 expl3 中起作用,我不確定)來獲取文件的路徑。 (雖然這可能會失敗,但 kpsewhich 不一定會搜尋輸出目錄)


相關回答:

相關內容