PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchen und Ersetzen via LaTeX-Befehl



AureusPhoenix
03-09-2013, 11:44
Hi Leute,
ich möchte mich versuchen an dieser Stelle so kurz wie möglich zu halten. Falls jemand genauere Informationen dazu haben möchte, was ich vor habe, einfach fragen.

Problem:

Ein Programm (Inkscape) erzeugt mir ein File welches ein Bild mittels includegraphics einbindet.
Das File wird mittels input in das Hauptdokument eingebunden.
Ich möchte das Bild und das dazugehörige File in einem beliebigen Subordner ablegen können.
Problem: Die Pfadangabe zum Bild stimmt jetzt natürlich nicht mehr.


Lösungsidee:
Ich schiebe einen Befehl hinterher, der das von Incscape erzeugte File durchsucht und den dort stehenden Pfad durch den richtigen ersetzt.

Kann mir jemand sagen, ob und wenn dann wie ich sowas bewerkstelligen könnte?


Vielen Dank schonmal im Voraus!
Beste Grüße


PS: Die Befehle \graphicspath und \import kommen zum Einbinden nicht wirklich in Frage, da ich dem Nutzer einen gleichbleibend einfachen Umgang wie mit \includegraphics gewährleisten möchte.

esdd
03-09-2013, 11:59
Hört sich ähnlich an wie dieses Thema auf www.texwelt.de (http://texwelt.de/wissen/fragen/1564/pfad-beim-einbinden-mit-input-temporar-als-arbeitsverzeichnis-des-compilers-verwenden/1568). Wenn die mit input eingebundene Datei und das zugehörige Bild im selben Ordner liegen, könnte dir das weiter helfen.

Gruß
Elke

AureusPhoenix
03-09-2013, 13:00
Im Grunde würde das schon funktionieren. Das Problem ist aber, das der Befehl, den ich am Ende stehen haben möchte, wie folgt aussehen soll:

\includesvg[width=0.5\textwidth, height=2cm]{pictures/setup}

Das heißt, ich bräuchte bei dieser Variante einen Befehl, der mir den String in Pfad und Dateinamen zulegen kann. Das könnte ich dann in \import{}{} rein geben.

Das ist also nicht die Variante die ich oben vorschlage, würde aber auch funktionieren. Kennt jemand ne Möglichkeit den String aufzutrennen?

sudo
03-09-2013, 13:41
Schreibst du den Befehl selbst? Dann ändere ihn doch so, dass du zwei (bzw. drei) Argumente hast:
\includesvg[width=0.5\textwidth, height=2cm]{pictures}{setup}

esdd
03-09-2013, 13:58
Wenn du sowieso Inkscape verwendest, dann kannst du dir vielleicht auch das Paket svg (http://www.ctan.org/tex-archive/graphics/svg) anschauen, dass genau so einen Befehl definiert.

Gruß
Elke

AureusPhoenix
03-09-2013, 14:00
Das könnte ich natürlich ohne weiteres machen. Ich möchte das Ganze aber so schreiben, das ihn auch Leute verwenden können, die nicht viel mit LaTeX arbeiten.
Er soll also includegraphics so ähnlich wie nur irgend möglich sein.

Ich habe mittlerweile auch schon das Paket xstring ausfindig gemacht. Mit dem kann man strings manipulieren. Aber so richtig funktioniert das Splitten noch nicht.

Vielleicht kann mir jemand weiter helfen.

AureusPhoenix
03-09-2013, 14:26
Ha, ich bin wieder ein Stück weiter. Ich hab jetzt das grobe Konzept raus, mit dem man mit xstring Pfad und Dateinamen separieren kann. Ich muss noch ein wenig dran Feilen um verschiedene Nutzereingaben abzufangen aber im groben sieht der Befehl so aus.


\newcommand{\myimport}[1]{%
\StrCount{#1}{/}[\delimiternum]%
\StrBefore[\delimiternum]{#1}{/}[\filepath]%
\StrBehind[\delimiternum]{#1}{/}[\filename]%
\import{\filepath/}{\filename}%
}

Ich meld mich, wenn ich mit allem fertig bin. Kann aber noch ein weilchen Dauern. Für heute hab ich genug Zeit darauf verwendet.

@esdd: Ich hab das svg-Paket übrigens mal kurz ausprobiert. Leider hat es das gleiche Problem mit dem Pfad. Außerdem hat es sich bei mir sofort aufgehangen.

u_fischer
03-09-2013, 14:37
Es ist ja nicht so, dass es sowas nicht schon gibt:

http://tex.stackexchange.com/questions/65345/extracting-the-basename-from-a-filepath-argument

AureusPhoenix
03-09-2013, 15:08
Halleluja, das ist ja noch viel einfacher.
Vielen Dank.

AureusPhoenix
03-09-2013, 16:21
Hi Leute, mein Code funktioniert.
Vielen Dank für eure Hilfe. Hier der "fertige" Code. Falls ihr noch Anregungen zur Verbesserung habt, immer her damit.



\NeedsTeXFormat{LaTeX2e}[1998/12/01]
\ProvidesPackage{MyGraphics}[2013/09/03 v1.05]
\makeatletter

\RequirePackage{adjustbox}
\RequirePackage{import}

% Define the InkScape command for Linux
\newcommand{\Inkscape}{inkscape }

% Redefine the InkScape path for windows
\IfFileExists{"C:/Program Files (x86)/Inkscape/inkscape.exe" }{%
\renewcommand{\Inkscape}{"C:/Program Files (x86)/Inkscape/inkscape.exe" }}{}%
\IfFileExists{"C:/Program Files/Inkscape/inkscape.exe" }{%
\renewcommand{\Inkscape}{"C:/Program Files/Inkscape/inkscape.exe" }}{}%

% Import-command that works without separating filename and -path
\newcommand{\InkImport}[1]{%
\filename@parse{#1}%
\import{\filename@area}{\filename@base.\filename@e xt}%
}

% Latex command that executes a console command #3 if file #1 is newer than #2
\newcommand{\executeiffilenewer}[3]{%
\ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
{\pdffilemoddate{#2}}>0%
{\immediate\write18{#3}}\fi%
}

% Define actual includesvg-command
\newcommand{\includesvg}{\@ifstar\@includesvgStar\ @includesvgNoStar}

% NoStar Version: Font like in LaTeX-Document
\newcommand{\@includesvgNoStar}[2][1]{%
\executeiffilenewer{#2.svg}{#2_latex.pdf}{%
\Inkscape -z -D --file="#2.svg" --export-pdf="#2_latex.pdf" --export-latex}%
\adjustbox{#1}{\InkImport{#2_latex.pdf_tex}}%
}

% Star Version: Font like in InkScape
\newcommand{\@includesvgStar}[2][1]{%
\executeiffilenewer{#2.svg}{#2_direct.pdf}{%
\Inkscape -z -D --file="#2.svg" --export-pdf="#2_direct.pdf"}%
\includegraphics[#1]{#2_direct.pdf}%
}

\makeatother

sudo
03-09-2013, 17:38
Hi,

da du ein Paket schreibst kannst du \makeatletter und \makeatother getrost weglassen.