Ich habe eine Frage bekommen, die diesem Beitrag sehr ähnlich ist (\includegraphics{\input{|Shell-Befehl}}), die leider nicht wirklich beantwortet wurde.
Das Ziel ist, einen Befehl zu erstellen, der ein Python-Skript aufruft, um eine Plotfigur zu erstellen, die dann in LaTeX eingefügt wird. Was ich bisher versucht habe, ist Folgendes:
main.tex:
\newcommand\pytexplot[1]{
\immediate\write18{python pytexplot.py #1}
\input{shellout}
}
\begin{document}
\includegraphic{\pytexplot{plot1}}
\includegraphic{\pytexplot{plot2}}
\end{document}
pytexplot.py ist ein Python-Skript, das je nach bereitgestelltem Parameter unterschiedliche Diagramme erstellt und eine Datei shellout.tex speichert, die den Namen und den Speicherort des Bildes des generierten Diagramms enthält.
Der gemeldete Fehler ist eine undefinierte Steuersequenz (insgesamt über 100), daher befürchte ich, dass dies nicht viel helfen wird.
Bisher bin ich davon ausgegangen, dass es etwas mit Makroerweiterungen zu tun hat, und habe versucht, sie \expandafter
an verschiedenen Positionen einzusetzen, aber ohne Erfolg.
EDIT: Wipets zweiter Vorschlag scheint zu funktionieren, aber er enthält dieselbe Handlung zweimal. Außerdem weiß ich nicht, wie ich ihn mit dem Shell-Befehl kombinieren soll.
Kann mir jemand dabei helfen?
Antwort1
Wenn die Datei shellout.tex
nur eine Zeile mit dem Dateinamen der generierten Datei enthält, dann
\usepackage{catchfile}
\newcommand{\includeplot}[2][]{%
\immediate\write18{python pytexplot.py #2}%
\CatchFileDef\plotpath{shellout.tex}{\endlinechar=-1 }%
\includegraphics[#1]{\plotpath}%
}
in der Präambel mit
\includeplot{plot1}
im Dokument oder
\includeplot[<options for \includegraphics>]{plot1}
sollte tun, was Sie brauchen.
Antwort2
Wenn Sie einen Shell-Befehl haben, der plot1
eine shellout.tex
Datei erstellt, können Sie diesen Shell-Befehl einfach so ändern, dass er
\includegraphics{plot1}
stattdessen einfach plot1
in der shelloupt.tex
Datei. Und Sie können einfach verwenden
\input shellout
Wenn Sie jedoch darauf bestehen, dass Ihr Shell-Befehl nur plot1
in Ihrer shellout.tex
Datei erstellt wird, ist der Code etwas komplizierter:
{\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}
\def\tmp#1 {\def\filecontent{#1}}\expandafter\tmp\filecontent
\expandafter\includegraphics\expandafter{\filecontent}
Bearbeiten:Die Frage wurde bearbeitet, die Reaktion auf diese Änderung folgt.
Sie können definieren
\def\pytexplot#1{%
\immediate\write18{python pytexplot.py #1}%
{\endlinechar=-1\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}%
\includegraphics\filecontents
}
und Sie können nur
\pytexplot{plot1}
\pytexplot{plot2}
Wenn Sie explizit etwas in Ihr Dokument schreiben müssen \includegraphics{\pytexplot{...}}
, müssen Sie es \includegraphics
wie \pytexplot
oben beschrieben neu definieren \def\pytexplot#1{#1}
. Wenn Sie den Befehl jedoch für andere Zwecke verwenden \includegraphics
, ist dies nicht so einfach. Sie müssen Ihrer \includegraphics
Neudefinition mehr Intelligenz verleihen.
Kommentare:
Das
\tmp
in meinem ersten Code entfernt den durch erzeugten Platz\endlinechar
. Aber die\endlinechar=-1
lokale Einstellung (vorgeschlagen von jfbu) scheint besser zu sein, also verwende ich dies in meinem zweiten Code.\includegraphics{out1}
Die einfachste Lösung besteht meiner Meinung nach darin , mit Python zu generieren\includegraphics{out2}
und Folgendes zu definieren:\def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }
Antwort3
[aus einem Kommentar verschoben]
Nur um zusätzlichen Kontext zu den bereits gegebenen Antworten bereitzustellen:
Sie können im Allgemeinen nicht hoffen, einem LaTeX-Befehl, der etwas wie einen Dateinamen erwartet, ein Makro als Argument zu übergeben; im besten Fall (und nicht immer) wird der Befehl von dem Typ sein, der versucht, sein Argument zu erweitern, und sobald dieses Argumentnicht erweiterbarist es sehr wahrscheinlich, dass der Befehl nicht funktioniert.
In diesem Fall können Sie es als Argument \includegraphics
verwenden , wenn es zu einem gültigen Dateinamen erweitert wird. Wenn jedoch Definitionen erforderlich sind oder eine Operation enthalten ist, sind Sie aufgeschmissen (egal, wie viele Sie zu manipulieren versuchen).\temp
\temp
\temp
\write
\expandafter