LaTeX eingebettete Grafiken | Aspose.TeX
Eine andere Möglichkeit, Bilder einzubinden
Einige TeX/LaTeX-Systeme ermöglichen das Einbinden von Bildern, die nicht extern in Bezug auf die LaTeX-Datei selbst gespeichert sind, sondern direkt in der LaTeX-Datei enthalten sind. Da es sich bei TeX/LaTeX-Dateien jedoch um reine Textdateien handelt und sie daher keine Binärdaten enthalten können, benötigen wir eine Möglichkeit, Binärdaten in Textform darzustellen. Mit anderen Worten: Binärdaten müssen in eine Textdarstellung kodiert werden. Das Problem besteht darin, dass eine TeX-Engine solche codierten Bilder nicht direkt interpretieren kann. Tatsächlich erfolgt das Einbinden eines Bildes mit dem guten alten Befehl \includegraphics
aus dem Paket „graphicx“. Allerdings kann dieser Befehl nur mit externen Bilddateien umgehen. Ja, eine externe Bilddatei (zusammen mit einer weiteren Zwischendatei) wird weiterhin außerhalb der LaTeX-Datei erstellt. Der entscheidende Punkt ist, dass Sie nur die LaTeX-Datei alleine verteilen müssen.
Okay, nehmen wir an, wir haben irgendwie ein codiertes Bild in die LaTeX-Datei eingefügt. Aber wie bekommen wir das Bild entschlüsselt? Leider können wir die Datei nicht dekodieren, indem wir sie aus der LaTeX-Datei lesen und in die externe Bilddatei schreiben. Die Textzeichenfolge, die das kodierte Bild darstellt, muss zunächst in eine externe Textdatei geschrieben werden, die dann dekodiert werden kann, um eine Bilddatei zu erzeugen.
Jetzt können wir die folgenden Schritte skizzieren, um das gewünschte Ergebnis zu erzielen:
- Kodieren Sie das Bild.
- Fügen Sie die Textzeichenfolge, die die Bilddaten darstellt, in die LaTeX-Datei ein.
- Geben Sie die Textzeichenfolge, die die Bilddaten darstellt, in eine externe Datei aus.
- Dekodieren Sie die externe Datei aus Schritt 3.
- Fügen Sie das dekodierte Bild ein.
Die ersten beiden Schritte werden vom Autor der LaTeX-Datei ausgeführt. Eine TeX-Engine übernimmt die restlichen Schritte, vorausgesetzt natürlich, sie ist richtig angewiesen.
Fangen wir ganz von vorne an. Wie können wir unser Bild kodieren, um eine Zeichenfolge zu erhalten? Eine der Methoden hierfür (und wahrscheinlich die beliebteste) ist Base64.
Codierung von Binärdaten mit Base64
Base64 ist eine Gruppe von Binär-zu-Text-Codierungsschemata, die Binärdaten in eine Folge druckbarer Zeichen umwandelt, die auf einen Satz von 64 eindeutigen Zeichen beschränkt ist. Genauer gesagt werden den binären Quelldaten jeweils 6 Bits entnommen, dann wird diese Gruppe von 6 Bits einem von 64 eindeutigen Zeichen zugeordnet. Wie alle Binär-zu-Text-Codierungsschemata ist Base64 darauf ausgelegt, in Binärformaten gespeicherte Daten über Kanäle zu übertragen, die nur Textinhalte zuverlässig unterstützen.
Aus dieser kurzen Erklärung können wir ersehen, dass Base64 das ist, was wir brauchen. Um eine Bilddatei in Base64 zu kodieren, können Sie ein Befehlszeilenprogramm (sofern auf Ihrem Betriebssystem verfügbar), Standard- oder Drittanbieterfunktionen fast jeder Programmiersprache oder Online-Tools wie Base64.guru oder ähnlich.
Platzieren des codierten Bildes in der LaTeX-Datei
Die Zeichenfolge, die Sie als Ergebnis der Kodierung erhalten, muss wie folgt in der Standard-LaTeX-Umgebung „filecontents*“ in der Präambel einer LaTeX-Datei platziert werden:
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6...
7\end{document}
Hier ist es. Schritt 2 ist abgeschlossen. Wir haben das Bild in der LaTeX-Datei! Aber was passiert, wenn wir den Satz dieser Datei mit LaTeX ausführen?
Ein LaTeX-Prozessor schreibt die Zeichenfolge in der Umgebung in eine externe Datei mit dem Namen „sample-image.64“. Durch die Verwendung der Option „Überschreiben“ wird die Datei überschrieben, wenn sie bereits existiert (z. B. wenn sie bei einem vorherigen Lauf erstellt wurde). Und das ist es auch, was Schritt 3 erreicht!
Dekodierung einer Base64-Zeichenfolge
In Schritt 4 unseres Plans kommen die Unterschiede in den TeX-Implementierungen ins Spiel. Das Dekodieren einer Base64-Zeichenfolge erfolgt mithilfe einer häufigeren Funktion, die als „\write18“-Funktion bekannt ist.
\write18
In klassischen TeX-Engines ist „\write\openout
angegeben wird. Das Primitiv „\openout<4-bit integer>=
Neuere TeX-Implementierungen (wie PDF TeX) ermöglichen die Verwendung von „\write18“. In diesem Fall interpretieren sie die „
Im Allgemeinen gibt es drei Stufen der Barrierefreiheit: deaktiviert, aktiviert mit Einschränkungen und vollständig aktiviert.
In Aspose.TeX gibt es eine TeX-Joboption namens „ShellMode“, aber es gibt nur zwei geeignete Werte: „NoShellEscape“ und „ShellRestricted“. Der Wert „NoShellEscape“ bedeutet, dass die Funktion deaktiviert ist. Der zweite Wert gibt an, dass jeder Befehl, der ausgeführt werden muss, vom Benutzer als Erweiterung der Klasse „Executable“ implementiert werden muss. Hier werden wir nicht auf die Details solcher Implementierungen eingehen, aber wir werden erwähnen, dass die „base64“-Befehlsemulation bereits in Aspose.TeX implementiert ist. Standardmäßig finden Sie die Prototypinstanz in der Sammlungseigenschaft „Executables“ der Klasseninstanz „TeXOptions“.
Base64-kodierte Daten dekodieren
Um den Inhalt einer Datei zu dekodieren, bei der es sich angeblich um Base64-kodierte Daten handelt, würden wir normalerweise die folgende Befehlszeile verwenden:
1base64 -d FILE1 > FILE2
Dabei ist FILE1 die „codierte“ Datei und „> FILE2“ bedeutet, dass die Ausgabe in die Datei „FILE2“ umgeleitet werden muss.
Daher sollten wir im Hauptteil unserer LaTeX-Datei die folgende Zeile hinzufügen:
1\immediate\write18{base64 -d sample-image.64 > sample-image.png}
Das Präfix
\immediate
ist erforderlich, um sicherzustellen, dass die Operation\write
ausgeführt wird, sobald der TeX-Scanner den primitiven Befehl findet. Andernfalls wird er beim Seitenversand verarbeitet.
Wenn wir jetzt den Satz der Datei ausführen, werden wir sehen, dass die Bilddatei „sample-image.png“ erstellt wird. Komm schon, öffne es in einem Viewer, um es zu überprüfen!
Einschließlich des dekodierten Bildes
Wie wir am Anfang des Artikels erwähnt haben, verwenden wir zum Einbinden des dekodierten Bildes den bekannten LaTeX-Befehl \includegraphics
:
1\includegraphics[options]{sample-image.png}
Die vollständige (fast) LaTeX-Datei könnte also wie folgt aussehen:
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6 \write18{base64 -d sample-image.64 > sample-image.png}
7 \includegraphics[options]{sample-image.png}
8\end{document}
Und der C#-Code, der die Aspose.TeX-API verwendet, ähnelt dem in anderen Artikeln, außer dass die Option „ShellMode“ angegeben wird:
1TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
2// Specify a file system working directory for the output.
3options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
4// Initialize the options for saving in PDF format.
5options.SaveOptions = new PdfSaveOptions();
6// Enable the shell command execution.
7options.ShellMode = ShellMode.ShellRestricted;
8// Run LaTeX to PDF conversion.
9new TeXJob(Path.Combine(RunExamples.InputDirectory, "embedded-base64-image.tex"), new PdfDevice(), options).Run();
Und jetzt sind wir mit Schritt 5 fertig. Wirklich vollständige Beispiele finden Sie in unserem Beispielprojekt.
Sie können sich auch die kostenlose Konvertierungs- Web-App ansehen, die auf der Grundlage von Aspose.TeX für .NET API erstellt wurde.