我有一个名为 的文件assocFile.dat
。该文件的格式如下:
0/b
1/天
2/楼
3/小时
我想用这个文件来绘制节点(但是如果可以以通用的方式回答这个问题而不必担心行中的值的数量,那就太好了)。
\foreach\a/\b in {??} {
\draw (\a,0) node{\b};
}
有没有办法打开文件并使用其内容处理 tikz 命令?
编辑:该.tex
文件还写入文件:
我定义了以下宏:
\newcommand{\writeToAssoc}[1]\newcommand{\writeToFile}{\immediate\write\assocfile{\arabic{assocCounter}/#1}\refstepcounter{assocCounter}}
后(!)编写 TikZ 代码时我有以下命令序列:
\newwrite\assocfile
\immediate\openout\assocfile=assocFile.dat
\writeToAssoc{b}
\writeToAssoc{d}
\writeToAssoc{f}
\writeToAssoc{h}
\immediate\closeout\assocfile
答案1
您可以使用catchfile
:该命令\CatchFileDef
将其第一个参数定义为扩展为作为第三个参数给出的文件的内容;第三个参数用于应用一些设置,这里我们告诉 TeX 将行尾字符更改为逗号;接下来我们必须以合适的形式将数据传递给 TikZ,因此我们定义\tempb
扩展为的序言\foreach
并在括号中扩展\tempa
。
\documentclass{article}
\usepackage{catchfile,tikz}
\begin{document}
\begin{tikzpicture}
\CatchFileDef{\tempa}{assocFile.dat}{\endlinechar=`,}
\edef\tempb{\unexpanded{\foreach\a/\b in }{\unexpanded\expandafter{\tempa}}}
\tempb { \draw (\a,0) node{\b}; }
\end{tikzpicture}
\end{document}
(注意:在您的示例中添加的\unexpanded
周围内容\tempa
无关紧要,但如果该\b
部分具有任意内容,则可能是必要的。)
例子
\begin{filecontents*}{assocFile.dat}
1/-1-
2/-2-
3/-3-
4/-4-
\end{filecontents*}
\documentclass{article}
\usepackage{catchfile,tikz}
\begin{document}
\begin{tikzpicture}
\CatchFileDef{\tempa}{assocFile.dat}{\endlinechar=`,}
\edef\tempb{\unexpanded{\foreach\a/\b in }{\unexpanded\expandafter{\tempa}}}
\tempb { \draw (\a,\a) node{\b}; }
\end{tikzpicture}
\end{document}
答案2
您可以将数据文件读入pgfplotstable
,然后使用以下命令循环遍历各行\pgfplotstableforeachcolumnelement
:
\documentclass{article}
\usepackage{pgfplotstable}
\begin{filecontents}{assocFile.dat}
0/b
1/d
2/f
3/h
\end{filecontents}
\pgfplotstableread[header=false,white space chars=/]{assocFile.dat}\datatable
\begin{document}
\begin{tikzpicture}
\pgfplotstableforeachcolumnelement{[index]0}\of\datatable\as\cell{
\pgfplotstablegetelem{\pgfplotstablerow}{[index]1}\of\datatable
\node at (\cell,0) {\pgfplotsretval};
}
\end{tikzpicture}
\end{document}