Hintergrund

Hintergrund

Hintergrund

Hallo und danke im Voraus für alle Einblicke, die Sie anbieten können! Entschuldigen Sie den sehr langen Beitrag, aber mir ist aufgefallen, dass die meisten neuen Benutzer dafür gerügt werden, dass sie nicht genügend Kontext teilen.TLDR-Version ist, dass ich nicht herausfinden kann, wie ich mit pgfplottable eingelesene Zellwerte innerhalb von Booleschen Ausdrücken von etools verwenden kann.

Ich habe Probleme, bestimmte Textteile basierend auf den aus einer CSV-Datei eingelesenen Werten zu formatieren. Jedes Jahr muss ich ein Dokument mit mehr oder weniger derselben Gliederung erstellen, aber jedes Jahr mit unterschiedlichen Werten an bestimmten Stellen. Im Jahr 2015 könnte das Dokument beispielsweise lauten:

Die gesamte Nennkapazität der Vereinigten Staaten betrug im Jahr 2015 1.159.748 MW.

Im Jahr 2016 sollte dieser Satz jedoch wie folgt aktualisiert werden:

Die gesamte Nennkapazität der Vereinigten Staaten betrug im Jahr 2015 1.174.115 MW.

Wir versuchen, dies auf einen effizienteren Prozess mit Python + LaTeX umzustellen, wobei die eigentlichen Daten/Zahlen mit Python in CSV-Dateien gespeichert und die Dokumente automatisch aktualisiert werden, indem LaTeX diese CSV-Dateien einliest. Die Idee dahinter ist, dass wir alle Dokumente mit einem einzigen Befehlszeilenskript neu erstellen könnten.

Bis jetzt,mit Hilfe dieser Antwort, ich habe keine Probleme damit, die CSV-Dateien einzulesen und sie „inline“ in LaTeX auszudrucken. MWE:

\documentclass[16pt]{article}

\usepackage{pgfplotstable, pgfplots, etoolbox, xcolor}

\pgfplotstableread[col sep=comma]{data_values_test.csv}\sectionIIvars

\def\getcell#1#2#3{
    \pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval%
}

\begin{document}
Renewable electricity in was \textbf{\getcell{8}{all_re}{\sectionIIvars}\% of total installed electricity capacity and \getcell{3}{all_re}\sectionIIvars}\% of total annual generation in the United States}.
\end{document}

Was ausspuckt:

Code-Ausgabe zeigt, dass CSVs richtig gelesen und gedruckt werden

Ich kann mir einen Weg ausdenken, die eigentlichen CSV-Dateien mit Ihnen zu teilen, aber sie sind ganz einfach: Die 1. Zeile enthält Überschriften/Namen (Sie können beispielsweise im Code sehen, dass es eine Spalte mit dem Titel „all_re“ gibt). Die erste Spalte enthält nur Namen (Zeichenfolgen), damit wir den Überblick behalten, welche Zeile welcher Variable entspricht. Der Rest der CSV-Datei besteht nur aus Zahlen. Mit der Funktion „\getcell{8}{all_re}{\sectionIIvars}“ kann ich auf den Zelleninhalt für Zeile 8, Spalte „all_re“, aus der vordefinierten Tabelle „\sectionIIvars“ zugreifen.

Das Problem

Die LaTeX-Ausgaben werden hier an ein Team weitergeleitet, das sie „veröffentlichungsreif“ macht. Wir müssen diesem Team häufig mehrere Iterationen des Dokuments zukommen lassen, da die Zahlen bis zur endgültigen Veröffentlichung ständig aktualisiert werden. Um die Zeit zu verkürzen, die dieses externe Team zum Aktualisieren der „veröffentlichungsreifen“ Entwürfe benötigt, möchten wir in der Lage sein, Werte, die sich zwischen den Iterationen geändert haben, automatisch zu formatieren. Wenn sich beispielsweise der zweite Wert im obigen Codeausschnitt zwischen den Iterationen von 15,55 auf 17,56 geändert hat, möchten wir, dass diese 17,56 rot angezeigt wird. Selbst wenn sich der Code in der „.tex“-Datei nicht geändert hat, sondern nur in der zugrunde liegenden CSV-Datei. Siehe unten:

Bildbeschreibung hier eingeben

Leider bekomme ich das nicht zum Laufen! Ein paar Dinge habe ich vergeblich versucht:

Latexdiff

Das habe ich sofort ausgeschlossen, da dies meines Wissens nur Änderungen in den .tex-Dateien selbst erfasst. Da sich die eigentlichen .tex-Dateien hier nicht ändern, würde es nicht helfen.

ifboolexpr

Die meiste Zeit habe ich hier verbracht. Dies alles basiert auf einem Befehl, der geschrieben wurdein dieser Antwort. In jedem Fall versuche ich, die Boolesche Funktion dazu zu bringen, eine Antwort in einer CSV-Datei mit einer Antwort in einer anderen CSV-Datei zu vergleichen. Die Idee ist, dass ein Python-Skript die Antworten in der Tabelle „\sectionIIvars“ zwischen den Iterationen vergleichen und in eine zweite CSV-Datei schreiben kann, ob sich die tatsächliche Antwort geändert hat oder nicht (nennen wir sie „\booltestsecII“). Latex könnte dann die Antworten in der Tabelle „\sectionIIvars“ drucken.aber formatieren Sie sie basierend auf '\booltestsecII'. '\booltestsecII' hätte dieselbe Größe und Form wie '\sectionIIvars', aber nur 0en und 1en (für 'hat sich nicht geändert' bzw. 'geändert!').

Versuch 1

Zuerst habe ich versucht, die Funktion getcell so umzuschreiben, dass sie ein zusätzliches Argument annimmt, sodass sie dieselbe Zeile und Zelle zwischen '\sectionIIvars' und \booltestsecII' vergleicht:

\documentclass[16pt]{article}

\usepackage{pgfplotstable, pgfplots, etoolbox, xcolor}

\pgfplotstableread[col sep=comma]{data_values_test.csv}\sectionIIvars
\pgfplotstableread[col sep=comma]{Boolean_change_test.csv}\booltestsecII

\newcommand{\getcell}[4]{
      \ifboolexpr{ test {\ifnumcomp{\pgfplotstablegetelem{#1}{#2}\of{#4}\pgfplotsretval}{=}{1}}}
        {\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval}
        {\textcolor{red}{\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval}}
}

\begin{document}

Renewable electricity in was \textbf{\getcell{8}{all_re}{\sectionIIvars}{\booltestsecII}\% of total installed electricity capacity and \getcell{3}{all_re}{\sectionIIvars}{\booltestsecII}\% of total annual generation in the United States}.

\end{document}

Dies führte zu einem „! Fehlende Zahl, wird als Null behandelt.“-Fehler (der normalerweise auf eine fehlende erforderliche Funktionseingabe hinweist), obwohl ich dachte, ich hätte alle erforderlichen Eingaben gemacht. Wenn ich versuche, fortzufahren, wird ein „Fehlt = eingefügt für \ifnum.“-Fehler ausgegeben. Wenn ich versuche, noch einmal fortzufahren, wird ein „! Sie können `\numexpr‘ nicht im horizontalen Modus verwenden.“ ausgegeben.

Versuch 2

Ich dachte, dass dies vielleicht etwas mit verschachtelten Makros zu tun hat, also habe ich versucht, die Funktionsdefinition wie folgt zu ändern (basierend auf dieser Frage):

\newcommand{\getcell}[4]{
      \ifboolexpr{ test {\ifnumcomp{\pgfplotstablegetelem{##1}{##2}\of{##4}\pgfplotsretval}{=}{1}}}
        {\pgfplotstablegetelem{##1}{##2}\of{##3}\pgfplotsretval}
        {\textcolor{red}{\pgfplotstablegetelem{##1}{##2}\of{##4}\pgfplotsretval}}
}

Aber das führte zu den gleichen Fehlern.

Versuch 3

Ich habe versucht, es ein wenig zu vereinfachen und mich nur auf das Einlesen eines Werts aus einer CSV-Datei und den anschließenden Vergleich mit einem numerischen Wert mithilfe von „ifboolexpr“ zu konzentrieren, aber auch das hat nicht funktioniert:

\documentclass[16pt]{article}

\usepackage{pgfplotstable, pgfplots, etoolbox, xcolor}

\pgfplotstableread[col sep=comma]{Boolean_change_test.csv}\booltestsecII

\newcommand{\checkchangesecII}[3]{
      \ifboolexpr{ test {\value{\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval}{=}{1}}}
        {do this}
        {\textcolor{red}{do that}}
}


\begin{document}

\checkchangesecII{0}{solar}{\booltestsecII}

\end{document}

Dies erzeugt einen „! Fehlender \endcsname eingefügt.“-Fehler und dann einen „! Zusätzlicher \endcsname.“-Fehler, bevor schließlich „1=1mach das“ ausgegeben wird:

Bildbeschreibung hier eingeben

Zusammenfassung

Bisher bin ich nicht weitergekommen, aber ich bin sehr an den Theorien anderer interessiert. Ich denke, es könnte sein, dass LaTeX zwar numerische Werte einliest, diese aber möglicherweise nicht als solche erkennt und daher eine „numerische 1“ nicht mit einer „Zeichenfolge 1“ vergleichen kann. Ich weiß nicht, wie ich das überprüfen oder korrigieren kann, deshalb schreibe ich hier.

Vielen Dank für jedes Feedback. Entschuldigen Sie, wenn die Frage schlecht formatiert ist. Lassen Sie es mich bitte wissen und ich werde sie so gut wie möglich bearbeiten.

Antwort1

Du warst ziemlich nah dran:

Im ersten Versuch haben Sie

\ifboolexpr{ test {\ifnumcomp{\pgfplotstablegetelem{#1}{#2}\of{#4}\pgfplotsretval}{=}{1}}}

Hier \pgfplotstablegetelem{#1}{#2}\of{#4}weist 1oder 0zu \pgfplotsretvalund danach verwenden Sie \pgfplotsretval. Warum ist das erforderlich? Warum gibt es nicht \pgfplotstablegetelem{#1}{#2}\of{#4}direkt den Rückgabewert zurück? Das Problem ist, dass einige Operationen, wie Zuweisungen und andere Dinge, die in erforderlich sind, \pgfplotstablegetelemnicht „erweiterbar“ sind. Das bedeutet im Grunde, dass sie ausgeführt werden können, aber nicht dort stehen können, wo ein Wert erforderlich ist. Die Verwendung \pgfplotstablegeteleminnerhalb von \test, wo der zu testende Wert erwartet wird, würde also nicht funktionieren. Hier \pgfplotsretvalkommt es ins Spiel: Sie können vor dem Test verschieben \pgfplotstablegetelemund das Erweiterbare nur \pgfplotsretvalinnerhalb verwenden:

\documentclass[16pt]{article}

\usepackage{pgfplotstable, pgfplots, etoolbox, xcolor}

\pgfplotstableread[col sep=comma]{data_values_test.csv}\sectionIIvars
\pgfplotstableread[col sep=comma]{Boolean_change_test.csv}\booltestsecII

\newcommand{\getcell}[4]{
      \pgfplotstablegetelem{#1}{#2}\of{#4}
      \ifboolexpr{ test {\ifnumcomp{\pgfplotsretval}{=}{1}}}
        {\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval}
        {\textcolor{red}{\pgfplotstablegetelem{#1}{#2}\of{#3}\pgfplotsretval}}
}

\begin{document}

Renewable electricity in was \textbf{\getcell{8}{all_re}{\sectionIIvars}{\booltestsecII}\% of total installed electricity capacity and \getcell{3}{all_re}{\sectionIIvars}{\booltestsecII}\% of total annual generation in the United States}.

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen