我想结合我的两篇帖子来获取 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}