\input{} als Argument für \inputgraphic{}

\input{} als Argument für \inputgraphic{}

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 \expandafteran 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.texnur 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 plot1eine shellout.texDatei erstellt, können Sie diesen Shell-Befehl einfach so ändern, dass er

\includegraphics{plot1}

stattdessen einfach plot1in der shelloupt.texDatei. Und Sie können einfach verwenden

\input shellout

Wenn Sie jedoch darauf bestehen, dass Ihr Shell-Befehl nur plot1in Ihrer shellout.texDatei 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 \includegraphicswie \pytexplotoben 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 \includegraphicsNeudefinition mehr Intelligenz verleihen.

Kommentare:

  1. Das \tmpin meinem ersten Code entfernt den durch erzeugten Platz \endlinechar. Aber die \endlinechar=-1lokale Einstellung (vorgeschlagen von jfbu) scheint besser zu sein, also verwende ich dies in meinem zweiten Code.

  2. \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 \includegraphicsverwenden , 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

verwandte Informationen