Zugriff auf System-Umgebungsvariablen mit LaTeX

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Zugriff auf System-Umgebungsvariablen mit LaTeX

von Simbeat » Do 2. Mär 2017, 12:12

Ah, das sieht ja wunderschön aus. Ich habe es jetzt mit der \endlinechar Variante probiert und die macht hübscherweise genau das, was ich wollte (auch wenn ich zugeben muss, dass ich mir nicht 100%ig sicher bin, wie sie das explizit erreicht...)

1000 Dank!

Eine Frage hätte ich jedoch noch bzgl. u_fischer's Aussage:
Mit miktex musst du pdflatex mit der Option `--enable-pipes` aufrufen.
Das ist vollkommen richtig. Ohne diese Option geht das ganze leider nicht. Aber was genau macht diese? Ich habe nämlich ehrlich gesagt etwas Angst, dass ich damit Optionen einführe, die zwar an dieser Stelle nützlich sind, dafür aber mit irgendwelchen anderen Dokumentationen kollidieren und diese unzugänglich machen.
Kann das passieren? Worauf wirkt sich die Option denn aus?

von Gast » Do 2. Mär 2017, 10:27

Außerdem hängt an der Ausgabe von kpsewhich noch ein Zeilenumbruch, der sich als Leerzeichen auswirkt. Das muss für die reine Ausgabe unschädlich machen:
\documentclass[parskip=half,chapterprefix,numbers=noenddot,]{scrreprt}% Die entfernten Optionen sind voreingestellt.

\usepackage{catchfile}
\newcommand*{\unknownenv}{}
\CatchFileEdef{\unknownenv}{"|kpsewhich --var-value DiESeVarIABleiSTUnbekaNNt"}{}
\newcommand{\getenv}[2][]{%
   \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
   \ifx\temp\unknownenv\def\temp{Error}\fi
   \if\relax\detokenize{#1}\relax\temp\unskip\else\let#1\temp\fi}

\begin{document}

Der aktuelle Benutzer ist: \getenv{USER}.

Unbekannt ist dagegen: \getenv{DiESeVarIABle}.

\end{document}
Oder beispielsweise mit xstring entfernen:
\documentclass[parskip=half,chapterprefix,numbers=noenddot,]{scrreprt}% Die entfernten Optionen sind voreingestellt.
\usepackage{xstring}
\usepackage{catchfile}
\newcommand*{\unknownenv}{}
\CatchFileEdef{\unknownenv}{"|kpsewhich --var-value DiESeVarIABleiSTUnbekaNNt"}{}
\newcommand{\getenv}[2][]{%
   \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
   \IfEndWith{\temp}{ }{\StrGobbleRight{\temp}{1}[\temp]}{}%
   \ifx\temp\unknownenv\def\temp{Error}\fi
   \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}

\begin{document}

Der aktuelle Benutzer ist: \getenv{USER}.

Unbekannt ist dagegen: \getenv{DiESeVarIABle}.

\end{document}
Man kann das Leerzeichen über \endlinechar-Magie auch direkt verhindern:
\documentclass[parskip=half,chapterprefix,numbers=noenddot,]{scrreprt}% Die entfernten Optionen sind voreingestellt.
\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
   \begingroup
     \endlinechar=-1%
     \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
     \ifx\temp\empty\def\temp{Error}\fi% wegen \endlinechar=-1 geht das jetzt
     \edef\temp{\noexpand\endgroup\noexpand\def\noexpand\temp{\temp}}%
   \temp
   \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}

\begin{document}

Der aktuelle Benutzer ist: \getenv{USER}.

Unbekannt ist dagegen: \getenv{DiESeVarIABle}.

\end{document}

von u_fischer » Do 2. Mär 2017, 09:31

Wie kommst du darauf, dass \temp leer ist, wenn die Variable nicht existiert? Du musst ja nur ein paar \show\temp einstreuen, um zu sehen, dass das nicht stimmt.

Ich würde empfehlen, eine wirklich nicht existente Variable abzufragen:
\CatchFileEdef{\tempa}{"|kpsewhich --var-value absolutlyunknownenvvar"}{}%

Und dann \tempa mit \temp vergleichen.

von Simbeat » Do 2. Mär 2017, 09:12

Ah, vielen Dank für die schnelle Antwort. Es funktioniert jetzt, bis auf eine Sache:

Ich hätte gerne, dass wenn die Umgebungsvariable nicht gefunden wird, eine vordefinierte Aussage gemacht wird. Ich dachte eigentlich, dass der Absatz des Codes:
\ifx\temp\empty\def\temp{Error}\fi
genau dafür zuständig sein sollte.

Wenn ich aber
\getenv{foo}
- wobei "foo" keine vorhandene Variable ist - eingebe, dann wird an dieser Stelle im PDF gar nichts angezeigt und nicht das vordefinierte "Error".[/quote]

von u_fischer » Mo 27. Feb 2017, 17:55

Mit texlive sollte es direkt funktionieren. Mit miktex musst du pdflatex mit der Option `--enable-pipes` aufrufen.

Abgesehen davon sollte die Variable, die du abfragst keine Backslashes enthalten.

von Gast » Mo 27. Feb 2017, 16:44

Bei TEMP unter Windows gibt es eventuell Fehlermeldungen, weil das Backslashs enthält. Getestet habe ich das aber nicht. Dagegen haben ich folgendes im Online-Editor, also unter Linux getestet und es funktioniert:
\documentclass[parskip=half,chapterprefix,numbers=noenddot,]{scrreprt}% Die entfernten Optionen sind voreingestellt.

\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
   \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
   \ifx\temp\empty\def\temp{Error}\fi
   \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}

\begin{document}

Der aktuelle Benutzer ist: \getenv{USER}.

\end{document}

Zugriff auf System-Umgebungsvariablen mit LaTeX

von Simbeat » Mo 27. Feb 2017, 16:06

Einen wunderschönen guten Tag euch allen,

ich bin derzeit auf der Suche nach einer Möglichkeit, LaTeX auf meine Umgebungsvariablen des (Windows)Systems zugreifen zu lassen (Also eben jene, die man unter Systemeigenschaften --> Umgebungsvariablen) findet.

Ursprung der Idee ist es, dass ich ein Handbuch verfasse, dessen Versionsnummer automatisch hinzugefügt werden soll. Das geschieht über einen externen Anwender, welcher dem Handbuch automatisch immer eine Versionsnummer hinzufügt, die dann als die Variable "DOCVERSION" gespeichert wird. Wenn ich es nun also schaffen sollte, dass LaTeX automatisch auf diese Variable zugreifen könnte, dann wäre ich glücklich. Bei meinen Recherchen habe ich bereits diesen Link gefunden, den ich (dachte ich zumindest) für nützlich hielt.

https://tex.stackexchange.com/questions ... es#tab-top

Daraus ergibt sich bei mir folgendes MB:
\documentclass[final,11pt,a4paper,parskip=half,chapterprefix,numbers=noenddot,]{scrreprt}

\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
	\CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
	\ifx\temp\empty\def\temp{Error}\fi
	\if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}

\begin{document}

Platzhaltetext

Die Versionsnummer ist \getenv{DOCVERSION}

\end{document}

Ich bekomme aber den Fehler, dass DOCVERSION nicht gefunden werden könnte.
Ich dachte mir vielleicht liegt es ja an dem sonderbaren DOCVERSION, doch auch wenn ich eine Variable nehme, die bereits vorhanden ist (z.B. TEMP), in der Hoffnung, dass er mir einfach den Wert hiervon ausgibt, bekomme ich Fehler.

Da ich nun schon 6 Stunden am herumprobieren bin, wollte ich einmal Fragen, ob hier vielleicht jemand eine Idee hätte, wo das Problem sein könnte. Ich wäre euch zu ewigem Dank verpflichtet.

LG
Simbeat

Nach oben