从同一数据源获取表格数据和 TiKz 标签

从同一数据源获取表格数据和 TiKz 标签

我想结合我的两篇帖子来获取 TikZ 中我的电气安装计划的运行示例。

帖子中,我得到了如何创建固定长度的字母数字字符串的答案。

帖子中,我得到了如何从一个数据列表中获取动态表和 TikZ 输入的答案。

现在我想合并两个主题,并将生成的字母数字字符串放入我的单个数据列表中。从那里开始,动态表中的 \hash 应该与用作我的 TikZ 标签的哈希值相同。

平均能量损失

\documentclass{article}
\usepackage[a4paper, margin=10mm]{geometry}
\usepackage{pgfplotstable}
\usepackage{mwe}
\pgfplotsset{compat=newest}

\ExplSyntaxOn
\sys_gset_rand_seed:n {0}
\NewExpandableDocumentCommand{\hash}{}
 {
  \__new_hash_three:e { \int_to_Base:nn { \int_rand:n { 46655 } } { 36 } } % three digits
 }
\cs_new:Nn \__new_hash_three:n
 {
  \prg_replicate:nn { 3 - \tl_count:n { #1 } } { 0 } #1
 }
\cs_generate_variant:Nn \__new_hash_three:n { e }
\ExplSyntaxOff

\begin{filecontents}{data.csv}
id, name, x-coord, y-coord, rotation
\hash, PowerSupply1, 3590, 2000, 270 %The \hash function seems to be called twice
\hash, PowerSupply2, 5590, 2500, 270
\end{filecontents}

\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1} 

\tikzset{
    pics/PowerSupply/.style={
        code={
            \tikzset{PowerSupply/.cd, #1}
            \node[anchor=north, inner sep=0pt] (-p)
                {\includegraphics[scale=0.09]{example-image-a}};
            \node[
                inner sep=0pt,
                anchor={90+\pgfkeysvalueof{/tikz/PowerSupply/label position}},
                rotate={-1*\pgfkeysvalueof{/tikz/PowerSupply/label position}}
            ] at (-p.south) {\tiny \pgfkeysvalueof{/tikz/PowerSupply/label}};
        }
    },
    PowerSupply/label/.initial={},
    PowerSupply/label position/.initial={0}
}
\begin{document}

\begin{center}
\pgfplotstabletypeset[
    col sep=comma,
    columns={id, name, x-coord, y-coord},
    columns/id/.style={
        column name=ID,
        string type
    },
    columns/name/.style={
        column name=Description,
        string type
    },
    columns/x-coord/.style={
        column name=X-Pos
    },
    columns/y-coord/.style={
        column name=Y-Pos,
        column type/.add={}{|}
    },
    column type/.add={|}{},
    after row={\hline},
    every head row/.style={before row=\hline},
]{data.csv}
\end{center}

\begin{figure}[h!]
\centering
\begin{tikzpicture}[x=0.01mm, y=-0.01mm]
    \node[inner sep=0pt] (ground_floor)   
        {\includegraphics[width=99.0mm, height=107.4mm]{example-image}};
    
    \begin{scope}[shift=(ground_floor.north west)]
        \foreach \row in {0,...,\CSVDataRows} {
            \pgfplotstablegetelem{\row}{x-coord}\of{\csvdata}
            \pgfmathsetmacro{\x}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{y-coord}\of{\csvdata}
            \pgfmathsetmacro{\y}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{rotation}\of{\csvdata}
            \pgfmathsetmacro{\r}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{id}\of{\csvdata}
            \pgfmathsetmacro{\i}{"\pgfplotsretval"}
            \pic[rotate=\r, transform shape] at (\x,\y) {
                PowerSupply={
                    label={\i}, % This label is different to the label in the table
                    label position={\r}
                }
            };
        }
    \end{scope}
\end{tikzpicture}
\end{figure}
\end{document}

输出 例子

问题 如您所见,\hash文件内容数据列表中的“共享”在表格表示和 TikZ 标签中有所不同。我的假设是,该\hash函数被调用了两次...

答案1

您的代码中存在一个问题,即您在 CSV 文件中存储了字符串“ \hash”,而不是生成的哈希值。如果您查看 CSV 文件,您将找不到其中的任何哈希值。

当文件被读入时(实际上发生了两次),TeX 会遇到标记\hash并最终将其展开。由于这种展开首先发生在排版表格时,随后又发生在排版标签(= 节点)时,因此产生的哈希值并不相同。事实上,它的结果与你将\hash文档放入四次时的结果相同。

从您的评论中我了解到您不一定非要使用 CSV 文件。您只是想使用相同的数据两次。实际上,您可以将数据内联,而无需将其导出到 CSV。无论如何,您需要以某种方式确保在命令\hash用于排版表格或标签之前对其进行扩展,以便使用相同的标记列表(即扩展的字符串)。

在以下示例中,我使用\pgfplotstableread来内联读取数据。然后,我使用 向现有数据添加一个新列,\pgfplotstablecreatecol其中包含存储在该列中的标记列表的扩展id。在这种情况下,新列将包含扩展的哈希值。在下面的代码中,我使用来自这个新列的值。

\documentclass{article}
\usepackage[a4paper, margin=10mm]{geometry}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}

\ExplSyntaxOn
\sys_gset_rand_seed:n {0}
\NewExpandableDocumentCommand { \hash } { } {
    \__new_hash_three:e { \int_to_Base:nn { \int_rand:n { 46655 } } { 36 } } % three digits
}
\cs_new:Nn \__new_hash_three:n {
    \prg_replicate:nn { 3 - \tl_count:n { #1 } } { 0 } #1
}
\cs_generate_variant:Nn \__new_hash_three:n { e }
\ExplSyntaxOff

\pgfplotstableread{
    id name x-coord y-coord rotation
    \hash{} PowerSupply1 3590 2000 270 
    \hash{} PowerSupply2 5590 2500 270
}{\mydata}

\pgfplotstablecreatecol[
    create col/assign/.code={%
        \getthisrow{id}\idValue
        \edef\hashExp{\idValue}
        \pgfkeyslet{/pgfplots/table/create col/next content}\hashExp
    }
]{id-exp}{\mydata}

\pgfplotstablegetrowsof{\mydata}
\pgfmathtruncatemacro\myDataRows{\pgfplotsretval-1} 

\tikzset{
    pics/PowerSupply/.style={
        code={
            \tikzset{PowerSupply/.cd, #1}
            \node[anchor=north, inner sep=0pt] (-p)
                {\includegraphics[scale=0.09]{example-image-a}};
            \node[
                inner sep=0pt,
                anchor={90+\pgfkeysvalueof{/tikz/PowerSupply/label position}},
                rotate={-1*\pgfkeysvalueof{/tikz/PowerSupply/label position}}
            ] at (-p.south) {\tiny \pgfkeysvalueof{/tikz/PowerSupply/label}};
        }
    },
    PowerSupply/label/.initial={},
    PowerSupply/label position/.initial={0}
}
\begin{document}

\begin{center}
\pgfplotstabletypeset[
    col sep=comma,
    columns={id-exp, name, x-coord, y-coord},
    columns/id-exp/.style={
        column name=ID,
        string type
    },
    columns/name/.style={
        column name=Description,
        string type
    },
    columns/x-coord/.style={
        column name=X-Pos
    },
    columns/y-coord/.style={
        column name=Y-Pos,
        column type/.add={}{|}
    },
    column type/.add={|}{},
    after row={\hline},
    every head row/.style={before row=\hline},
]{\mydata}
\end{center}

\begin{figure}[h!]
\centering
\begin{tikzpicture}[x=0.01mm, y=-0.01mm]
    \node[inner sep=0pt] (ground_floor)   
        {\includegraphics[width=99.0mm, height=107.4mm]{example-image}};
    
    \begin{scope}[shift=(ground_floor.north west)]
        \foreach \row in {0,...,\myDataRows} {
            \pgfplotstablegetelem{\row}{x-coord}\of{\mydata}
            \pgfmathsetmacro{\x}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{y-coord}\of{\mydata}
            \pgfmathsetmacro{\y}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{rotation}\of{\mydata}
            \pgfmathsetmacro{\r}{\pgfplotsretval}
            \pgfplotstablegetelem{\row}{id-exp}\of{\mydata}
            \pgfmathsetmacro{\i}{"\pgfplotsretval"}
            \pic[rotate=\r, transform shape] at (\x,\y) {
                PowerSupply={
                    label={\i}, % This label is different to the label in the table
                    label position={\r}
                }
            };
        }
    \end{scope}
\end{tikzpicture}
\end{figure}
\end{document}

在此处输入图片描述

相关内容