Zugriff auf System-Umgebungsvariablen mit LaTeX

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Simbeat
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Di 17. Mai 2016, 17:25

Zugriff auf System-Umgebungsvariablen mit LaTeX

Beitrag von Simbeat »

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

Gast

Beitrag von Gast »

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}

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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.

Simbeat
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Di 17. Mai 2016, 17:25

Beitrag von Simbeat »

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]

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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.

Gast

Beitrag von Gast »

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}

Simbeat
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Di 17. Mai 2016, 17:25

Beitrag von Simbeat »

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?

Antworten