编辑

编辑

如何防止 的定义.pic在排版输出中添加额外的空格,其中 是在文档主体.pic中定义的\tikzset{},而不是在序言中或环境中定义的tikzpicture

以下是 MWE:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{make me/.pic={\node{#1};}}%
\begin{tikzpicture}
  \node {a};
  \draw (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}
\end{document}

不需要的空间

稍微少一点的 M WE 表明标准类也添加了额外的空间。

\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}
\parindent=0pt
\begin{document}
x%
\begin{tikzpicture}
  \node {a};
  \draw (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}

x\tikzset{make me/.pic={\node{#1};}}%
\begin{tikzpicture}
  \node {a};
  \draw (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}
\end{document}

标准类中不需要的空间

我希望该\tikzset{}行不会对排版输出产生任何影响。就我而言,它只是定义一些东西。只有当该东西实际被使用时,它才会影响输出。否则,它只会稍微增加编译时间。

.pic请注意,我知道可以通过在序言中或环境内部定义来避免这种情况tikzpicture。我特别需要防止在.pic定义在document但在外部时发生这种情况tikzpicture。本文的其余部分只是简要解释为什么我想这样做。

我经常想说这样的话

\documentclass{standalone}
\begin{document}
\input{img-group-common}%
\begin{tikzpicture}
  ...
\end{tikzpicture}
\end{document}

我无法将其放在\input序言中,因为图片将包含在standalone包中,因此序言中的所有内容将被忽略。

我不想将 包含\input在主文档的序言中,因为我想将设置保留在img-group-common一组密切相关的图像中。通常,这些是具有共同结构或需要共同元素的图片。

通常,所有img-group.common.tex都是\tikzset{...}。问题是,如果\tikzset{...}定义了pic,则会在 排版输出 之前添加一个空格tikzpicture

答案1

第 4636-4640 行.pic的定义如下tikz.code.tex

\pgfkeysdef{/handlers/.pic}{%
  \edef\pgf@temp{\pgfkeyscurrentpath}%
  \edef\pgf@temp{\expandafter\tikz@smuggle@pics@in\pgf@temp\pgf@stop}%
  \expandafter\pgfkeys\expandafter{\pgf@temp/.style={code={#1}}}
}

作者%在第 4639 行末尾漏掉了 a。


我在这里将其报告为一个错误:https://sourceforge.net/p/pgf/bugs/426/

答案2

如果对任何人都有用,这里有一个补充符号 1 的答案tex/latex/tikz-pic-fix/tikz-pic-fix.sty

\ProvidesPackage{tikz-pic-fix}[fix pic handler to eliminate spurious space]
\RequirePackage{tikz}
% ateb Symbol 1: https://tex.stackexchange.com/a/368531/
\pgfkeysdef{/handlers/.pic}{% tikz.code.tex: llinellau 4636-4640
  \edef\pgf@temp{\pgfkeyscurrentpath}%
  \edef\pgf@temp{\expandafter\tikz@smuggle@pics@in\pgf@temp\pgf@stop}%
  \expandafter\pgfkeys\expandafter{\pgf@temp/.style={code={#1}}}% collir % yn y côd gwreiddiol
}

\endinput

这样做的好处是,您可以轻松删除修补代码或在必要时进行更改,然后任何使用文档都tikz-pic-fix只会加载标准tikz,您不必搜索它们来更改修复的每个应用程序。

编辑

或者 TiZ 库,如果您忘记了对代码做了什么......

\ProvidesFile{tikzlibrarypicfix.code.tex}
\pgfkeysdef{/handlers/.pic}{% ateb Symbol 1: https://tex.stackexchange.com/a/368531/
  \edef\pgf@temp{\pgfkeyscurrentpath}%
  \edef\pgf@temp{\expandafter\tikz@smuggle@pics@in\pgf@temp\pgf@stop}%
  \expandafter\pgfkeys\expandafter{\pgf@temp/.style={code={#1}}}%
}
\endinput

相关内容