我编写了一个程序来排版 Tikz 图片中的元素。通常,这些项目的位置不正确。为了解决这个问题,我考虑运行一个两阶段编译器:第一次使用 Tikz 渲染节点,然后方面(宽度和高度)进行测量。结果被写入文件,并且约束逻辑编程求解器(蚀) 旨在为节点找到更好的方向。使用不同的方法,将大小写入文件仍然不起作用:
最小工作示例(MWE):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit,patterns,snakes,calc,decorations,decorations.text,positioning,decorations.pathreplacing,matrix,arrows,automata}
%measure script
\makeatletter
\newcommand\nodedim[1]{
\pgfextractx{\nwdt}{\pgfpointanchor{#1}{east}}%
\pgfextractx{\pgf@xa}{\pgfpointanchor{#1}{west}}% \pgf@xa is a length defined by PGF for temporary storage. No need to create a new temporary length.
\addtolength{\nwdt}{-\pgf@xa}%
\pgfextracty{\nhgt}{\pgfpointanchor{#1}{south}}%
\pgfextracty{\pgf@xa}{\pgfpointanchor{#1}{north}}% \pgf@xa is a length defined by PGF for temporary storage. No need to create a new temporary length.
\addtolength{\nhgt}{-\pgf@xa}%
}
\makeatother
\newlength\nwdt
\newlength\nhgt
\begin{document}
%open the file
\newwrite\specfile
\immediate\openout\specfile=spec.pl
%draw node
\begin{tikzpicture}
\node (foo) at (0,0) {This is a test node};
%now measure the node
\nodedim{foo}
\immediate\write\specfile{rectangle(\showthe\nwdt,\showthe\nhgt).}
\end{tikzpicture}
%close the file
\immediate\closeout\specfile
\end{document}
目的是spec.pl
应该显示例如:
rectangle(14,4).
和分别14
是4
节点的宽度和高度。
显然,这些命令后来被包装成宏来生成完整的rectangle(...).
项目列表。
答案1
使用\the
而不是\showthe
。
该
\showthe
命令将在日志文件和终端上显示产生的标记\the
。 - 摘自“按主题划分的 TeX”
编辑:
您可以使用append after command
、let
(来自calc
TikZ 库)和\pgfmathsetmacro
来简化代码并选择单位:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
write dim/.style={
append after command={
let \p1=(\tikzlastnode.south west), \p2=(\tikzlastnode.north east) in
\pgfextra{
\pgfmathsetmacro\myw{(\x2-\x1)/1cm}
\pgfmathsetmacro\myh{(\y2-\y1)/1cm}
\immediate\write\specfile{rectangle(\myw,\myh)}
}
},
}
}
\begin{document}
%open the file
\newwrite\specfile
\immediate\openout\specfile=spec.pl
\begin{tikzpicture}
\node[write dim] (foo) at (0,0) {This is a test node};
\end{tikzpicture}
%close the file
\immediate\closeout\specfile
\end{document}