使用 LaTeX3 设置 tikzpicture 的高度

使用 LaTeX3 设置 tikzpicture 的高度

这是如何指定 tikz 绘图尺寸而不缩放它。那里给出的建议有效,但图片仍然没有固定大小。在某种程度上,高度取决于图形的加载方式。我怀疑问题与 TikZ 无关,问题在于环境的定义。

下面的 MWE 定义了intfig环境,它采用文件名(不带后缀.tikz)和图形应具有的高度。在 MWE 中,环境的主体被忽略。环境被定义为查找给定的文件.tikz。如果文件存在,则加载该文件;如果不存在,则显示一个带有“不可用”消息的框。如果文件不存在且未加载,则图形有一个高度;如果文件可用,则图形似乎比预期高一行文本。

\documentclass[10pt]{article}

\ExplSyntaxOn

\str_new:N \l_intfig_figname_str
\dim_new:N \l_intfig_height_dim

\cs_generate_variant:Nn \file_if_exist:nTF {V}
\cs_generate_variant:Nn \file_input:n {V}

\NewDocumentEnvironment{intfig} { > { \SplitArgument { 1 } { , } } m!o }
{
  \group_begin:
  \intfig_manargs #1
}{
  % Post environment commands.

  \str_set_eq:NN \l_intfig_tikzfile_str \l_intfig_figname_str
  \str_put_right:Nn \l_intfig_tikzfile_str { .tikz }
  
  \file_if_exist:VTF \l_intfig_tikzfile_str {
    \file_input:V \l_intfig_tikzfile_str }
  {
    \begin{tikzpicture}
      \useasboundingbox (0pt,0pt) rectangle (\textwidth,\l_intfig_height_dim);
      \draw[dashed] (0pt,0pt) rectangle ( \textwidth,\l_intfig_height_dim);
      \node at (\textwidth / 2,\l_intfig_height_dim / 2) {The\ drawing\ is\ not\ available\ to\ load.};
      \draw (5pt,5pt) rectangle ( \textwidth - 5,\l_intfig_height_dim - 5);
    \end{tikzpicture}
  }

  \group_end:  
}

\NewDocumentCommand{\intfig_manargs}{ m m }
{
  \str_set:Nn \l_intfig_figname_str { #1 }
  \dim_set:Nn \l_intfig_height_dim { #2 }
}

\ExplSyntaxOff

\usepackage{tikz}

\begin{document}

Random text to fill out the page. Random text to fill out the page.
Random text to fill out the page. Random text to fill out the page.
Random text to fill out the page. Random text to fill out the page.
Random text to fill out the page. Random text to fill out the page.
Random text to fill out the page. Random text to fill out the page.

\begin{intfig}{bezier,200bp}
\end{intfig}

Some text after the figure. Some text after the figure. Some text
after the figure. Some text after the figure. Some text after the
figure. Some text after the figure. Some text after the figure. Some
text after the figure. Some text after the figure. Some text after the
figure. Some text after the figure. Some text after the figure.

\end{document}

在没有可用文件的情况下编译上述代码bezier.tikz,您将得到一个尺寸相同的图形。现在再次编译它,将下面的文本另存为,bezier.tikz您将得到正确的图形,但图形比预期的要高。

\begin{tikzpicture}[yscale=-1]
\useasboundingbox (0bp,0bp) rectangle (343.71109bp,200bp);
\draw[line width=4bp] (63.56039999999999bp, 27.39158999999995bp) -- (23.560399999999987bp, 57.39158999999995bp) -- (96.56039999999999bp, 121.39158999999995bp) -- (199.5604bp, 79.39158999999995bp) ;
\draw[line width=4bp] (63.56039999999999bp, 27.39158999999995bp) .. controls (23.560399999999987bp, 57.39158999999995bp) and (96.56039999999999bp, 121.39158999999995bp) .. (199.5604bp, 79.39158999999995bp);
\fill (63.56039999999999bp,27.39158999999995bp) ellipse [x radius=3bp,y radius =3bp];
\fill (23.560399999999987bp,57.39158999999995bp) ellipse [x radius=3bp,y radius =3bp];
\fill (96.56039999999999bp,121.39158999999995bp) ellipse [x radius=3bp,y radius =3bp];
\fill (199.5604bp,79.39158999999995bp) ellipse [x radius=3bp,y radius =3bp];
\end{tikzpicture}

图形的任何部分都不会超出边界框,并且在两种情况下(存在或不存在 tikz 文件)都使用相同的边界框。是的, 等于\textwidth = 345 pt343.711 bp尽管我看不出宽度会有什么影响。

如果完全消除环境,并将\begin{intfig} \end{intfig}其替换为“不可用”的图形或的内容bezier.tikz,则这两个图形在页面上占用的空间完全相同,正如预期的那样。

相关内容