使用宏来包含 tikz 图形

使用宏来包含 tikz 图形

我没有遇到任何问题,但我需要社区的意见。

我正在写一篇论文,里面有很多 tikz 图形。所以我要做的是将这些 tikz 文件预编译为 PDF,然后将它们包含在论文中。这使得论文的重新编译速度更快,因为当我对文本进行微小修改时,我不再需要一次又一次地编译 tikz 文件。

我已经编写了一个宏来包含如下图形 -

\newcommand\myIncludeGraphics[2]{
\ifdefined\embedTikzGraphics
    \scalebox{#1}{\input{#2.tikz}}
\else
    \includegraphics[scale=#1]{#2}
\fi
}

我还附上了如下的图表——

\begin{figure}
    \myIncludeGraphics{0.9}{chapters/chap1/Figures/fig1}
\end{figure}

这里的 0.9 指定了图形的缩放比例。但是,有时我想将两个图形并排放置,那么我需要手动计算缩放比例。

\subfloat[CAP1]{\label{fig:lab1a}{\resizebox{0.5\columnwidth}{!}{\includegraphics{chapters/chap1/Figures/fig1a}}}}
\subfloat[CAP2]{\label{fig:lab1b}{\resizebox{0.5\columnwidth}{!}{\includegraphics{chapters/chap1/Figures/fig1b}}}}

这将帮助我将两个图形精确地适合文档的列宽。但是,我失去了嵌入 tikz 文件的功能。

我想要一些建议,看看我是否可以在一个宏中涵盖所有三种情况,同时保持代码整洁。我应该能够使用scaling factorwidth=\columnwidth

如果这不可能,那也没关系。如果我没有正确定义问题,请原谅。

谢谢

更新

总结一下我想要实现的目标如下。

  • 我应该能够使用集成在主 pdf 中的 tikz 图片或单独编译然后使用 includegraphics 包含在 pdf 中的 tikz 图片。
  • 当使用 includegraphics 时,我应该能够指定width图形或scale factor图形。
  • 当使用主 pdf 中集成的 tikz 图片时,我不会更改我的 tex 中的宏。例如,宏用法将看起来像myIncludeGraphics{scalefactor=0.9}{chapters/chap1/Figures/fig1}myIncludeGraphics{figWidth=0.5\columnwidth}{chapters/chap1/Figures/fig1}。根据第一个参数,宏应该使用scaleboxresizebox。这是因为scalebox不理解0.5\columnwidth,而反过来resizebox

答案1

保持宏界面清洁的一个可能解决方案是使用 key-val 参数pgfkeys

\documentclass{article}
\usepackage{tikz}


\newcommand\myIncludeGraphics[2][]{
\ifdefined\embedTikzGraphics
    \pgfkeys{
        my include/.cd,
        scale/.store in=\myScaleFactor,
        scale=1,
        width/.initial=0,
        % define here similarly the graphicx keys you want to support
        #1
    }
    \scalebox{\myScaleFactor}{\input{#2.tikz}}
\else
    \includegraphics[#1]{#2}
\fi
}

\begin{document}

\myIncludeGraphics{tikzdrawing}
\myIncludeGraphics[scale=0.1]{tikzdrawing}
\myIncludeGraphics[width=.5\columnwidth]{tikzdrawing}

\end{document}

在这里,您可以将任何接受的参数传递给宏,graphix但是当\embedTikzGraphics定义时,您将使用它们进行解析pgfkeys,提取比例因子并直接使用它。

更新:另一个选择是使用adjustbox

\usepackage{adjustbox}

\newcommand\myIncludeGraphics[2][]{
\ifdefined\embedTikzGraphics
    \begin{adjustbox}{#1}
        \input{#2.tikz}
    \end{adjustbox}
\else
    \includegraphics[#1]{#2}
\fi
}

答案2

正如我已经评论过的,缩放不考虑 TikZ 代码中的宽度、大小等。它只是缩放结果。 和tikzscale您可以只缩放坐标,并让所有内容按照最初的预期进行绘制(这与[scale = X]的选项内部的操作相同tikzpicture)。

\documentclass{scrartcl}

\usepackage{tikz}
\usepackage{tikzscale}

\begin{filecontents}{fig.tikz}
    \begin{tikzpicture}[y=.1cm] %
        \draw[ultra thick] (0,0) circle (1);
        \draw[red] (0,0) node {$A$};
        \draw[color=blue] (0,0) rectangle (1,1);
    \end{tikzpicture}
\end{filecontents}


\begin{document}

Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
\begin{center}
    \resizebox{.5\textwidth}{!}{\input{fig.tikz}}%
    \includegraphics[width=.5\linewidth]{fig.tikz}
\end{center}
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.

\end{document}

给你

在此处输入图片描述

我显然更喜欢正确的那个。

因此,我提出的解决方案是,使用tikzscalewith\includegraphics并且仅使用widthor height。当然,可以添加选项scale,但由于该图已经写在文件中,因此它将与左侧的图像相同,我认为这是不正确的。

相关内容