¿Cómo almacenar datos de un archivo de texto en la variable Tikz?

¿Cómo almacenar datos de un archivo de texto en la variable Tikz?

Estoy intentando pasar valores de variables que estoy usando en mi gráfico de Tikz usando el archivo de texto. No estoy seguro de cómo convertir datos de una cadena a un carácter. Aquí, automaton.txtalmacena algunos valores de matriz (1x4) como cadenas en cada fila en las que quiero reescribir \statedef. El número de filas del archivo de texto varía en cada importación y \defsolo acepta caracteres. Además, me preguntaba si hay alguna forma de sincronizar un archivo de texto al dorso, para poder ver los cambios reflejados en mi figura al dorso, por favor.

\documentclass[tikz,border=1cm]{standalone}
\usepackage{graphicx} % Required for inserting images
\usepackage{amsthm}
\pdfoutput=1
\usepackage{multirow}
\usepackage{lettrine}
\usepackage{graphicx,float}
\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows.meta,calc,cd}
\usetikzlibrary{patterns}
\usetikzlibrary{datavisualization}
\tikzset{
->, % makes the edges directed
>=stealth, % makes the arrow heads bold
node distance=3cm, % specifies the minimum distance between two nodes. Change if necessary.
every state/.style={thick, fill=gray!10}, % sets the properties for each ’state’ node
initial text=$ $, % sets the text that appears on the start arrow
}
\usepackage[fleqn]{amsmath}
\usepackage{amssymb}
\usepackage{cite}
\usepackage{lettrine}
\let\labelindent\relax
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{readarray}
\usepackage{pgfplots}
\usepackage{pgfmath}
\makeatletter
\newenvironment{customlegend}[1][]{%
    \begingroup
    % inits/clears the lists (which might be populated from previous
    % axes):
    \pgfplots@init@cleared@structures
    \pgfplotsset{#1}%
}{%
    % draws the legend:
    \pgfplots@createlegend
    \endgroup
}%

% makes \addlegendimage available (typically only available within an
% axis environment):
\def\addlegendimage{\pgfplots@addlegendimage}
\makeatother
\usepackage[T1]{fontenc}
\usepackage[export]{adjustbox}
\usepackage{booktabs,makecell}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage[labelsep=quad,indention=10pt]{subfig}
\usepackage{ifthen}
\begin{document}
\tikzset{
    redfill/.code={
    \definecolor{mycolour1}{rgb}{1,0,0}%
    \pgfkeysalso{/tikz/fill=mycolour1!40}
      }
    }
    \tikzset{
    greenfill/.code={
    \definecolor{mycolour2}{rgb}{0,1,0}%
    \pgfkeysalso{/tikz/fill=mycolour2!30}
      }
    }
    \tikzset{
    bluefill/.code={
    \definecolor{mycolour3}{rgb}{0,0,1}%
    \pgfkeysalso{/tikz/fill=mycolour3!40}
      }
    }
    \tikzset{
    cyanfill/.code={
    \pgfkeysalso{/tikz/fill=teal!60}
      }
    }
    \tikzset{
    twocolorfill/.style n args={2}{path picture={
            \fill[#1] (path picture bounding box.south)--(path picture bounding box.north)--(path picture bounding box.north east)--(path picture bounding box.south east)--cycle;
            \fill[#2] (path picture bounding box.south)--(path picture bounding box.north)--(path picture bounding box.north west)--(path picture bounding box.south west)--cycle;
            }}
    }
    \tikzset{
    threecolorfill/.style n args={3}{path picture={
            \fill[#1] (path picture bounding box.east)--(path picture bounding box.north east)--(path picture bounding box.north west)--(path picture bounding box.west)--cycle;
            \fill[#2] (path picture bounding box.center) -- (path picture bounding box.south)  arc [start angle=-90, delta angle=-90, radius=1] -- cycle;
            \fill[#3] (path picture bounding box.center) -- (path picture bounding box.south)  arc [start angle=-90, delta angle=90, radius=1] -- cycle;
            }}
    }
    \tikzset{
    fourcolorfill/.style n args={4}{path picture={
            \fill[#1] (path picture bounding box.east)--(path picture bounding box.north east)--(path picture bounding box.north)--(path picture bounding box.center)--cycle;
            \fill[#2] (path picture bounding box.center)--(path picture bounding box.north)--(path picture bounding box.north west)--(path picture bounding box.west)--cycle;
            \fill[#3] (path picture bounding box.center)--(path picture bounding box.south)--(path picture bounding box.south west) -- (path picture bounding box.west) -- cycle;
            \fill[#4] (path picture bounding box.center)--(path picture bounding box.south)--(path picture bounding box.south east) -- (path picture bounding box.east) -- cycle;
            }}
    }
    \tikzset{
            colorfill1_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{greenfill}
            \else
            \fi 
            },
            colorfill2_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{redfill}
            \else
            \fi 
            },
            colorfill3_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{bluefill}
            \else
            \fi 
            },
            colorfill4_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{cyanfill}
            \else
            \fi 
            },
            hashfill1_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{pattern=north west lines, pattern color=black}
            \else
            \fi 
            },
            fourcolor1_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{fourcolorfill={cyanfill}{redfill}{greenfill}{blue!50}}
            \else
            \fi 
            },
            threecolor1_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{threecolorfill={cyanfill}{greenfill}{blue!50}}
            \else
            \fi 
            },
            twocolor1_sub/.code=
            {
            \ifnum\pgfkeysvalueof{/tikz/colorfill_item}=#1
            \tikzset{twocolorfill={blue!50}{cyanfill}}
            \else
            \fi 
            },
            colorfill_item/.initial=0,
            colorfill/.code n args={9}
            {
            \tikzset{colorfill_item=#1,colorfill1_sub/.list=#2,colorfill2_sub/.list=#3,colorfill3_sub/.list=#4,colorfill4_sub/.list=#5,hashfill1_sub/.list=#6,fourcolor1_sub/.list=#7,threecolor1_sub/.list=#8,twocolor1_sub/.list=#9}
            } 
    }
    
\begin{figure*}[h]
\centering
    \begin{adjustbox}{minipage=\textwidth,scale=0.8}
    \begin{tikzpicture}[node distance = 2cm, on grid,>={Stealth[inset=0pt,length=6pt,angle'=28,round]}
            ]

    \begin{customlegend}[legend style={at={(10,-8)},anchor=south},legend columns=-1,legend style={column sep=1ex},legend entries={Proposed Method,PCM PTA-MPC,CB PTA-MPC,PTA-MPC,Failed State}]
    \addlegendimage{black,only marks, mark=*, cyanfill,style={scale=4}}
    \addlegendimage{black,only marks, mark=*, bluefill,style={scale=4}}
    \addlegendimage{black,only marks, mark=*, greenfill,style={scale=4}}
    \addlegendimage{black,only marks, mark=*, redfill,style={scale=4}}
    \addlegendimage{black,only marks, mark=*, pattern=north west lines, pattern color=black,style={scale=4}}
   \end{customlegend};

\readarraysepchar{,}
\readdef{automaton.txt}{\mydata}
\readarray\mydata\datacell[-,\ncols]
\def\test{\pgfkeysvalueof{\mydata[3,4]}}


    %% DO NOT put extra space below!!!
    %% {first state xcoor,first state ycoor,first state superscript, last state superscript}
    %% State Definition
    \def\statedef{{2,0,2,10},{8,2,11,14},{8,-2,15,20},{8,-4,21,24},{4,-3,25,26},{5,-6,27,29}}
    %% {first state superscript, last state superscript}
    %% Straight Edge Definition
    \def\straightsolidedge{{1,5},{7,9},{11,12},{14},{15,20},{21,24},{27,29}}
    \def\bendrightsolidedge{{2,25},{25,27},{29,22},{24,19},{18,9},{16,7},{4,15},{4,21},{16,23}}
    \def\bendleftsolidedge{{12,7},{14,9}}
    %% Color Definiton
    \def\rstates{{5,22,23,24,25,27,28,29}}
    \def\gstates{{11,12}}
    \def\bstates{{13}}
    \def\cstates{{17,18,19,20}}
    \def\hashedstates{{6,10,13,26}}
    \def\bicolorstates{{15,16}}
    \def\tricolorstates{{7,8}}
    \def\quadcolorstates{{2,3,4}}

\node[state,initial,fourcolorfill={cyanfill}{redfill}{greenfill}{blue!50}](q1){$q^{1}$};
\foreach \e in \statedef
{\edef\mye{{\e}}
\pgfmathsetmacro{\myx}{\mye[0]}
\pgfmathsetmacro{\myy}{\mye[1]}
\pgfmathsetmacro{\myfirstind}{\mye[2]}
\pgfmathsetmacro{\mystartind}{int(\mye[2]+1)}
\pgfmathsetmacro{\mylastind}{\mye[3]}
\node [state, colorfill/.expanded={\myfirstind}{\gstates}{\rstates}{\bstates}{\cstates}{\hashedstates}{\quadcolorstates}{\tricolorstates}{\bicolorstates}] at (\myx,\myy) (q\myfirstind){$q^{\myfirstind}$};
\foreach \a[evaluate=\a as \b using int(\a-1)] in {\mystartind,...,\mylastind}{
\node[state, right of=q\b, colorfill/.expanded={\a}{\gstates}{\rstates}{\bstates}{\cstates}{\hashedstates}{\quadcolorstates}{\tricolorstates}{\bicolorstates}] (q\a){$q^{\a}$};
}
}

\foreach \r in \straightsolidedge
{\edef\myr{{\r}}
\pgfmathsetmacro{\mystartstate}{\myr[0]}
\pgfmathsetmacro{\myendstate}{\myr[1]-1}
\foreach \d[evaluate=\d as \e using int(\d+1)] in {\mystartstate,...,\myendstate}{
\draw (q\d) edge (q\e);
}
}

\foreach \t in \bendrightsolidedge
{\edef\myt{{\t}}
\pgfmathsetmacro{\f}{\myt[0]}
\pgfmathsetmacro{\g}{\myt[1]}
\draw (q\f) edge[bend right] (q\g);
}

\foreach \u in \bendleftsolidedge
{\edef\myu{{\u}}
\pgfmathsetmacro{\h}{\myu[0]}
\pgfmathsetmacro{\i}{\myu[1]}
\draw (q\h) edge[bend left] (q\i);
}

\draw (q4) edge[bend left] node [below left]{} (q11);
    \end{tikzpicture}
    \end{adjustbox}
\end{figure*}
\end{document}

Además, a continuación se muestra el contenido del automaton.txt.

2,0,2,5
2,2,6,8
2,-2,9,11

Respuesta1

Usando lualatex. Admito que mi enfoque no es muy elegante :P.

\documentclass{scrartcl}

\usepackage{luacode}
\usepackage{pgffor}

\begin{filecontents*}{data.txt}
2,0,2,6
2,2,6,8
2,-2,9,11
\end{filecontents*}

\begin{document}

\begin{luacode}
    function read_file(file,macro)
        f = io.open(file, "r")
        concat_string = ""
        i = 1
        for line in io.lines(file) do
            concat_string = concat_string .. "{" .. line .. "},"
            i = i + 1
        end
        -- remove trailing ","
        concat_string = concat_string:sub(1,-2)
        tex.sprint("\\def" .. "\\" .. macro .. "{" .. concat_string .. "}")
    end
\end{luacode}
    
\directlua{read_file("data.txt", "statedef")}
\noindent
\foreach \s [count=\i from 1] in \statedef{%
    State \i{} entries:
    \foreach \se in \s {%
        \se~
    }
    \\
}
    
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Probablemente le resulte útil algún bucle anidado para iterar en filas y columnas de la matriz. Decidí usar la sintaxis expl3 para el siguiente MWE porque expl3 trae consigo \cs_to_str:Nuna rutina que entrega de manera confiable el nombre de un token de secuencia de control:

\begin{filecontents*}{MYRENAMEDautomaton.txt}
2,0,2,5
2,2,6,8
2,-2,9,11
1\TeX1,2\TeX2,3\TeX3,4\TeX4
\end{filecontents*}

\documentclass{article}

\usepackage{readarray}

\ExplSyntaxOn
\cs_new:Npn \TwoDArrayToMacro #1#2 {
  \group_begin:
  \nocheckbounds
  \Mostafa_TwoDArrayToMacroLoop:nnnnnnnn {#1}{#2}{1}{1}{}{}{}{}
}
\cs_new:Npn \Mostafa_TwoDArrayToMacroLoop:nnnnnnnn #1#2#3#4#5#6#7#8 {
   %  #1 array 
   %  #2 macro
   %  #3 row number
   %  #4 column number
   %  #5 row separator
   %  #6 column separator
   %  #7 rows gathered
   %  #8 colum in construction
   \int_compare:nNnTF {#3}>{\use:c{\cs_to_str:N #1ROWS}}
   {\group_end: \cs_set:Npn #2{#7}}{
     \int_compare:nNnTF {#4}>{\use:c{\cs_to_str:N #1COLS}}
       {
         \exp_after:wN \use_ii_i:nn \exp_after:wN {
           \exp_after:wN {
             \exp:w\exp_after:wN\exp_after:wN\exp_after:wN\exp_end:
             \int_eval:n{(#3)+1}
           }
         }{\Mostafa_TwoDArrayToMacroLoop:nnnnnnnn{#1}{#2}}{1}{,}{}{#7#5{#8}}{}
       }
       {
         \exp_after:wN \use_ii_i:nn \exp_after:wN {\exp_after:wN { 
           \exp:w \Mostafa_exp_args_otimes:nNn{4} \use_ii_i:nn {#1[#3,#4]}{\exp_end: #8#6}
         }}
         {
           \exp_after:wN \use_ii_i:nn \exp_after:wN {
             \exp_after:wN {
               \exp:w\exp_after:wN\exp_after:wN\exp_after:wN\exp_end:
               \int_eval:n{(#4)+1}
             }
           }{\Mostafa_TwoDArrayToMacroLoop:nnnnnnnn{#1}{#2}{#3}}{#5}{,}{#7}
         }
       }
   }
}
\cs_new:Npn \Mostafa_exp_args_otimes:nNn #1#2#3 {
  \exp_after:wN\use_ii_i:nn\exp_after:wN{\exp_after:wN{\exp:w 
  \exp_after:wN \__Mostafa_exp_args_otimes:nn\exp_after:wN {\exp_after:wN}
  \tex_romannumeral:D \int_eval:n {(#1)*1000}~d #3}}{#2}
}
\cs_new:Npn \__Mostafa_exp_args_otimes:nn #1#2 {
  \__Mostafa_exp_args_otimes:n {#2}{#1\exp_end:}{\__Mostafa_exp_args_otimes:nn{#1#1\exp_after:wN}}
}
\cs_new:Npn \__Mostafa_exp_args_otimes:n #1 {
  \__Mostafa_exp_args_otimes:wnw #1{\use_i:nn}d{\use_ii:nn}dd
}
\cs_new:Npn \__Mostafa_exp_args_otimes:wnw #1d#2#3dd{#2}
\ExplSyntaxOff


\begin{document}

\readarraysepchar{,}
\readdef{MYRENAMEDautomaton.txt}{\mydata}
\readarray\mydata\datacell[-,\ncols]
\TwoDArrayToMacro{\datacell}{\statedef}

\ttfamily\selectfont \frenchspacing

\noindent
\verb|\statedef|=\\
\meaning\statedef

\end{document}

ingrese la descripción de la imagen aquí

información relacionada