배경

배경

배경

안녕하세요. 여러분 모두가 제공할 수 있는 통찰력에 미리 감사드립니다! 게시물이 너무 길어서 죄송합니다. 하지만 대부분의 신규 사용자가 충분한 맥락을 공유하지 않아 질책을 받는 것으로 나타났습니다. 그만큼TLDR 버전은 etools의 부울 표현식 내부에서 pgfplottable로 읽은 셀 값을 사용하는 방법을 알 수 없다는 것입니다..

CSV에서 읽는 값을 기반으로 특정 텍스트의 형식을 지정하는 데 어려움을 겪고 있습니다. 매년 나는 대략 동일한 개요를 가지고 있지만 매년 특정 위치에서 다른 값을 갖는 문서를 만들어야 합니다. 예를 들어 2015년 문서에는 다음과 같이 말할 수 있습니다.

2015년 미국의 전체 명판 용량은 1,159,748MW.

하지만 2016년에는 이 문장이 다음과 같이 업데이트되어야 합니다.

2015년 미국의 전체 명판 용량은 1,174,115MW.

우리는 Python + LaTeX를 사용하여 이를 보다 효율적인 프로세스로 전환하려고 노력하고 있습니다. 실제 데이터/그림은 Python을 사용하여 csv에 저장되고 문서는 해당 csv에서 LaTeX 읽기로 자동 업데이트됩니다. 단일 명령줄 스크립트를 사용하여 문서를 작성합니다.

지금까지,이 답변의 도움으로, 실제로 csv를 읽고 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}

뱉어내는 것 :

csv가 올바르게 읽고 인쇄되었음을 보여주는 코드 출력

실제 csv를 여러분과 공유하는 방법을 알아낼 수 있지만 매우 간단합니다. 첫 번째 행은 헤더/이름입니다(예를 들어 코드에서 'all_re'라는 제목의 열이 있음을 볼 수 있습니다). 첫 번째 열은 어떤 행이 어떤 변수에 해당하는지 추적하는 데 도움이 되는 이름(문자열)입니다. CSV의 나머지 부분은 단지 숫자입니다. '\getcell{8}{all_re}{\sectionIIvars}' 함수를 사용하면 미리 정의된 테이블 '\sectionIIvars'의 8행, 열 'all_re'에 대한 셀 내용에 액세스할 수 있습니다.

문제

여기의 LaTeX 출력은 '출판 준비'를 할 팀에 전달되며, 최종 출판까지 수치가 지속적으로 업데이트되므로 우리는 종종 이 팀에 문서를 여러 번 반복해야 합니다. 이 외부 팀이 '게시 준비' 초안을 업데이트하는 데 필요한 시간을 줄이기 위해 반복 간에 변경된 값의 형식을 자동으로 지정할 수 있기를 원합니다. 예를 들어 위 코드 조각의 두 번째 값이 반복 사이에 15.55에서 17.56으로 변경된 경우 해당 17.56이 빨간색으로 표시되기를 원합니다. '.tex' 파일의 코드가 전혀 변경되지 않더라도 기본 csv에서만 변경됩니다. 아래를 참조하세요:

여기에 이미지 설명을 입력하세요

불행히도 나는 이것을 작동시킬 수 없습니다! 내가 시도했지만 아무 소용이 없었던 몇 가지:

라텍스 차이

내가 알 수 있는 바에 따르면 이것은 '.tex' 파일 자체의 변경 사항만 캡처하기 때문에 이를 즉시 배제했습니다. 실제 .tex 파일은 여기에서 변경되지 않으므로 도움이 될 수 없습니다.

ifbooexpr

내 시간의 대부분은 여기서 보냈습니다. 이것은 모두 작성된 명령을 기반으로 합니다.이 답변에서. 각각의 경우에 한 CSV의 답변을 다른 CSV의 답변과 비교하는 부울 함수를 얻으려고합니다. Python 스크립트가 반복 간에 '\sectionIIvars' 테이블의 답변을 비교하고 실제 답변이 두 번째 csv로 변경되었는지 여부를 쓸 수 있다는 아이디어입니다('\booltestsecII'라고 하겠습니다). 그러면 Latex는 '\sectionIIvars'에 답변을 인쇄할 수 있습니다.하지만 '\booltestsecII'에 따라 형식을 지정하세요.. '\booltestsecII'는 '\sectionIIvars'와 크기와 모양은 동일하지만 0과 1만 있습니다(각각 '변경되지 않음'과 '변경됨!'에 대해).

시도 1

먼저 '\sectionIIvars'와 \booltestsecII' 사이의 동일한 행과 셀을 비교할 수 있도록 추가 인수를 취하기 위해 getcell 함수를 다시 작성해 보았습니다.

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

이로 인해 "! 누락된 숫자, 0으로 처리됨"이 생성되었습니다. 필요한 입력을 모두 제공했다고 생각했는데도 오류(필수 함수 입력이 누락되었음을 나타내는 경향이 있음)가 발생했습니다. 계속 진행하면 'Missing = \ifnum에 삽입됨'이 생성됩니다. 오류. 다시 시도하고 진행하면 '! 수평 모드에서는 `\numexpr'을 사용할 수 없습니다.'

시도 2

아마도 이것이 중첩된 매크로와 관련이 있을 것이라고 생각하여 함수 정의를 다음과 같이 변경해 보았습니다.이 질문을 바탕으로):

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

그러나 그것은 동일한 오류를 낳았습니다.

시도 3

조금 단순화하려고 노력하고 csv에서 값을 읽은 다음 'ifbooexpr'을 사용하여 숫자 값과 비교하는 데 집중했지만 그 중 하나도 작동하지 않았습니다.

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

그러면 '! \endcsname이 누락되었습니다.' 오류가 발생한 다음 '! 추가 \endcsname.' 마지막으로 "1=1do that"을 인쇄하기 전에 오류가 발생했습니다.

여기에 이미지 설명을 입력하세요

요약

지금까지 나는 아무데도 가지 못했지만 누군가의 이론을 듣는 데 매우 관심이 있습니다. LaTeX가 숫자 값을 읽고 있음에도 불구하고 이를 인식하지 못하여 '숫자 1'과 '문자열 1'을 비교할 수 없는 것은 아닐까요? 이것을 확인하거나 수정하는 방법을 모르기 때문에 여기에 글을 쓰게 되었습니다.

모든 피드백에 감사드립니다. 형식이 잘못된 질문이라면 죄송합니다. 알려주시면 최선을 다해 수정하겠습니다.

답변1

당신은 꽤 가까웠어요:

시도 1에서는 다음을 사용했습니다.

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

여기에서는 or 를 \pgfplotstablegetelem{#1}{#2}\of{#4}할당 한 후 를 사용합니다 . 이것이 왜 필요한가요? 왜 반환 값을 직접 제공 하지 않습니까 ? 문제는 할당 및 기타 필요한 작업과 같은 일부 작업이 "확장 가능"하지 않다는 것입니다. 이는 기본적으로 실행될 수는 있지만 값이 필요한 곳에는 설 수 없다는 의미입니다. 따라서 테스트하려는 값이 예상되는 내부를 사용하면 작동하지 않습니다. 이것이 중요한 부분입니다. 테스트 전에 이동할 수 있으며 내부의 확장형만 사용할 수 있습니다 .10\pgfplotsretval\pgfplotsretval\pgfplotstablegetelem{#1}{#2}\of{#4}\pgfplotstablegetelem\pgfplotstablegetelem\test\pgfplotsretval\pgfplotstablegetelem\pgfplotsretval

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

여기에 이미지 설명을 입력하세요

관련 정보