
一時ファイルが作業ディレクトリを詰まらせないように、また後続のビルドでも使用できるように、コマンド ライン オプションを使用することを検討しています-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_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