
Ich überlege, die Kommandozeilenoption zu verwenden -output-directory=<some/path>
, damit die temporären Dateien mein Arbeitsverzeichnis nicht verstopfen, sondern auch für nachfolgende Builds verfügbar sind. Dadurch werden auch viele unnötige Dropbox-Aktivitäten vermieden.
Ich erstelle jedoch auch einige eigene temporäre Dateien und möchte daher auf das zugreifen können, was output-directory
in der Befehlszeile angegeben wurde.
Wie lege ich also im folgenden MWE den Wert des Makros fest, \OuptutDirectory
damit ich die Namen meiner temporären Dateien richtig bestimmen kann?
Verweise:
- Verhindern Sie, dass pdflatex eine Reihe von Dateien schreibt
- Gibt es eine Möglichkeit, pdflatex so zu konfigurieren, dass alle Dateien außer den .tex- und .pdf-Dateien versteckt werden?
Verwandte Frage:
Code:
\documentclass[a4paper]{article}
\def\OuptutDirectory{????}% <--- How do I determine this?
\edef\MyTempFile{\OuptutDirectory/\jobname.foo}%
\begin{document}
My temp file is \MyTempFile.
\end{document}
Antwort1
Ich habe in einem Arbeitsverzeichnis die Datei a.tex
mit
\newwrite\test
\immediate\openout\test=temp.txt
\immediate\write\test{Hello}
\bye
Ich habe ein temp
Unterverzeichnis erstellt und es aufgerufen
pdftex -output-dir=temp a
und die temp.txt
Datei wurde im temp
Verzeichnis erstellt:
> ls -R .
a.tex temp/
./temp:
a.log temp.txt
pdftex
Soweit mir bekannt ist, gibt es keine intern zugängliche Variable , die den Pfad zum Ausgabeverzeichnis enthält.
Natürlich können Sie es emulieren, indem Sie die Definition \OutputDirectory
von der Befehlszeile übergeben:
pdftex -output-dir=temp "\def\OutputDirectory{./temp}\input a"
Antwort2
Neue Lösung ab TeX Live 2024 ( $TEXMF_OUTPUT_DIRECTORY
)
Greifen Sie einfach auf die Umgebungsvariable mit dem Namen zu $TEXMF_OUTPUT_DIRECTORY
. Verwenden Sie sys_get_shell
:https://tex.stackexchange.com/a/62032/250119. Kredit:https://tex.stackexchange.com/a/707351/250119.
Lösung mitcurrfile-abspath
Mit currfile-abspath
detaillierten inhttps://tex.stackexchange.com/a/54894/250119
(siehe Hinweis zum -recorder
Flag), ist es möglich, \currfileabsdir
das Ausgabeverzeichnis zu erhalten, indem man die Tatsachen nutzt, dass
- Beim Schreiben in eine Datei wird diese standardmäßig in das Ausgabeverzeichnis geschrieben
\input
sucht im aktuellen-output-directory
ersten
%! 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}
Es ist jedoch eine temporäre Datei erforderlich.
Notizdass, wenn in einer Kompilierung vorhanden ist -recorder
, in der nächsten Kompilierung kein vorhanden ist -recorder
, ich denke, es ist unmöglich, die Änderung zu erkennen –
currfile-abspath
das Paket macht es auch falsch.
Der Versuch, in zu schreiben, \jobname.fls
könnte etwas bewirken, aber unter Windows ist meines Erachtens mehrfaches Schreiben in dieselbe Datei nicht zulässig.
Eine Möglichkeit besteht darin, den Dateinamen zufällig zu wählen, aber das funktioniert unter MiKTeX nicht (Recorder-Datei wird nicht online aktualisiert) und führt zu einer Überlastung des Dateisystems.
Notizdass Sie die Datei möglicherweise in etwas ausreichend Unbekanntes umbenennen test.tex
und vor dem Schreiben möglicherweise prüfen möchten, ob sie existiert. Wenn Sie nicht vorsichtig sind, überschreiben Sie möglicherweise eine wichtige Datei.
Alternative Verwendung ps
zum Abrufen der Befehlszeilenargumente des aktuellen Prozesses
(aufgrund eines Berechtigungsproblems funktioniert dies nicht auf Overleaf, sollte aber ansonsten auf den meisten POSIX-Systemen funktionieren)
\ExplSyntaxOn
\sys_get_shell:nnN {ps~-o~args=~-p~$(ps~-o~ppid=~-p~$$)} {\cctab_select:N \c_other_cctab} \l_data_tl
\ExplSyntaxOff
Bestehend dann \l_data_tl
aus der Befehlszeile des TeX-Prozesses (z. B. pdflatex --output-directory=/a/b/c main.tex
), beachten Sie jedoch, dass alle Zeichen einschließlich Leerzeichen einen „anderen“ Catcode haben.
Das Parsen der Zeichenfolge zum Abrufen des Ausgabeverzeichnisses ist eine Standardübung. Beachten Sie, dass das relevante Flag wie folgt geschrieben werden könnte:
-output-d=/path
-output-d=
-output-dir=/path
--output-dir=/path
--output-directory=/path
-output-d /path
-output-directory /path
--output-directory /path
Dies sind meines Wissens alle Varianten (alle Präfixe, die output-directory
länger als oder gleich sind output-d
, werden akzeptiert), ich habe dies jedoch nicht bei zB überprüft texdoc pdftex-changes
.
Eine weitere Alternative zur find
Suche nach der Protokolldatei
Beziehen aufDavid Carlisles Antwort. Nicht empfohlen.
Eine andere Alternative
(völlig ungetestet)
Wenn Sie nicht haben -recorder
, schreiben Sie zuerst die Datei und beziehen Sie sich dann aufSo erhalten Sie den absoluten Pfad einer Datei(oder vielleicht file_get_full_name
eine Funktion in expl3, ich bin nicht sicher), um den Pfad der Datei zu erhalten. (obwohl dies fehlschlagen könnte, wird das Ausgabeverzeichnis nicht unbedingt von kpsewhich durchsucht)
Ähnliche Antworten:
- Wenn Sie die Datei nur aus TeX lesen müssen (anstelle eines externen Befehls), funktioniert normal
\file_get:nnN
oder\input
. - Wenn sich das Ausgabeverzeichnis in einer Umgebungsvariable befindet (siehedieser Kommentar), müssen Sie das Ausgabeverzeichnis nicht in einem Befehl übergeben, es ist auch möglich,Lesen Sie die Umgebungsvariable direkt.
- Für LuaTeX gibt es eine direkte Lösung:Wie erkennt man in Luatex das effektive Ausgabeverzeichnis?
- Sowohl der Pfad zum Schreiben der Datei als auch der Pfad zum Lesen der Datei müssen fest codiert werden (erfordert
openout_any=a
Umgebungsvariable). - Verwenden Sie
scontents
, damit Sie überhaupt keine temporäre Datei benötigen, siehehttps://tex.stackexchange.com/a/513810/250119