Fondo

Fondo

Fondo

Hola, y gracias de antemano por cualquier información que puedan ofrecer. Perdón por la publicación tan larga, pero noté que la mayoría de los usuarios nuevos son reprendidos por no compartir suficiente contexto. ElLa versión TLDR es que no puedo entender cómo usar los valores de celda leídos con pgfplottable dentro de expresiones booleanas de etools.

Tengo dificultades para formatear ciertos fragmentos de texto en función de los valores que se leen desde un csv. Cada año tengo que crear un documento con más o menos el mismo esquema pero con valores diferentes en determinados lugares cada año. Por ejemplo, en 2015 el documento podría decir:

La capacidad nominal total para los Estados Unidos en 2015 fue 1.159.748 megavatios.

pero en 2016 esta oración debería actualizarse a:

La capacidad nominal total para los Estados Unidos en 2015 fue 1.174.115 megavatios.

Estamos tratando de hacer la transición a un proceso más eficiente con Python + LaTeX, guardando los datos/cifras reales en archivos csv con Python y los documentos actualizándose automáticamente con la lectura de LaTeX en esos archivos csv, la idea es que podamos recrear todos los documentos con un único script de línea de comandos.

Hasta ahora,con la ayuda de esta respuesta, No tengo ningún problema para leer el csv e imprimirlo "en línea" en LaTeX. 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}

Que escupe:

Salida de código que muestra los archivos CSV leídos e impresos correctamente.

Puedo encontrar una manera de compartir los archivos csv reales contigo, pero son bastante simples: la primera fila es el encabezado/nombres (por ejemplo, puedes ver en el código que hay una columna titulada 'all_re'). La primera columna son solo nombres (cadenas de caracteres) para ayudarnos a realizar un seguimiento de qué fila corresponde a qué variable. El resto del csv son solo números. La función '\getcell{8}{all_re}{\sectionIIvars}' me permite acceder al contenido de la celda para la fila 8, columna 'all_re' de la tabla predefinida '\sectionIIvars'.

El problema

Los resultados de LaTeX aquí se pasarán a un equipo que los preparará para su publicación y, a menudo, necesitamos pasar a este equipo varias iteraciones del documento, ya que las figuras se actualizan constantemente hasta la publicación final. Para reducir el tiempo que este equipo externo necesita para actualizar los borradores "listos para publicación", queremos poder formatear automáticamente los valores que han cambiado entre iteraciones. Por ejemplo, si el segundo valor en el fragmento de código anterior cambió de 15,55 a 17,56 entre iteraciones, queremos que 17,56 aparezca en rojo. Incluso si nada del código en el archivo '.tex' cambió, solo en el csv subyacente. Vea abajo:

ingrese la descripción de la imagen aquí

Desafortunadamente, ¡no puedo hacer que esto funcione! Algunas cosas que intenté sin éxito:

látexdiff

Descarté esto de inmediato porque, según lo que pude ver, esto solo captura los cambios en los archivos '.tex'. Dado que los archivos .tex reales no cambian aquí, no podría ayudar.

siboolexpr

La mayor parte de mi tiempo lo he pasado aquí. Todo esto se basa en un comando escritoen esta respuesta. En cada caso, estoy intentando que la función booleana compare una respuesta en un csv con una respuesta en otro csv. La idea es que un script de Python pueda comparar respuestas en la tabla '\sectionIIvars' entre iteraciones y escribir si la respuesta real había cambiado o no a un segundo csv (llamémoslo '\booltestsecII'). Latex podría entonces imprimir las respuestas en '\sectionIIvars'pero formatéelos según '\booltestsecII'. '\booltestsecII' tendría el mismo tamaño y forma que '\sectionIIvars' pero solo con 0 y 1 (para 'no cambió' y '¡cambió!' respectivamente).

Intento 1

Primero intenté reescribir la función getcell para tomar un argumento adicional para que comparara la misma fila y celda entre '\sectionIIvars' y \booltestsecII':

\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}

Esto produjo un "¡! Número faltante, tratado como cero". error (que tiende a indicar que falta una entrada de función requerida) aunque pensé que había proporcionado todas las entradas necesarias. Si intento continuar, se produce un mensaje "Falta = insertado para \ifnum". error. Si intento continuar una vez más, aparece un mensaje '! No puedes usar `\numexpr' en modo horizontal.'

Intento 2

Pensé que tal vez esto tenía algo que ver con las macros anidadas, así que intenté cambiar la definición de la función de esta manera (basado en esta pregunta):

\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}}
}

Pero eso produjo los mismos errores.

Intento 3

Intenté simplificar un poco y centrarme en leer un valor de un csv y luego compararlo con un valor numérico usando 'ifboolexpr' pero tampoco funcionó:

\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}

Esto produce un '! Falta \endcsname insertado.' error y luego un '! \endcsname adicional.' error antes de imprimir finalmente "1=1haz eso":

ingrese la descripción de la imagen aquí

Resumen

Hasta ahora no he llegado a ninguna parte pero estoy muy interesado en escuchar las teorías de todos. Creo que puede ser que, aunque LaTeX lea valores numéricos, ¿quizás no los reconozca como tales y, por lo tanto, no pueda comparar un '1 numérico' con una 'cadena de caracteres 1'? No sé cómo verificar o corregir esto, por eso escribo aquí.

Gracias por todos y cada uno de los comentarios. Lo siento si esta es una pregunta mal formateada, hágamelo saber y la editaré lo mejor que pueda.

Respuesta1

Estabas bastante cerca:

En el intento 1, usaste

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

Aquí \pgfplotstablegetelem{#1}{#2}\of{#4}asigna 1o 0a \pgfplotsretvaly luego usas \pgfplotsretval. ¿Por qué se requiere esto? ¿Por qué no \pgfplotstablegetelem{#1}{#2}\of{#4}da directamente el valor de retorno? El problema es que algunas operaciones, como asignaciones y otras cosas necesarias, \pgfplotstablegetelemno son "ampliables". Básicamente, eso significa que se pueden ejecutar, pero no pueden colocarse donde se requiere un valor. Por lo tanto, usar \pgfplotstablegetelemdentro de \testdonde se espera el valor que desea probar no funcionaría. Ahí es donde \pgfplotsretvalentra en juego: puedes moverte \pgfplotstablegetelemantes de la prueba y usar solo el expandible \pgfplotsretvalen el interior:

\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}

ingrese la descripción de la imagen aquí

información relacionada