将 Tikz 节点的大小写入文件

将 Tikz 节点的大小写入文件

我编写了一个程序来排版 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).

和分别144节点的宽度和高度。

显然,这些命令后来被包装成宏来生成完整的rectangle(...).项目列表。

答案1

使用\the而不是\showthe

\showthe命令将在日志文件和终端上显示产生的标记\the。 - 摘自“按主题划分的 TeX”

编辑:

您可以使用append after commandlet(来自calcTikZ 库)和\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}

相关内容