-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_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 では同じファイルへの複数の書き込みは許可されていないと思います。
1 つのオプションはファイル名をランダム化することですが、これは 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_tlTeX プロセスのコマンド ライン (例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 によって検索されるわけではありません)


関連する回答:

関連情報