goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zugriff auf System-Umgebungsvariablen mit LaTeX

 

Simbeat
Forum-Anfänger
Forum-Anfänger

Beiträge: 17
Anmeldedatum: 17.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 17:06     Titel: Zugriff auf System-Umgebungsvariablen mit LaTeX
  Antworten mit Zitat      
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/quest.....p?answertab=votes#tab-top

Daraus ergibt sich bei mir folgendes MB:

Code • Öffne in Overleaf

\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
Private Nachricht senden Benutzer-Profile anzeigen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 17:44     Titel:
  Antworten mit Zitat      
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:
Code • Öffne in Overleaf
\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}

u_fischer
Forum-Meister
Forum-Meister

Beiträge: 3537
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 18:55     Titel:
  Antworten mit Zitat      
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.
_________________

Ulrike Fischer
www.troubleshooting-tex.de
Private Nachricht senden Benutzer-Profile anzeigen

Simbeat
Forum-Anfänger
Forum-Anfänger

Beiträge: 17
Anmeldedatum: 17.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 10:12     Titel:
  Antworten mit Zitat      
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:

Code • Öffne in Overleaf

\ifx\temp\empty\def\temp{Error}\fi
 


genau dafür zuständig sein sollte.

Wenn ich aber
Code • Öffne in Overleaf
\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]
Private Nachricht senden Benutzer-Profile anzeigen

u_fischer
Forum-Meister
Forum-Meister

Beiträge: 3537
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 10:31     Titel:
  Antworten mit Zitat      
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:
Code • Öffne in Overleaf

\CatchFileEdef{\tempa}{"|kpsewhich --var-value absolutlyunknownenvvar"}{}%

 


Und dann \tempa mit \temp vergleichen.
_________________

Ulrike Fischer
www.troubleshooting-tex.de
Private Nachricht senden Benutzer-Profile anzeigen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 11:27     Titel:
  Antworten mit Zitat      
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:
Code • Öffne in Overleaf
\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 Paket auf CTANxstring entfernen:
Code • Öffne in Overleaf
\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:
Code • Öffne in Overleaf
\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
Anmeldedatum: 17.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 13:12     Titel:
  Antworten mit Zitat      
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:

Zitat:
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?
Private Nachricht senden Benutzer-Profile anzeigen

Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de