
我正在考慮使用命令列選項-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